h2o_memcached_context_t *h2o_memcached_create_context(const char *host, uint16_t port, size_t num_threads, const char *prefix) { h2o_memcached_context_t *ctx = h2o_mem_alloc(sizeof(*ctx)); pthread_mutex_init(&ctx->mutex, NULL); pthread_cond_init(&ctx->cond, NULL); h2o_linklist_init_anchor(&ctx->pending); ctx->num_threads_connected = 0; ctx->host = h2o_strdup(NULL, host, SIZE_MAX).base; ctx->port = port; ctx->prefix = h2o_strdup(NULL, prefix, SIZE_MAX); { /* start the threads */ pthread_t tid; pthread_attr_t attr; size_t i; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, 1); for (i = 0; i != num_threads; ++i) h2o_multithread_create_thread(&tid, &attr, thread_main, ctx); pthread_attr_destroy(&attr); } return ctx; }
static void spawn_cache_cleanup_thread(SSL_CTX **_contexts, size_t num_contexts) { /* copy the list of contexts */ SSL_CTX **contexts = malloc(sizeof(*contexts) * (num_contexts + 1)); memcpy(contexts, _contexts, sizeof(*contexts) * num_contexts); contexts[num_contexts] = NULL; /* launch the thread */ pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, 1); h2o_multithread_create_thread(&tid, &attr, cache_cleanup_thread, contexts); }