static void coroae_loop() { if (uwsgi.async < 2) { if (uwsgi.mywid == 1) { uwsgi_log("the Coro::AnyEvent loop engine requires async mode (--async <n>)\n"); } exit(1); } if (!uperl.loaded) { uwsgi_log("no perl/PSGI code loaded (with --psgi), unable to initialize Coro::AnyEvent\n"); exit(1); } perl_eval_pv("use Coro;", 0); if (SvTRUE(ERRSV)) { uwsgi_log("unable to load Coro module\n"); exit(1); } perl_eval_pv("use AnyEvent;", 0); if (SvTRUE(ERRSV)) { uwsgi_log("unable to load AnyEvent module\n"); exit(1); } perl_eval_pv("use Coro::AnyEvent;", 0); if (SvTRUE(ERRSV)) { uwsgi_log("unable to load Coro::AnyEvent module\n"); exit(1); } uwsgi.current_wsgi_req = coroae_current_wsgi_req; uwsgi.wait_write_hook = coroae_wait_fd_write; uwsgi.wait_read_hook = coroae_wait_fd_read; I_CORO_API("uwsgi::coroae"); // create signal watchers if (uwsgi.signal_socket > -1) { coroae_add_watcher(uwsgi.signal_socket, (SV *) coroae_closure_sighandler(uwsgi.signal_socket)); coroae_add_watcher(uwsgi.my_signal_socket, (SV *) coroae_closure_sighandler(uwsgi.my_signal_socket)); } struct uwsgi_socket *uwsgi_sock = uwsgi.sockets; while(uwsgi_sock) { // check return value here coroae_add_watcher(uwsgi_sock->fd, (SV *) coroae_closure_acceptor(uwsgi_sock)); uwsgi_sock = uwsgi_sock->next; }; SV *condvar = coroae_condvar_new(); coroae_wait_condvar(condvar); if (uwsgi.workers[uwsgi.mywid].manage_next_request == 0) { uwsgi_log("goodbye to the Coro::AnyEvent loop on worker %d (pid: %d)\n", uwsgi.mywid, uwsgi.mypid); exit(UWSGI_RELOAD_CODE); } uwsgi_log("the Coro::AnyEvent loop is no more :(\n"); }
static void coroae_loop() { if (uwsgi.async < 1) { if (uwsgi.mywid == 1) { uwsgi_log("the Coro::AnyEvent loop engine requires async mode (--async <n>)\n"); } exit(1); } if (!uperl.loaded) { uwsgi_log("no perl/PSGI code loaded (with --psgi), unable to initialize Coro::AnyEvent\n"); exit(1); } perl_eval_pv("use Coro;", 1); perl_eval_pv("use AnyEvent;", 1); perl_eval_pv("use Coro::AnyEvent;", 1); uwsgi.current_wsgi_req = coroae_current_wsgi_req; uwsgi.wait_write_hook = coroae_wait_fd_write; uwsgi.wait_read_hook = coroae_wait_fd_read; uwsgi.wait_milliseconds_hook = coroae_wait_milliseconds; I_CORO_API("uwsgi::coroae"); // patch goodbye_cruel_world uwsgi.gbcw_hook = coroae_gbcw; ucoroae.watchers = newAV(); av_push(ucoroae.watchers, coroae_add_signal_watcher("HUP", newXS(NULL, XS_coroae_hup_sighandler, "uwsgi::coroae"))); av_push(ucoroae.watchers, coroae_add_signal_watcher("INT", newXS(NULL, XS_coroae_int_sighandler, "uwsgi::coroae"))); av_push(ucoroae.watchers, coroae_add_signal_watcher("TERM", newXS(NULL, XS_coroae_int_sighandler, "uwsgi::coroae"))); // create signal watchers if (uwsgi.signal_socket > -1) { av_push(ucoroae.watchers, coroae_add_watcher(uwsgi.signal_socket, coroae_closure_sighandler(uwsgi.signal_socket))); av_push(ucoroae.watchers, coroae_add_watcher(uwsgi.my_signal_socket, coroae_closure_sighandler(uwsgi.my_signal_socket))); } struct uwsgi_socket *uwsgi_sock = uwsgi.sockets; while(uwsgi_sock) { // check return value here av_push(ucoroae.watchers, coroae_add_watcher(uwsgi_sock->fd, coroae_closure_acceptor(uwsgi_sock))); uwsgi_sock = uwsgi_sock->next; }; ucoroae.condvar = coroae_condvar_new(); coroae_condvar_call(ucoroae.condvar, "recv"); SvREFCNT_dec(ucoroae.condvar); if (uwsgi.workers[uwsgi.mywid].manage_next_request == 0) { uwsgi_log("goodbye to the Coro::AnyEvent loop on worker %d (pid: %d)\n", uwsgi.mywid, uwsgi.mypid); exit(UWSGI_RELOAD_CODE); } uwsgi_log("the Coro::AnyEvent loop is no more :(\n"); }