Skip to content
Snippets Groups Projects
Commit 6b753d12 authored by Moe Jette's avatar Moe Jette
Browse files

Fix memory leak: memory consumed by pthread within a plugin is not reaped.

parent 8988b593
No related branches found
No related tags found
No related merge requests found
...@@ -403,15 +403,20 @@ static void *_part_agent(void *args) ...@@ -403,15 +403,20 @@ static void *_part_agent(void *args)
{ {
bgl_update_t *bgl_update_ptr; bgl_update_t *bgl_update_ptr;
while (1) { /*
* Don't just exit when there is no work left. Creating
* pthreads from within a dynamically linked object (plugin)
* causes large memory leaks on some systems that seem
* unavoidable even from detached pthreads.
*/
while (!agent_fini) {
slurm_mutex_lock(&agent_cnt_mutex); slurm_mutex_lock(&agent_cnt_mutex);
bgl_update_ptr = list_dequeue(bgl_update_list); bgl_update_ptr = list_dequeue(bgl_update_list);
slurm_mutex_unlock(&agent_cnt_mutex);
if (!bgl_update_ptr) { if (!bgl_update_ptr) {
agent_cnt = 0; usleep(100000);
slurm_mutex_unlock(&agent_cnt_mutex); continue;
return NULL;
} }
slurm_mutex_unlock(&agent_cnt_mutex);
if (bgl_update_ptr->op == START_OP) if (bgl_update_ptr->op == START_OP)
_start_agent(bgl_update_ptr); _start_agent(bgl_update_ptr);
else if (bgl_update_ptr->op == TERM_OP) else if (bgl_update_ptr->op == TERM_OP)
...@@ -419,7 +424,11 @@ static void *_part_agent(void *args) ...@@ -419,7 +424,11 @@ static void *_part_agent(void *args)
else if (bgl_update_ptr->op == SYNC_OP) else if (bgl_update_ptr->op == SYNC_OP)
_sync_agent(bgl_update_ptr); _sync_agent(bgl_update_ptr);
_bgl_list_del(bgl_update_ptr); _bgl_list_del(bgl_update_ptr);
} }
slurm_mutex_lock(&agent_cnt_mutex);
agent_cnt = 0;
slurm_mutex_unlock(&agent_cnt_mutex);
return NULL;
} }
/* Perform an operation upon a BGL partition (block) for starting or /* Perform an operation upon a BGL partition (block) for starting or
...@@ -443,7 +452,6 @@ static void _part_op(bgl_update_t *bgl_update_ptr) ...@@ -443,7 +452,6 @@ static void _part_op(bgl_update_t *bgl_update_ptr)
} }
agent_cnt = 1; agent_cnt = 1;
slurm_mutex_unlock(&agent_cnt_mutex); slurm_mutex_unlock(&agent_cnt_mutex);
/* spawn an agent */ /* spawn an agent */
slurm_attr_init(&attr_agent); slurm_attr_init(&attr_agent);
if (pthread_attr_setdetachstate(&attr_agent, PTHREAD_CREATE_JOINABLE)) if (pthread_attr_setdetachstate(&attr_agent, PTHREAD_CREATE_JOINABLE))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment