Mercurial > dovecot > core-2.2
annotate src/lib/hook-build.c @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | 538853d82926 |
children | cb108f786fb4 |
rev | line source |
---|---|
21656
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2009-2017 Dovecot authors, see the included COPYING file */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
2 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
4 #include "array.h" |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
5 #include "llist.h" |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
6 #include "hook-build.h" |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
7 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
8 struct hook_stack { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
9 struct hook_stack *prev, *next; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
10 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
11 /* Pointer to vfuncs struct. This assumes that a struct containing |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
12 function pointers equals to an array of function pointers. Not |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
13 ANSI-C, but should work in all OSes supported by Dovecot. Much |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
14 easier anyway than doing this work manually.. */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
15 void (**vfuncs)(); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
16 /* nonzero in the areas where vfuncs has been changed */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
17 void (**mask)(); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
18 }; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
19 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
20 struct hook_build_context { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
21 pool_t pool; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
22 /* size of the vfuncs struct */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
23 size_t size; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
24 /* number of function pointers in the struct */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
25 unsigned int count; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
26 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
27 struct hook_stack *head, *tail; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
28 }; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
29 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
30 static void hook_build_append(struct hook_build_context *ctx, void (**vfuncs)()) |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
31 { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
32 struct hook_stack *stack; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
33 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
34 stack = p_new(ctx->pool, struct hook_stack, 1); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
35 stack->vfuncs = vfuncs; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
36 stack->mask = p_malloc(ctx->pool, ctx->size); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
37 DLLIST2_APPEND(&ctx->head, &ctx->tail, stack); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
38 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
39 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
40 struct hook_build_context *hook_build_init(void (**vfuncs)(), size_t size) |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
41 { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
42 struct hook_build_context *ctx; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
43 pool_t pool; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
44 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
45 i_assert((size % sizeof(void (*)())) == 0); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
46 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
47 pool = pool_alloconly_create("hook build context", 2048); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
48 ctx = p_new(pool, struct hook_build_context, 1); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
49 ctx->pool = pool; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
50 ctx->size = size; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
51 ctx->count = size / sizeof(void (*)()); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
52 hook_build_append(ctx, vfuncs); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
53 return ctx; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
54 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
55 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
56 static void |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
57 hook_update_mask(struct hook_build_context *ctx, struct hook_stack *stack, |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
58 void (**vlast)()) |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
59 { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
60 unsigned int i; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
61 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
62 for (i = 0; i < ctx->count; i++) { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
63 if (stack->vfuncs[i] != vlast[i]) { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
64 i_assert(stack->vfuncs[i] != NULL); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
65 stack->mask[i] = stack->vfuncs[i]; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
66 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
67 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
68 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
69 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
70 static void |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
71 hook_copy_stack(struct hook_build_context *ctx, struct hook_stack *stack) |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
72 { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
73 unsigned int i; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
74 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
75 i_assert(stack->next != NULL); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
76 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
77 for (i = 0; i < ctx->count; i++) { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
78 if (stack->mask[i] == NULL) { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
79 stack->vfuncs[i] = stack->next->vfuncs[i]; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
80 stack->mask[i] = stack->next->mask[i]; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
81 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
82 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
83 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
84 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
85 void hook_build_update(struct hook_build_context *ctx, void *_vlast) |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
86 { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
87 void (**vlast)() = _vlast; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
88 struct hook_stack *stack; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
89 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
90 if (ctx->tail->vfuncs == vlast) { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
91 /* no vfuncs overridden */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
92 return; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
93 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
94 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
95 /* ctx->vfuncs_stack->vfuncs points to the root vfuncs, |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
96 ctx->vfuncs_stack->next->vfuncs points to the first super function |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
97 that is being called, and so on. |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
98 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
99 the previous plugin added its vfuncs to the stack tail. |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
100 vlast contains the previous plugin's super vfuncs, which is where |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
101 the next plugin should put its own vfuncs. |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
102 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
103 first we'll need to figure out what vfuncs the previous plugin |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
104 changed and update the mask */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
105 hook_update_mask(ctx, ctx->tail, vlast); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
106 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
107 /* now go up in the stack as long as the mask isn't set, |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
108 and update the vfuncs */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
109 for (stack = ctx->tail->prev; stack != NULL; stack = stack->prev) |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
110 hook_copy_stack(ctx, stack); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
111 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
112 /* add vlast to stack */ |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
113 hook_build_append(ctx, vlast); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
114 } |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
115 |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
116 void hook_build_deinit(struct hook_build_context **_ctx) |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
117 { |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
118 struct hook_build_context *ctx = *_ctx; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
119 *_ctx = NULL; |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
120 pool_unref(&ctx->pool); |
538853d82926
lib,lib-storage: Move hook building code to lib
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
121 } |