libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 2399e68f28366c91a3d7093bb2c81c7d5818513f
parent 9e58928780f9fd78346bc50380fd72ea91ccc9ff
Author: Christian Grothoff <christian@grothoff.org>
Date:   Mon, 30 Jul 2012 13:05:17 +0000

add reference counting for shm and destroy them when they are finished

Diffstat:
Msrc/main/extractor.c | 1+
Msrc/main/extractor_ipc.h | 12++++++++++++
Msrc/main/extractor_ipc_gnu.c | 24+++++++++++++++++++++++-
Msrc/main/extractor_plugins.c | 8++++----
4 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/src/main/extractor.c b/src/main/extractor.c @@ -387,6 +387,7 @@ EXTRACTOR_extract (struct EXTRACTOR_PluginList *plugins, (EXTRACTOR_OPTION_IN_PROCESS == pos->flags) ) { pos->shm = shm; + (void) EXTRACTOR_IPC_shared_memory_change_rc_ (shm, 1); pos->channel = EXTRACTOR_IPC_channel_create_ (pos, shm); } diff --git 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); /** + * Change the reference counter for this shm instance. + * + * @param shm instance to update + * @param delta value to change RC by + * @return new RC + */ +unsigned int +EXTRACTOR_IPC_shared_memory_change_rc_ (struct EXTRACTOR_SharedMemory *shm, + int delta); + + +/** * Initialize shared memory area from data source. * * @param shm memory area to initialize diff --git a/src/main/extractor_ipc_gnu.c b/src/main/extractor_ipc_gnu.c @@ -66,6 +66,11 @@ struct EXTRACTOR_SharedMemory */ char shm_name[MAX_SHM_NAME + 1]; + /** + * Reference counter describing how many references share this SHM. + */ + unsigned int rc; + }; @@ -163,11 +168,28 @@ EXTRACTOR_IPC_shared_memory_create_ (size_t size) return NULL; } shm->shm_size = size; + shm->rc = 0; return shm; } /** + * Change the reference counter for this shm instance. + * + * @param shm instance to update + * @param delta value to change RC by + * @return new RC + */ +unsigned int +EXTRACTOR_IPC_shared_memory_change_rc_ (struct EXTRACTOR_SharedMemory *shm, + int delta) +{ + shm->rc += delta; + return shm->rc; +} + + +/** * Destroy shared memory area. * * @param shm memory area to destroy @@ -175,7 +197,7 @@ EXTRACTOR_IPC_shared_memory_create_ (size_t size) */ void EXTRACTOR_IPC_shared_memory_destroy_ (struct EXTRACTOR_SharedMemory *shm) -{ +{ munmap (shm->shm_ptr, shm->shm_size); (void) close (shm->shm_id); (void) shm_unlink (shm->shm_name); diff --git a/src/main/extractor_plugins.c b/src/main/extractor_plugins.c @@ -351,8 +351,8 @@ EXTRACTOR_plugin_add_config (struct EXTRACTOR_PluginList *prev, * @return the reduced list, unchanged if the plugin was not loaded */ struct EXTRACTOR_PluginList * -EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList * prev, - const char * library) +EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList *prev, + const char *library) { struct EXTRACTOR_PluginList *pos; struct EXTRACTOR_PluginList *first; @@ -381,8 +381,8 @@ EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList * prev, prev->next = pos->next; if (NULL != pos->channel) EXTRACTOR_IPC_channel_destroy_ (pos->channel); - // FIXME: need to also destroy pos->shm if this is - // the last user; need to add some RC to the SHM! + if (0 == EXTRACTOR_IPC_shared_memory_change_rc_ (pos->shm, -1)) + EXTRACTOR_IPC_shared_memory_destroy_ (pos->shm); free (pos->short_libname); free (pos->libname); free (pos->plugin_options);