diff options
Diffstat (limited to 'source3/lib')
| -rw-r--r-- | source3/lib/server_prefork.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/source3/lib/server_prefork.c b/source3/lib/server_prefork.c index 53b6d5c992..211a54b95b 100644 --- a/source3/lib/server_prefork.c +++ b/source3/lib/server_prefork.c @@ -578,17 +578,23 @@ static void prefork_lock_handler(struct tevent_context *ev,  {  	struct tevent_req *req;  	struct pf_lock_state *state; +	struct timeval tv; +	int timeout = 0;  	int ret;  	req = talloc_get_type_abort(pvt, struct tevent_req);  	state = tevent_req_data(req, struct pf_lock_state); +	if (state->pf->num_clients > 0) { +		timeout = 1; +	} +  	switch (state->flags & PF_ASYNC_ACTION_MASK) {  	case PF_ASYNC_LOCK_GRAB: -		ret = prefork_grab_lock(state->pf, state->lock_fd, 0); +		ret = prefork_grab_lock(state->pf, state->lock_fd, timeout);  		break;  	case PF_ASYNC_LOCK_RELEASE: -		ret = prefork_release_lock(state->pf, state->lock_fd, 0); +		ret = prefork_release_lock(state->pf, state->lock_fd, timeout);  		break;  	default:  		ret = EINVAL; @@ -601,8 +607,12 @@ static void prefork_lock_handler(struct tevent_context *ev,  		tevent_req_done(req);  		return;  	case -1: -		te = tevent_add_timer(ev, state, -					tevent_timeval_current_ofs(1, 0), +		if (timeout) { +			tv = tevent_timeval_zero(); +		} else { +			tv = tevent_timeval_current_ofs(0, 100000); +		} +		te = tevent_add_timer(ev, state, tv,  					prefork_lock_handler, req);  		tevent_req_nomem(te, req);  		return;  | 
