void dummyInitializeThread(evthr_t* thread, void* arg) { ThreadLocal* threadLocal = new ThreadLocal(); evthr_set_aux(thread, threadLocal); // damn c++, why cannot I directly cast to function pointer... auto callback = (void(*)(evthr_t* thread))arg; (*callback)(thread); }
void init_thread(evhtp_t *htp, evthr_t *thread, void *arg) { thr_arg_t *thr_args; thr_args = calloc(1, sizeof(thr_arg_t)); thr_args->thread = thread; char mserver[32]; if(settings.cache_on == true) { memcached_st *memc = memcached_create(NULL); snprintf(mserver, 32, "%s:%d", settings.cache_ip, settings.cache_port); memcached_server_st *servers = memcached_servers_parse(mserver); memcached_server_push(memc, servers); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, 1); thr_args->cache_conn = memc; LOG_PRINT(LOG_DEBUG, "Memcached Connection Init Finished."); memcached_server_list_free(servers); } if(settings.mode == 2) { memcached_st *beans = memcached_create(NULL); snprintf(mserver, 32, "%s:%d", settings.beansdb_ip, settings.beansdb_port); memcached_server_st *servers = memcached_servers_parse(mserver); servers = memcached_servers_parse(mserver); memcached_server_push(beans, servers); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_NO_BLOCK, 1); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, 1); thr_args->beansdb_conn = beans; LOG_PRINT(LOG_DEBUG, "beansdb Connection Init Finished."); memcached_server_list_free(servers); } else if(settings.mode == 3) { redisContext* c = redisConnect(settings.ssdb_ip, settings.ssdb_port); if(c->err) { redisFree(c); LOG_PRINT(LOG_DEBUG, "Connect to ssdb server faile"); } else { thr_args->ssdb_conn = c; LOG_PRINT(LOG_DEBUG, "Connect to ssdb server Success"); } } evthr_set_aux(thread, thr_args); }
/* Terminate gracefully on SIGTERM */ void sigterm_cb(int fd, short event, void * arg) { evbase_t * evbase = (evbase_t *)arg; struct timeval tv = { .tv_usec = 100000, .tv_sec = 0 }; /* 100 ms */ event_base_loopexit(evbase, &tv); } void init_thread_cb(evhtp_t * htp, evthr_t * thr, void * arg) { static int aux = 0; printf("Spinning up a thread: %d\n", ++aux); evthr_set_aux(thr, &aux); } int main(int argc, char ** argv) { struct event *ev_sigterm; evbase_t * evbase = event_base_new(); evhtp_t * evhtp = evhtp_new(evbase, NULL); evhtp_set_gencb(evhtp, frontend_cb, NULL); #ifndef EVHTP_DISABLE_SSL evhtp_ssl_cfg_t scfg1 = { 0 }; scfg1.pemfile = "./server.pem"; scfg1.privfile = "./server.pem"; evhtp_ssl_init(evhtp, &scfg1); #endif evhtp_use_threads(evhtp, init_thread_cb, 8, NULL); #ifndef WIN32 ev_sigterm = evsignal_new(evbase, SIGTERM, sigterm_cb, evbase); evsignal_add(ev_sigterm, NULL); #endif evhtp_bind_socket(evhtp, "0.0.0.0", 8081, 1024); event_base_loop(evbase, 0); printf("Clean exit\n"); return 0; }
static void app_init_thread(evhtp_t *htp, evthr_t *thread, void *arg) { struct tq_listener_s *listener; struct tq_service_s *service; struct app *app; service = (struct tq_service_s *)arg; listener = service->parent_listener; app = calloc(sizeof(struct app), 1); /* Also resets thread_call_count */ app->parent = listener->app_parent; app->evbase = evthr_get_base(thread); app->evhtp = htp; listener->app_thr = app; app->thread_number = app->parent->threads_online; app->parent->threads_online++; evthr_set_aux(thread, service); }
/** * @brief retry_cache Reconnect to the cache server. * * @param thr_arg Thread arg. */ void retry_cache(thr_arg_t *thr_arg) { if(thr_arg->cache_conn != NULL) memcached_free(thr_arg->cache_conn); memcached_st *memc; memc= memcached_create(NULL); char mserver[32]; snprintf(mserver, 32, "%s:%d", settings.cache_ip, settings.cache_port); memcached_server_st *servers = memcached_servers_parse(mserver); memcached_server_push(memc, servers); memcached_server_list_free(servers); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, 1); thr_arg->cache_conn = memc; evthr_set_aux(thr_arg->thread, thr_arg); }
/** * @brief sighandler the signal handler of zimg * * @param signal the signal zimg get * @param siginfo signal info * @param arg the arg for handler */ static void sighandler(int signal, siginfo_t *siginfo, void *arg) { char msg[128]; msg[0] = '\0'; str_lcat(msg, "----/--/-- --:--:--:------ [INFO] signal Terminal received zimg shutting down", sizeof(msg)); //str_lcat(msg, strsignal(signal)); log_handler(msg); write(STDOUT_FILENO, "\nbye bye!\n", 10); //evbase_t *evbase = (evbase_t *)arg; struct timeval tv = { .tv_usec = 100000, .tv_sec = 0 }; /* 100 ms */ event_base_loopexit(evbase, &tv); } /** * @brief init_thread the init function of threads * * @param htp evhtp object * @param thread the current thread * @param arg the arg for init */ void init_thread(evhtp_t *htp, evthr_t *thread, void *arg) { thr_arg_t *thr_args; thr_args = calloc(1, sizeof(thr_arg_t)); LOG_PRINT(LOG_DEBUG, "thr_args alloc"); thr_args->thread = thread; char mserver[32]; if (settings.cache_on == true) { memcached_st *memc = memcached_create(NULL); snprintf(mserver, 32, "%s:%d", settings.cache_ip, settings.cache_port); memcached_server_st *servers = memcached_servers_parse(mserver); memcached_server_push(memc, servers); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 1); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, 1); thr_args->cache_conn = memc; LOG_PRINT(LOG_DEBUG, "Memcached Connection Init Finished."); memcached_server_list_free(servers); } else thr_args->cache_conn = NULL; if (settings.mode == 2) { thr_args->ssdb_conn = NULL; memcached_st *beans = memcached_create(NULL); snprintf(mserver, 32, "%s:%d", settings.beansdb_ip, settings.beansdb_port); memcached_server_st *servers = memcached_servers_parse(mserver); servers = memcached_servers_parse(mserver); memcached_server_push(beans, servers); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_NO_BLOCK, 1); memcached_behavior_set(beans, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, 1); thr_args->beansdb_conn = beans; LOG_PRINT(LOG_DEBUG, "beansdb Connection Init Finished."); memcached_server_list_free(servers); } else if (settings.mode == 3) { thr_args->beansdb_conn = NULL; redisContext* c = redisConnect(settings.ssdb_ip, settings.ssdb_port); if (c->err) { redisFree(c); LOG_PRINT(LOG_DEBUG, "Connect to ssdb server faile"); } else { thr_args->ssdb_conn = c; LOG_PRINT(LOG_DEBUG, "Connect to ssdb server Success"); } } thr_args->L = luaL_newstate(); LOG_PRINT(LOG_DEBUG, "luaL_newstate alloc"); if (thr_args->L != NULL) { luaL_openlibs(thr_args->L); luaL_openlib(thr_args->L, "zimg", zimg_lib, 0); luaL_openlib(thr_args->L, "log", loglib, 0); } luaL_loadfile(thr_args->L, settings.script_name); lua_pcall(thr_args->L, 0, 0, 0); evthr_set_aux(thread, thr_args); lua_State *L = luaL_newstate(); if (L != NULL) { luaL_openlibs(L); if (luaL_loadfile(L, conf_file) || lua_pcall(L, 0, 0, 0)) { lua_close(L); } else { pthread_setspecific(gLuaStateKey, (void *)L); } } }