unix, windows: disallow NULL worker in thread pool

See #629.
This commit is contained in:
Shigeki Ohtsu 2012-11-24 08:25:32 +09:00 committed by Ben Noordhuis
parent 90271e1a3c
commit 0cca5391ba
4 changed files with 27 additions and 2 deletions

View File

@ -153,8 +153,7 @@ void uv__work_done(uv_async_t* handle, int status) {
static void uv__queue_work(struct uv__work* w) {
uv_work_t* req = container_of(w, uv_work_t, work_req);
if (req->work_cb)
req->work_cb(req);
req->work_cb(req);
}
@ -172,6 +171,9 @@ int uv_queue_work(uv_loop_t* loop,
uv_work_t* req,
uv_work_cb work_cb,
uv_after_work_cb after_work_cb) {
if (work_cb == NULL)
return uv__set_artificial_error(loop, UV_EINVAL);
uv__req_init(loop, req, UV_WORK);
req->loop = loop;
req->work_cb = work_cb;

View File

@ -55,6 +55,9 @@ static DWORD WINAPI uv_work_thread_proc(void* parameter) {
int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb,
uv_after_work_cb after_work_cb) {
if (work_cb == NULL)
return uv__set_artificial_error(loop, UV_EINVAL);
uv_work_req_init(loop, req, work_cb, after_work_cb);
if (!QueueUserWorkItem(&uv_work_thread_proc, req, WT_EXECUTELONGFUNCTION)) {

View File

@ -184,6 +184,7 @@ TEST_DECLARE (fs_readdir_file)
TEST_DECLARE (fs_open_dir)
TEST_DECLARE (fs_rename_to_existing_file)
TEST_DECLARE (threadpool_queue_work_simple)
TEST_DECLARE (threadpool_queue_work_einval)
TEST_DECLARE (threadpool_multiple_event_loops)
TEST_DECLARE (thread_mutex)
TEST_DECLARE (thread_rwlock)
@ -448,6 +449,7 @@ TASK_LIST_START
TEST_ENTRY (fs_open_dir)
TEST_ENTRY (fs_rename_to_existing_file)
TEST_ENTRY (threadpool_queue_work_simple)
TEST_ENTRY (threadpool_queue_work_einval)
TEST_ENTRY (threadpool_multiple_event_loops)
TEST_ENTRY (thread_mutex)
TEST_ENTRY (thread_rwlock)

View File

@ -56,3 +56,21 @@ TEST_IMPL(threadpool_queue_work_simple) {
MAKE_VALGRIND_HAPPY();
return 0;
}
TEST_IMPL(threadpool_queue_work_einval) {
int r;
work_req.data = &data;
r = uv_queue_work(uv_default_loop(), &work_req, NULL, after_work_cb);
ASSERT(r == -1);
uv_run(uv_default_loop());
ASSERT(uv_last_error(uv_default_loop()).code == UV_EINVAL);
ASSERT(work_cb_count == 0);
ASSERT(after_work_cb_count == 0);
MAKE_VALGRIND_HAPPY();
return 0;
}