mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 22:28:22 +01:00
thread_utils: release mutex before signaling
holding the associated mutex while signaling a condition variable isn't necessary and in some implementations will reduce performance as the woken thread may test the mutex, fail and go back to sleep. Change-Id: Id685a47b0c76fc4a1c5acedcb6623e8c55056415
This commit is contained in:
parent
9acf18ba46
commit
6682f2c415
@ -217,8 +217,12 @@ static THREADFN ThreadLoop(void* ptr) {
|
|||||||
done = 1;
|
done = 1;
|
||||||
}
|
}
|
||||||
// signal to the main thread that we're done (for Sync())
|
// signal to the main thread that we're done (for Sync())
|
||||||
pthread_cond_signal(&impl->condition_);
|
// Note the associated mutex does not need to be held when signaling the
|
||||||
|
// condition. Unlocking the mutex first may improve performance in some
|
||||||
|
// implementations, avoiding the case where the waiting thread can't
|
||||||
|
// reacquire the mutex when woken.
|
||||||
pthread_mutex_unlock(&impl->mutex_);
|
pthread_mutex_unlock(&impl->mutex_);
|
||||||
|
pthread_cond_signal(&impl->condition_);
|
||||||
}
|
}
|
||||||
return THREAD_RETURN(NULL); // Thread is finished
|
return THREAD_RETURN(NULL); // Thread is finished
|
||||||
}
|
}
|
||||||
@ -240,7 +244,13 @@ static void ChangeState(WebPWorker* const worker, WebPWorkerStatus new_status) {
|
|||||||
// assign new status and release the working thread if needed
|
// assign new status and release the working thread if needed
|
||||||
if (new_status != OK) {
|
if (new_status != OK) {
|
||||||
worker->status_ = new_status;
|
worker->status_ = new_status;
|
||||||
|
// Note the associated mutex does not need to be held when signaling the
|
||||||
|
// condition. Unlocking the mutex first may improve performance in some
|
||||||
|
// implementations, avoiding the case where the waiting thread can't
|
||||||
|
// reacquire the mutex when woken.
|
||||||
|
pthread_mutex_unlock(&impl->mutex_);
|
||||||
pthread_cond_signal(&impl->condition_);
|
pthread_cond_signal(&impl->condition_);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&impl->mutex_);
|
pthread_mutex_unlock(&impl->mutex_);
|
||||||
|
Loading…
Reference in New Issue
Block a user