]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: refactor thread_execute 3087/head
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Mon, 1 Oct 2018 16:38:34 +0000 (13:38 -0300)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Wed, 3 Oct 2018 19:32:11 +0000 (16:32 -0300)
Don't allocate threads in the stack, but use the standardized
`thread_get` and `thread_add_unused` to avoid creating corner cases in
the thread API.

This fixes a thread mutex memory leak in FreeBSD.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
lib/thread.c

index e811bf88c815539b9f6536c212acd6c91dfd4600..f5db6f24210fa9d2e4f91e8567348533aa1bb2bd 100644 (file)
@@ -1648,25 +1648,27 @@ void funcname_thread_execute(struct thread_master *m,
                             int (*func)(struct thread *), void *arg, int val,
                             debugargdef)
 {
-       struct cpu_thread_history tmp;
-       struct thread dummy;
-
-       memset(&dummy, 0, sizeof(struct thread));
+       struct thread *thread;
 
-       pthread_mutex_init(&dummy.mtx, NULL);
-       dummy.type = THREAD_EVENT;
-       dummy.add_type = THREAD_EXECUTE;
-       dummy.master = NULL;
-       dummy.arg = arg;
-       dummy.u.val = val;
+       /* Get or allocate new thread to execute. */
+       pthread_mutex_lock(&m->mtx);
+       {
+               thread = thread_get(m, THREAD_EVENT, func, arg, debugargpass);
 
-       tmp.func = dummy.func = func;
-       tmp.funcname = dummy.funcname = funcname;
-       dummy.hist = hash_get(m->cpu_record, &tmp,
-                             (void *(*)(void *))cpu_record_hash_alloc);
+               /* Set its event value. */
+               pthread_mutex_lock(&thread->mtx);
+               {
+                       thread->add_type = THREAD_EXECUTE;
+                       thread->u.val = val;
+                       thread->ref = &thread;
+               }
+               pthread_mutex_unlock(&thread->mtx);
+       }
+       pthread_mutex_unlock(&m->mtx);
 
-       dummy.schedfrom = schedfrom;
-       dummy.schedfrom_line = fromln;
+       /* Execute thread doing all accounting. */
+       thread_call(thread);
 
-       thread_call(&dummy);
+       /* Give back or free thread. */
+       thread_add_unuse(m, thread);
 }