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:
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);