Beispiel #1
0
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);
}