]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: refactor thread_execute
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Mon, 1 Oct 2018 16:38:34 +0000 (13:38 -0300)
committerRafael Zalamena <rzalamena@gmail.com>
Sun, 14 Oct 2018 13:07:28 +0000 (15:07 +0200)
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>
(cherry picked from commit c4345fbf71fcc7ef4b64d95979f252c613dd3ebf)

lib/thread.c

index f9ff16b7b3cd560b89642e944554f1e7ec88c441..b8a1d7388a8f81caf7f063855115537ac045e9ec 100644 (file)
@@ -1586,25 +1586,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);
 }