thread: Remove unneeded thread startup synchronization

sem_init() is deprecated on OS X, and it actually fails with ENOSYS. Using our
wrapped semaphore object is not an option, as it relies on the thread cleanup
that we can't rely on at this stage.

It is unclear why startup synchronization is required, as we can allocate the
thread ID just before creating the pthread. There is a chance that we allocate
a thread ID for a thread that fails to create, but the risk and consequences
are negligible.
This commit is contained in:
Martin Willi 2015-03-27 20:16:58 +01:00
parent 101d67440f
commit 7394ad92ae
1 changed files with 4 additions and 13 deletions

View File

@ -16,7 +16,6 @@
#define _GNU_SOURCE
#include <pthread.h>
#include <signal.h>
#include <semaphore.h>
#ifdef HAVE_GETTID
#include <sys/types.h>
@ -78,11 +77,6 @@ struct private_thread_t {
*/
mutex_t *mutex;
/**
* Semaphore used to sync the creation/start of the thread.
*/
sem_t created;
/**
* TRUE if this thread has been detached or joined, i.e. can be cleaned
* up after terminating.
@ -160,7 +154,6 @@ static void thread_destroy(private_thread_t *this)
this->cleanup_handlers->destroy(this->cleanup_handlers);
this->mutex->unlock(this->mutex);
this->mutex->destroy(this->mutex);
sem_destroy(&this->created);
free(this);
}
@ -263,7 +256,6 @@ static private_thread_t *thread_create_internal()
.cleanup_handlers = linked_list_create(),
.mutex = mutex_create(MUTEX_TYPE_DEFAULT),
);
sem_init(&this->created, FALSE, 0);
return this;
}
@ -292,7 +284,6 @@ static void *thread_main(private_thread_t *this)
{
void *res;
sem_wait(&this->created);
current_thread->set(current_thread, this);
pthread_cleanup_push((thread_cleanup_t)thread_cleanup, this);
@ -324,6 +315,10 @@ thread_t *thread_create(thread_main_t main, void *arg)
this->main = main;
this->arg = arg;
id_mutex->lock(id_mutex);
this->id = next_id++;
id_mutex->unlock(id_mutex);
if (pthread_create(&this->thread_id, NULL, (void*)thread_main, this) != 0)
{
DBG1(DBG_LIB, "failed to create thread!");
@ -331,10 +326,6 @@ thread_t *thread_create(thread_main_t main, void *arg)
thread_destroy(this);
return NULL;
}
id_mutex->lock(id_mutex);
this->id = next_id++;
id_mutex->unlock(id_mutex);
sem_post(&this->created);
return &this->public;
}