pthreadpool: Move creating of thread to new function
authorChristof Schmitt <cs@samba.org>
Tue, 28 Nov 2017 17:49:36 +0000 (10:49 -0700)
committerChristof Schmitt <cs@samba.org>
Fri, 8 Dec 2017 08:43:12 +0000 (09:43 +0100)
No functional change, but this simplifies error handling.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13170

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
lib/pthreadpool/pthreadpool.c

index 23885aa6d116e2690674455e626e92fc0c0411f1..4e1e5d41fcaca71b7b27ca4f4e762d615cdd083b 100644 (file)
@@ -521,14 +521,56 @@ static void *pthreadpool_server(void *arg)
        }
 }
 
-int pthreadpool_add_job(struct pthreadpool *pool, int job_id,
-                       void (*fn)(void *private_data), void *private_data)
+static int pthreadpool_create_thread(struct pthreadpool *pool)
 {
        pthread_attr_t thread_attr;
        pthread_t thread_id;
        int res;
        sigset_t mask, omask;
 
+       /*
+        * Create a new worker thread. It should not receive any signals.
+        */
+
+       sigfillset(&mask);
+
+       res = pthread_attr_init(&thread_attr);
+       if (res != 0) {
+               return res;
+       }
+
+       res = pthread_attr_setdetachstate(
+               &thread_attr, PTHREAD_CREATE_DETACHED);
+       if (res != 0) {
+               pthread_attr_destroy(&thread_attr);
+               return res;
+       }
+
+       res = pthread_sigmask(SIG_BLOCK, &mask, &omask);
+       if (res != 0) {
+               pthread_attr_destroy(&thread_attr);
+               return res;
+       }
+
+       res = pthread_create(&thread_id, &thread_attr, pthreadpool_server,
+                            (void *)pool);
+
+       assert(pthread_sigmask(SIG_SETMASK, &omask, NULL) == 0);
+
+       pthread_attr_destroy(&thread_attr);
+
+       if (res == 0) {
+               pool->num_threads += 1;
+       }
+
+       return res;
+}
+
+int pthreadpool_add_job(struct pthreadpool *pool, int job_id,
+                       void (*fn)(void *private_data), void *private_data)
+{
+       int res;
+
        res = pthread_mutex_lock(&pool->mutex);
        if (res != 0) {
                return res;
@@ -570,43 +612,12 @@ int pthreadpool_add_job(struct pthreadpool *pool, int job_id,
                return 0;
        }
 
-       /*
-        * Create a new worker thread. It should not receive any signals.
-        */
-
-       sigfillset(&mask);
-
-       res = pthread_attr_init(&thread_attr);
-       if (res != 0) {
-               pthread_mutex_unlock(&pool->mutex);
-               return res;
-       }
-
-       res = pthread_attr_setdetachstate(
-               &thread_attr, PTHREAD_CREATE_DETACHED);
+       res = pthreadpool_create_thread(pool);
        if (res != 0) {
-               pthread_attr_destroy(&thread_attr);
-               pthread_mutex_unlock(&pool->mutex);
-               return res;
-       }
-
-        res = pthread_sigmask(SIG_BLOCK, &mask, &omask);
-       if (res != 0) {
-               pthread_attr_destroy(&thread_attr);
                pthread_mutex_unlock(&pool->mutex);
                return res;
        }
 
-       res = pthread_create(&thread_id, &thread_attr, pthreadpool_server,
-                            (void *)pool);
-       if (res == 0) {
-               pool->num_threads += 1;
-       }
-
-        assert(pthread_sigmask(SIG_SETMASK, &omask, NULL) == 0);
-
-       pthread_attr_destroy(&thread_attr);
-
        pthread_mutex_unlock(&pool->mutex);
        return res;
 }