diff options
author | Simo Sorce <idra@samba.org> | 2011-08-16 11:37:41 -0400 |
---|---|---|
committer | Simo Sorce <idra@samba.org> | 2011-08-21 09:05:05 -0400 |
commit | e3736f826b434bcdff5493fc533c11eba9bedc61 (patch) | |
tree | efb8324fd8b29672958195a88c0ab39eed34eb7c /source3/lib | |
parent | ee0c69a25e7a0dca0c54989b1d6887a114d93ed4 (diff) | |
download | samba-e3736f826b434bcdff5493fc533c11eba9bedc61.tar.gz samba-e3736f826b434bcdff5493fc533c11eba9bedc61.tar.bz2 samba-e3736f826b434bcdff5493fc533c11eba9bedc61.zip |
s3-prefork: Fix worker flags handling.
We can't have a clear idea of wether the worker is IDLE or BUSY.
The only things we can tell is if it is Alive, whether it is currently
Accepting connections or wether it is Exiting soon.
Remove PF_WORKER_IDLE, PF_WORKER_BUSY and replace their use with
PF_WORKER_ALIVE. Also properly assign PF_WORKER_ACCEPTING so that
users of the API can rely on the flag.
Signed-off-by: Andreas Schneider <asn@samba.org>
Signed-off-by: Simo Sorce <idra@samba.org>
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/server_prefork.c | 24 | ||||
-rw-r--r-- | source3/lib/server_prefork.h | 3 |
2 files changed, 20 insertions, 7 deletions
diff --git a/source3/lib/server_prefork.c b/source3/lib/server_prefork.c index ee725e883b..7d675485a0 100644 --- a/source3/lib/server_prefork.c +++ b/source3/lib/server_prefork.c @@ -109,7 +109,7 @@ bool prefork_create_pool(TALLOC_CTX *mem_ctx, case 0: /* THE CHILD */ - pfp->pool[i].status = PF_WORKER_IDLE; + pfp->pool[i].status = PF_WORKER_ALIVE; ret = pfp->main_fn(ev_ctx, msg_ctx, &pfp->pool[i], i + 1, pfp->listen_fd_size, @@ -196,7 +196,7 @@ int prefork_add_children(struct tevent_context *ev_ctx, case 0: /* THE CHILD */ - pfp->pool[i].status = PF_WORKER_IDLE; + pfp->pool[i].status = PF_WORKER_ALIVE; ret = pfp->main_fn(ev_ctx, msg_ctx, &pfp->pool[i], i + 1, pfp->listen_fd_size, @@ -252,7 +252,8 @@ int prefork_retire_children(struct prefork_pool *pfp, for (i = 0; i < pfp->pool_size; i++) { oldest[i].num = i; - if (pfp->pool[i].status == PF_WORKER_IDLE) { + if (pfp->pool[i].status == PF_WORKER_ALIVE || + pfp->pool[i].status == PF_WORKER_ACCEPTING) { oldest[i].started = pfp->pool[i].started; } else { oldest[i].started = now; @@ -264,7 +265,8 @@ int prefork_retire_children(struct prefork_pool *pfp, prefork_sort_oldest); for (i = 0, j = 0; i < pfp->pool_size && j < num_children; i++) { - if (pfp->pool[i].status == PF_WORKER_IDLE && + if ((pfp->pool[i].status == PF_WORKER_ALIVE || + pfp->pool[i].status == PF_WORKER_ACCEPTING) && pfp->pool[i].started <= age_limit) { /* tell the child it's time to give up */ DEBUG(5, ("Retiring pid %d!\n", pfp->pool[i].pid)); @@ -519,6 +521,8 @@ struct tevent_req *prefork_listen_send(TALLOC_CTX *mem_ctx, } } + pf->status = PF_WORKER_ACCEPTING; + return req; } @@ -539,6 +543,14 @@ static void prefork_listen_accept_handler(struct tevent_context *ev, req = ctx->req; state = tevent_req_data(ctx->req, struct pf_listen_state); + if (state->pf->cmds == PF_SRV_MSG_EXIT) { + /* We have been asked to exit, so drop here and the next + * child will pick it up */ + state->pf->status = PF_WORKER_EXITING; + state->error = EINTR; + goto done; + } + ZERO_STRUCT(addr); addrlen = sizeof(addr); sd = accept(ctx->listen_fd, (struct sockaddr *)&addr, &addrlen); @@ -609,9 +621,11 @@ int prefork_listen_recv(struct tevent_req *req, *fd = state->accept_fd; *srv_addr = talloc_move(mem_ctx, &state->srv_addr); *cli_addr = talloc_move(mem_ctx, &state->cli_addr); - state->pf->status = PF_WORKER_BUSY; state->pf->num_clients++; } + if (state->pf->status == PF_WORKER_ACCEPTING) { + state->pf->status = PF_WORKER_ALIVE; + } tevent_req_received(req); return ret; diff --git a/source3/lib/server_prefork.h b/source3/lib/server_prefork.h index 2685f50700..334b5813a0 100644 --- a/source3/lib/server_prefork.h +++ b/source3/lib/server_prefork.h @@ -26,9 +26,8 @@ struct prefork_pool; enum pf_worker_status { PF_WORKER_NONE = 0, - PF_WORKER_IDLE, + PF_WORKER_ALIVE, PF_WORKER_ACCEPTING, - PF_WORKER_BUSY, PF_WORKER_EXITING }; |