diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/extractor.c | 1 | ||||
-rw-r--r-- | src/main/extractor_ipc.h | 12 | ||||
-rw-r--r-- | src/main/extractor_ipc_gnu.c | 24 | ||||
-rw-r--r-- | src/main/extractor_plugins.c | 8 |
4 files changed, 40 insertions, 5 deletions
diff --git a/src/main/extractor.c b/src/main/extractor.c index 126a539..bbe661c 100644 --- a/src/main/extractor.c +++ b/src/main/extractor.c | |||
@@ -387,6 +387,7 @@ EXTRACTOR_extract (struct EXTRACTOR_PluginList *plugins, | |||
387 | (EXTRACTOR_OPTION_IN_PROCESS == pos->flags) ) | 387 | (EXTRACTOR_OPTION_IN_PROCESS == pos->flags) ) |
388 | { | 388 | { |
389 | pos->shm = shm; | 389 | pos->shm = shm; |
390 | (void) EXTRACTOR_IPC_shared_memory_change_rc_ (shm, 1); | ||
390 | pos->channel = EXTRACTOR_IPC_channel_create_ (pos, | 391 | pos->channel = EXTRACTOR_IPC_channel_create_ (pos, |
391 | shm); | 392 | shm); |
392 | } | 393 | } |
diff --git a/src/main/extractor_ipc.h b/src/main/extractor_ipc.h index e1d2f37..d975b30 100644 --- a/src/main/extractor_ipc.h +++ b/src/main/extractor_ipc.h | |||
@@ -337,6 +337,18 @@ EXTRACTOR_IPC_shared_memory_destroy_ (struct EXTRACTOR_SharedMemory *shm); | |||
337 | 337 | ||
338 | 338 | ||
339 | /** | 339 | /** |
340 | * Change the reference counter for this shm instance. | ||
341 | * | ||
342 | * @param shm instance to update | ||
343 | * @param delta value to change RC by | ||
344 | * @return new RC | ||
345 | */ | ||
346 | unsigned int | ||
347 | EXTRACTOR_IPC_shared_memory_change_rc_ (struct EXTRACTOR_SharedMemory *shm, | ||
348 | int delta); | ||
349 | |||
350 | |||
351 | /** | ||
340 | * Initialize shared memory area from data source. | 352 | * Initialize shared memory area from data source. |
341 | * | 353 | * |
342 | * @param shm memory area to initialize | 354 | * @param shm memory area to initialize |
diff --git a/src/main/extractor_ipc_gnu.c b/src/main/extractor_ipc_gnu.c index b56cc40..68b6162 100644 --- a/src/main/extractor_ipc_gnu.c +++ b/src/main/extractor_ipc_gnu.c | |||
@@ -66,6 +66,11 @@ struct EXTRACTOR_SharedMemory | |||
66 | */ | 66 | */ |
67 | char shm_name[MAX_SHM_NAME + 1]; | 67 | char shm_name[MAX_SHM_NAME + 1]; |
68 | 68 | ||
69 | /** | ||
70 | * Reference counter describing how many references share this SHM. | ||
71 | */ | ||
72 | unsigned int rc; | ||
73 | |||
69 | }; | 74 | }; |
70 | 75 | ||
71 | 76 | ||
@@ -163,11 +168,28 @@ EXTRACTOR_IPC_shared_memory_create_ (size_t size) | |||
163 | return NULL; | 168 | return NULL; |
164 | } | 169 | } |
165 | shm->shm_size = size; | 170 | shm->shm_size = size; |
171 | shm->rc = 0; | ||
166 | return shm; | 172 | return shm; |
167 | } | 173 | } |
168 | 174 | ||
169 | 175 | ||
170 | /** | 176 | /** |
177 | * Change the reference counter for this shm instance. | ||
178 | * | ||
179 | * @param shm instance to update | ||
180 | * @param delta value to change RC by | ||
181 | * @return new RC | ||
182 | */ | ||
183 | unsigned int | ||
184 | EXTRACTOR_IPC_shared_memory_change_rc_ (struct EXTRACTOR_SharedMemory *shm, | ||
185 | int delta) | ||
186 | { | ||
187 | shm->rc += delta; | ||
188 | return shm->rc; | ||
189 | } | ||
190 | |||
191 | |||
192 | /** | ||
171 | * Destroy shared memory area. | 193 | * Destroy shared memory area. |
172 | * | 194 | * |
173 | * @param shm memory area to destroy | 195 | * @param shm memory area to destroy |
@@ -175,7 +197,7 @@ EXTRACTOR_IPC_shared_memory_create_ (size_t size) | |||
175 | */ | 197 | */ |
176 | void | 198 | void |
177 | EXTRACTOR_IPC_shared_memory_destroy_ (struct EXTRACTOR_SharedMemory *shm) | 199 | EXTRACTOR_IPC_shared_memory_destroy_ (struct EXTRACTOR_SharedMemory *shm) |
178 | { | 200 | { |
179 | munmap (shm->shm_ptr, shm->shm_size); | 201 | munmap (shm->shm_ptr, shm->shm_size); |
180 | (void) close (shm->shm_id); | 202 | (void) close (shm->shm_id); |
181 | (void) shm_unlink (shm->shm_name); | 203 | (void) shm_unlink (shm->shm_name); |
diff --git a/src/main/extractor_plugins.c b/src/main/extractor_plugins.c index 8ebd32c..9519298 100644 --- a/src/main/extractor_plugins.c +++ b/src/main/extractor_plugins.c | |||
@@ -351,8 +351,8 @@ EXTRACTOR_plugin_add_config (struct EXTRACTOR_PluginList *prev, | |||
351 | * @return the reduced list, unchanged if the plugin was not loaded | 351 | * @return the reduced list, unchanged if the plugin was not loaded |
352 | */ | 352 | */ |
353 | struct EXTRACTOR_PluginList * | 353 | struct EXTRACTOR_PluginList * |
354 | EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList * prev, | 354 | EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList *prev, |
355 | const char * library) | 355 | const char *library) |
356 | { | 356 | { |
357 | struct EXTRACTOR_PluginList *pos; | 357 | struct EXTRACTOR_PluginList *pos; |
358 | struct EXTRACTOR_PluginList *first; | 358 | struct EXTRACTOR_PluginList *first; |
@@ -381,8 +381,8 @@ EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList * prev, | |||
381 | prev->next = pos->next; | 381 | prev->next = pos->next; |
382 | if (NULL != pos->channel) | 382 | if (NULL != pos->channel) |
383 | EXTRACTOR_IPC_channel_destroy_ (pos->channel); | 383 | EXTRACTOR_IPC_channel_destroy_ (pos->channel); |
384 | // FIXME: need to also destroy pos->shm if this is | 384 | if (0 == EXTRACTOR_IPC_shared_memory_change_rc_ (pos->shm, -1)) |
385 | // the last user; need to add some RC to the SHM! | 385 | EXTRACTOR_IPC_shared_memory_destroy_ (pos->shm); |
386 | free (pos->short_libname); | 386 | free (pos->short_libname); |
387 | free (pos->libname); | 387 | free (pos->libname); |
388 | free (pos->plugin_options); | 388 | free (pos->plugin_options); |