diff --git a/src/3proxy.c b/src/3proxy.c index 60769b5..6ad714e 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -491,6 +491,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int _3proxy_mutex_init(&bandlim_mutex); _3proxy_mutex_init(&connlim_mutex); _3proxy_mutex_init(&tc_mutex); + _3proxy_mutex_init(&loops_mutex); _3proxy_mutex_init(&tpool.mutex); #ifndef NORADIUS _3proxy_mutex_init(&rad_mutex); diff --git a/src/conf.c b/src/conf.c index a5e84be..d7086a8 100644 --- a/src/conf.c +++ b/src/conf.c @@ -37,6 +37,8 @@ void transparent_install(void); _3proxy_mutex_t bandlim_mutex; _3proxy_mutex_t connlim_mutex; _3proxy_mutex_t tc_mutex; +/* the event loops, started by the first client served on one */ +_3proxy_mutex_t loops_mutex; _3proxy_mutex_t config_mutex; int runningservices = 0; _3proxy_mutex_t runningservices_mutex; diff --git a/src/mainloop.c b/src/mainloop.c index ff080db..05e4547 100644 --- a/src/mainloop.c +++ b/src/mainloop.c @@ -85,8 +85,6 @@ struct loopjob { static struct looper *loopers; static unsigned nloopers, nextlooper; static int loopsfailed; -static _3proxy_mutex_t loopers_mutex; -static int loopers_mutex_init; /* the loop of this thread, NULL but in a loop's thread */ static LTLS struct looper *curlooper; @@ -1111,20 +1109,17 @@ static int loopsstart(void){ if(nloopers) return 0; if(loopsfailed) return 1; - if(!loopers_mutex_init){ - /* the first services start from the configuration's thread */ - _3proxy_mutex_init(&loopers_mutex); - loopers_mutex_init = 1; - } - _3proxy_mutex_lock(&loopers_mutex); + /* the first clients of services may come at once, each from the + thread of its service */ + _3proxy_mutex_lock(&loops_mutex); if(nloopers || loopsfailed){ - _3proxy_mutex_unlock(&loopers_mutex); + _3proxy_mutex_unlock(&loops_mutex); return loopsfailed; } n = runconf->loops? (unsigned)runconf->loops : ncpus(); if(!fiberusable() || !(loopers = calloc(n, sizeof(*loopers)))){ loopsfailed = 1; - _3proxy_mutex_unlock(&loopers_mutex); + _3proxy_mutex_unlock(&loops_mutex); return 1; } for(i = 0; i < n; i++){ @@ -1166,7 +1161,7 @@ static int loopsstart(void){ #endif fiberpollfunc = fiberpoll; } - _3proxy_mutex_unlock(&loopers_mutex); + _3proxy_mutex_unlock(&loops_mutex); return !i; } @@ -1196,9 +1191,9 @@ static struct loopjob *loopjobnew(size_t stacksize){ static void loopspawn(struct loopjob *job, struct clientparam *param){ struct looper *lp; - _3proxy_mutex_lock(&loopers_mutex); + _3proxy_mutex_lock(&loops_mutex); lp = loopers + (nextlooper++ % nloopers); - _3proxy_mutex_unlock(&loopers_mutex); + _3proxy_mutex_unlock(&loops_mutex); job->param = param; looppost(&lp->l, &job->m); } diff --git a/src/proxy.h b/src/proxy.h index 6a2948b..fa73b30 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -611,6 +611,7 @@ extern _3proxy_sem_t serviceexited; extern _3proxy_mutex_t bandlim_mutex; extern _3proxy_mutex_t connlim_mutex; extern _3proxy_mutex_t tc_mutex; +extern _3proxy_mutex_t loops_mutex; extern _3proxy_mutex_t log_mutex; extern _3proxy_mutex_t rad_mutex; extern struct datatype datatypes[64];