Mercurial > dovecot > core-2.2
annotate src/lib/module-context.h @ 22955:812e5c961328
fts: Indexing virtual mailbox didn't always index the last mails
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 03 May 2018 18:33:00 +0300 |
parents | a097ef0a9d6d |
children |
rev | line source |
---|---|
6410
e4eb71ae8e96
Changed .h ifdef/defines to use <NAME>_H format.
Timo Sirainen <tss@iki.fi>
parents:
5477
diff
changeset
|
1 #ifndef MODULE_CONTEXT_H |
e4eb71ae8e96
Changed .h ifdef/defines to use <NAME>_H format.
Timo Sirainen <tss@iki.fi>
parents:
5477
diff
changeset
|
2 #define MODULE_CONTEXT_H |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 |
10644
5e2075b5b25f
module-context.h: Include required array.h internally.
Timo Sirainen <tss@iki.fi>
parents:
6416
diff
changeset
|
4 #include "array.h" |
5e2075b5b25f
module-context.h: Include required array.h internally.
Timo Sirainen <tss@iki.fi>
parents:
6416
diff
changeset
|
5 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 /* |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 This is a bit complex to use, but it prevents using wrong module IDs |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 in module_contexts arrays. |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 --------- |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 The main structure is implemented like this: |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 struct STRUCT_NAME_module_register { |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 unsigned int id; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 }; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 union STRUCT_NAME_module_context { |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct STRUCT_NAME_module_register *reg; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 // it's allowed to have some structure here so it won't waste space. |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 // for example: struct STRUCT_NAME_vfuncs super; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 }; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct STRUCT_NAME { |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
11529
diff
changeset
|
22 ARRAY(union STRUCT_NAME_module_context *) module_contexts; |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 }; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 extern struct STRUCT_NAME_module_register STRUCT_NAME_module_register; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 --------- |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 The usage in modules goes like: |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 static MODULE_CONTEXT_DEFINE(mymodule_STRUCT_NAME_module, |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 &STRUCT_NAME_module_register); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct mymodule_STRUCT_NAME { |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 union STRUCT_NAME_module_context module_ctx; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 // module-specific data |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 }; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 struct mymodule_STRUCT_NAME *ctx = i_new(...); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 MODULE_CONTEXT_SET(obj, mymodule_STRUCT_NAME_module, ctx); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 struct mymodule_STRUCT_NAME *ctx = |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 MODULE_CONTEXT(obj, mymodule_STRUCT_NAME_module); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 */ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 #define OBJ_REGISTER(obj) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 ((**(obj)->module_contexts.v)->reg) |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 #define OBJ_REGISTER_COMPATIBLE(obj, id_ctx) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE(OBJ_REGISTER(obj), (id_ctx).reg) |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 #define MODULE_CONTEXT(obj, id_ctx) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 (*((void **)array_idx_modifiable(&(obj)->module_contexts, \ |
11529
aec2a41abe4a
MODULE_CONTEXT() now avoids directly returning NULL to make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents:
11279
diff
changeset
|
50 module_get_context_id(&(id_ctx).id)) + \ |
aec2a41abe4a
MODULE_CONTEXT() now avoids directly returning NULL to make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents:
11279
diff
changeset
|
51 OBJ_REGISTER_COMPATIBLE(obj, id_ctx))) |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 #ifdef HAVE_TYPEOF |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 # define MODULE_CONTEXT_DEFINE(_name, _reg) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 struct _name { \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 struct module_context_id id; \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 typeof(_reg) reg; \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 } _name |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 # define MODULE_CONTEXT_INIT(_reg) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 { { &(_reg)->id, 0, FALSE }, NULL } |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 #else |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 # define MODULE_CONTEXT_DEFINE(_name, _reg) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 struct _name { \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 struct module_context_id id; \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 } _name |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 # define MODULE_CONTEXT_INIT(_reg) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 { { &(_reg)->id, 0, FALSE } } |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 #endif |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 #define MODULE_CONTEXT_DEFINE_INIT(_name, _reg) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 MODULE_CONTEXT_DEFINE(_name, _reg) = MODULE_CONTEXT_INIT(_reg) |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 struct module_context_id { |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 unsigned int *module_id_register; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 unsigned int module_id; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 bool module_id_set; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 }; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 static inline unsigned int module_get_context_id(struct module_context_id *id) |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 { |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 if (!id->module_id_set) { |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 id->module_id = *id->module_id_register; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 id->module_id_set = TRUE; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 *id->module_id_register += 1; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 } |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 return id->module_id; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 } |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 #define MODULE_CONTEXT_SET_FULL(obj, id_ctx, ctx, module_ctx) STMT_START { \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 void *_module_tmp = ctx + \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 COMPILE_ERROR_IF_TYPES_NOT_COMPATIBLE(module_ctx, \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 (**(obj)->module_contexts.v)) + \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 OBJ_REGISTER_COMPATIBLE(obj, id_ctx); \ |
6416
298e651e18de
Renamed _array_*() to array_*_i()
Timo Sirainen <tss@iki.fi>
parents:
6410
diff
changeset
|
94 array_idx_set_i(&(obj)->module_contexts.arr, \ |
5477 | 95 module_get_context_id(&(id_ctx).id), &_module_tmp); \ |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } STMT_END |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 #define MODULE_CONTEXT_SET(obj, id_ctx, context) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 MODULE_CONTEXT_SET_FULL(obj, id_ctx, context, &(context)->module_ctx) |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 #define MODULE_CONTEXT_SET_SELF(obj, id_ctx, context) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 MODULE_CONTEXT_SET_FULL(obj, id_ctx, context, context) |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 #define MODULE_CONTEXT_UNSET(obj, id_ctx) \ |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 array_idx_clear(&(obj)->module_contexts, (id_ctx).id.module_id) |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 #endif |