diff options
author | Christof Schmitt <cs@samba.org> | 2017-11-28 10:49:36 -0700 |
---|---|---|
committer | Christof Schmitt <cs@samba.org> | 2017-12-08 09:43:12 +0100 |
commit | 949ccc3ea9073a3d38bff28345f644d39177256f (patch) | |
tree | d0f167ea7afa8fb9b3483bb56a7d894c874b4c28 | |
parent | aaa946bb9eb8088389b8ffdec460023f1961616c (diff) | |
download | samba-949ccc3ea9073a3d38bff28345f644d39177256f.tar.gz |
pthreadpool: Move creating of thread to new function
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>
-rw-r--r-- | lib/pthreadpool/pthreadpool.c | 79 |
1 files changed, 45 insertions, 34 deletions
diff --git a/lib/pthreadpool/pthreadpool.c b/lib/pthreadpool/pthreadpool.c index 23885aa6d11..4e1e5d41fca 100644 --- a/lib/pthreadpool/pthreadpool.c +++ b/lib/pthreadpool/pthreadpool.c @@ -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; } |