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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }