{
ms_workqueue_worker_t *worker;
int idx;
- pthread_cond_t blank_cond = PTHREAD_COND_INITIALIZER;
- pthread_mutex_t blank_mutex = PTHREAD_MUTEX_INITIALIZER;
+ pthread_attr_t attr;
LOGD("Enter");
muse_return_if_fail(workqueue);
- memcpy(&workqueue->jobs_mutex, &blank_mutex, sizeof(workqueue->jobs_mutex));
- memcpy(&workqueue->jobs_cond, &blank_cond, sizeof(workqueue->jobs_cond));
+ pthread_mutex_init(&workqueue->jobs_mutex, NULL);
+ pthread_cond_init(&workqueue->jobs_cond, NULL);
+
+ muse_return_if_fail(pthread_attr_init(&attr) == 0);
+ if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) {
+ LOGE("Failed to set detach state");
+ goto out;
+ }
for (idx = 0; idx < MUSE_WORK_THREAD_NUM; idx++) {
worker = calloc(1, sizeof(ms_workqueue_worker_t));
muse_return_if_fail(worker);
+
worker->workqueue = workqueue;
- if (pthread_create(&worker->thread, NULL, _ms_workqueue_worker_function, (void *)worker)) {
+ if (pthread_create(&worker->thread, &attr, _ms_workqueue_worker_function, (void *)worker)) {
LOGE("Failed to start all worker threads");
free(worker);
- return;
+ goto out;
}
- /* Make the thread detached */
- (void)pthread_detach(worker->thread);
-
LL_ADD(worker, worker->workqueue->workers);
}
+out:
+ muse_return_if_fail(pthread_attr_destroy(&attr) == 0);
+
LOGD("Leave");
}
workqueue->waiting_jobs = NULL;
pthread_cond_broadcast(&workqueue->jobs_cond);
pthread_mutex_unlock(&workqueue->jobs_mutex);
+
+ pthread_mutex_destroy(&workqueue->jobs_mutex);
+ pthread_cond_destroy(&workqueue->jobs_cond);
free(workqueue);
LOGD("Leave");