mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-11 14:10:34 +00:00
Some minor tuning to rpc/svc.c:
- close cosmetic race in svc_exit(); - do not set wait timeout for idle threads if we have no use for wakeups; - create new requested thread sooner, not only after some another thread wakeup, that may happen later under constant load.
This commit is contained in:
parent
77badb18cd
commit
db7cdfee30
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=258132
@ -1010,6 +1010,18 @@ svc_run_internal(SVCPOOL *pool, bool_t ismaster)
|
||||
pool->sp_state = SVCPOOL_ACTIVE;
|
||||
|
||||
while (pool->sp_state != SVCPOOL_CLOSING) {
|
||||
/*
|
||||
* Create new thread if requested.
|
||||
*/
|
||||
if (pool->sp_state == SVCPOOL_THREADWANTED) {
|
||||
pool->sp_state = SVCPOOL_THREADSTARTING;
|
||||
pool->sp_lastcreatetime = time_uptime;
|
||||
mtx_unlock(&pool->sp_lock);
|
||||
svc_new_thread(pool);
|
||||
mtx_lock(&pool->sp_lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for idle transports once per second.
|
||||
*/
|
||||
@ -1046,8 +1058,13 @@ svc_run_internal(SVCPOOL *pool, bool_t ismaster)
|
||||
continue;
|
||||
|
||||
LIST_INSERT_HEAD(&pool->sp_idlethreads, st, st_ilink);
|
||||
error = cv_timedwait_sig(&st->st_cond, &pool->sp_lock,
|
||||
5 * hz);
|
||||
if (ismaster || (!ismaster &&
|
||||
pool->sp_threadcount > pool->sp_minthreads))
|
||||
error = cv_timedwait_sig(&st->st_cond,
|
||||
&pool->sp_lock, 5 * hz);
|
||||
else
|
||||
error = cv_wait_sig(&st->st_cond,
|
||||
&pool->sp_lock);
|
||||
LIST_REMOVE(st, st_ilink);
|
||||
|
||||
/*
|
||||
@ -1060,25 +1077,12 @@ svc_run_internal(SVCPOOL *pool, bool_t ismaster)
|
||||
&& !st->st_xprt
|
||||
&& STAILQ_EMPTY(&st->st_reqs))
|
||||
break;
|
||||
}
|
||||
if (error == EWOULDBLOCK)
|
||||
continue;
|
||||
if (error) {
|
||||
if (pool->sp_state != SVCPOOL_CLOSING) {
|
||||
} else if (error) {
|
||||
mtx_unlock(&pool->sp_lock);
|
||||
svc_exit(pool);
|
||||
mtx_lock(&pool->sp_lock);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (pool->sp_state == SVCPOOL_THREADWANTED) {
|
||||
pool->sp_state = SVCPOOL_THREADSTARTING;
|
||||
pool->sp_lastcreatetime = time_uptime;
|
||||
mtx_unlock(&pool->sp_lock);
|
||||
svc_new_thread(pool);
|
||||
mtx_lock(&pool->sp_lock);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1245,9 +1249,11 @@ svc_exit(SVCPOOL *pool)
|
||||
|
||||
mtx_lock(&pool->sp_lock);
|
||||
|
||||
if (pool->sp_state != SVCPOOL_CLOSING) {
|
||||
pool->sp_state = SVCPOOL_CLOSING;
|
||||
LIST_FOREACH(st, &pool->sp_idlethreads, st_ilink)
|
||||
cv_signal(&st->st_cond);
|
||||
}
|
||||
|
||||
mtx_unlock(&pool->sp_lock);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user