int uv_worker_init(uv_worker_t *worker, uv_loop_t *loop, int count, const char *name) { #ifdef DEBUG worker->thread_id = uv_thread_self(); #endif worker->loop = loop; worker->name = name; worker->count = 0; worker->close_cb = NULL; worker->active_items = 0; worker->msgr = (uv_messenger_t *)malloc(sizeof(uv_messenger_t)); int ret = uv_messenger_init(loop, worker->msgr, uv__worker_after); if (ret < 0) { free(worker->msgr); return ret; } uv_messenger_unref(worker->msgr); ret = uv_chan_init(&worker->chan); if (ret < 0) return ret; // Initialize all worker threads. int i; for (i = 0; i < count; i++) { uv__worker_thread_t *worker_thread = (uv__worker_thread_t *)malloc(sizeof(uv__worker_thread_t)); worker_thread->worker = worker; ret = uv_thread_create(&worker_thread->thread, uv__worker_thread_loop, worker_thread); if (ret < 0) return ret; worker->count++; } return 0; }
void CachingHTTPFileSource::setLoop(uv_loop_t* loop_) { assert(!loop); thread_id = std::this_thread::get_id(); store = !path.empty() ? util::ptr<SQLiteStore>(new SQLiteStore(loop_, path)) : nullptr; loop = loop_; queue = new uv_messenger_t; uv_messenger_init(loop, queue, [](void *ptr) { std::unique_ptr<std::function<void()>> fn { reinterpret_cast<std::function<void()> *>(ptr) }; (*fn)(); }); uv_unref((uv_handle_t *)&queue->async); }