mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
r21871: Move deadtime processing into an idle event. While there, simplify
conn_idle_all() a bit.
Volker
(This used to be commit 3fc00977a9
)
This commit is contained in:
parent
c0e37a7496
commit
fe0b56ead1
@ -191,14 +191,14 @@ BOOL conn_idle_all(time_t t)
|
||||
{
|
||||
int deadtime = lp_deadtime()*60;
|
||||
pipes_struct *plist = NULL;
|
||||
BOOL allidle = True;
|
||||
connection_struct *conn, *next;
|
||||
connection_struct *conn;
|
||||
|
||||
if (deadtime <= 0)
|
||||
deadtime = DEFAULT_SMBD_TIMEOUT;
|
||||
|
||||
for (conn=Connections;conn;conn=next) {
|
||||
next=conn->next;
|
||||
for (conn=Connections;conn;conn=conn->next) {
|
||||
|
||||
time_t age = t - conn->lastused;
|
||||
|
||||
/* Update if connection wasn't idle. */
|
||||
if (conn->lastused != conn->lastused_count) {
|
||||
@ -207,12 +207,12 @@ BOOL conn_idle_all(time_t t)
|
||||
}
|
||||
|
||||
/* close dirptrs on connections that are idle */
|
||||
if ((t-conn->lastused) > DPTR_IDLE_TIMEOUT) {
|
||||
if (age > DPTR_IDLE_TIMEOUT) {
|
||||
dptr_idlecnum(conn);
|
||||
}
|
||||
|
||||
if (conn->num_files_open > 0 || (t-conn->lastused)<deadtime) {
|
||||
allidle = False;
|
||||
if (conn->num_files_open > 0 || age < deadtime) {
|
||||
return False;
|
||||
}
|
||||
}
|
||||
|
||||
@ -221,11 +221,14 @@ BOOL conn_idle_all(time_t t)
|
||||
* idle with a handle open.
|
||||
*/
|
||||
|
||||
for (plist = get_first_internal_pipe(); plist; plist = get_next_internal_pipe(plist))
|
||||
if (plist->pipe_handles && plist->pipe_handles->count)
|
||||
allidle = False;
|
||||
for (plist = get_first_internal_pipe(); plist;
|
||||
plist = get_next_internal_pipe(plist)) {
|
||||
if (plist->pipe_handles && plist->pipe_handles->count) {
|
||||
return False;
|
||||
}
|
||||
}
|
||||
|
||||
return allidle;
|
||||
return True;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -303,6 +306,8 @@ void conn_free(connection_struct *conn)
|
||||
DLIST_REMOVE(Connections, conn);
|
||||
|
||||
bitmap_clear(bmap, conn->cnum);
|
||||
|
||||
SMB_ASSERT(num_open > 0);
|
||||
num_open--;
|
||||
|
||||
conn_free_internal(conn);
|
||||
|
@ -1328,9 +1328,7 @@ void check_reload(time_t t)
|
||||
static BOOL timeout_processing(int *select_timeout,
|
||||
time_t *last_timeout_processing_time)
|
||||
{
|
||||
static time_t last_idle_closed_check = 0;
|
||||
time_t t;
|
||||
BOOL allidle = True;
|
||||
|
||||
if (smb_read_error == READ_EOF) {
|
||||
DEBUG(3,("timeout_processing: End of file from client (client has disconnected).\n"));
|
||||
@ -1350,31 +1348,12 @@ static BOOL timeout_processing(int *select_timeout,
|
||||
|
||||
*last_timeout_processing_time = t = time(NULL);
|
||||
|
||||
if(last_idle_closed_check == 0)
|
||||
last_idle_closed_check = t;
|
||||
|
||||
/* become root again if waiting */
|
||||
change_to_root_user();
|
||||
|
||||
/* check if we need to reload services */
|
||||
check_reload(t);
|
||||
|
||||
/* automatic timeout if all connections are closed */
|
||||
if (conn_num_open()==0 && (t - last_idle_closed_check) >= IDLE_CLOSED_TIMEOUT) {
|
||||
DEBUG( 2, ( "Closing idle connection\n" ) );
|
||||
return False;
|
||||
} else {
|
||||
last_idle_closed_check = t;
|
||||
}
|
||||
|
||||
/* check for connection timeouts */
|
||||
allidle = conn_idle_all(t);
|
||||
|
||||
if (allidle && conn_num_open()>0) {
|
||||
DEBUG(2,("Closing idle connection 2.\n"));
|
||||
return False;
|
||||
}
|
||||
|
||||
if(global_machine_password_needs_changing &&
|
||||
/* for ADS we need to do a regular ADS password change, not a domain
|
||||
password change */
|
||||
|
@ -826,6 +826,22 @@ static BOOL keepalive_fn(const struct timeval *now, void *private_data)
|
||||
return True;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the recurring check if we're idle
|
||||
*/
|
||||
static BOOL deadtime_fn(const struct timeval *now, void *private_data)
|
||||
{
|
||||
if ((conn_num_open() == 0)
|
||||
|| (conn_idle_all(now->tv_sec))) {
|
||||
DEBUG( 2, ( "Closing idle connection\n" ) );
|
||||
message_send_pid(procid_self(), MSG_SHUTDOWN, NULL, 0, False);
|
||||
return False;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
main program.
|
||||
****************************************************************************/
|
||||
@ -1119,18 +1135,20 @@ extern void build_options(BOOL screen);
|
||||
/* register our message handlers */
|
||||
message_register(MSG_SMB_FORCE_TDIS, msg_force_tdis, NULL);
|
||||
|
||||
if (lp_keepalive() != 0) {
|
||||
struct timeval interval;
|
||||
if ((lp_keepalive() != 0)
|
||||
&& !(event_add_idle(smbd_event_context(), NULL,
|
||||
timeval_set(lp_keepalive(), 0),
|
||||
"keepalive", keepalive_fn,
|
||||
NULL))) {
|
||||
DEBUG(0, ("Could not add keepalive event\n"));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
interval.tv_sec = lp_keepalive();
|
||||
interval.tv_usec = 0;
|
||||
|
||||
if (!(event_add_idle(smbd_event_context(), NULL,
|
||||
interval, "keepalive", keepalive_fn,
|
||||
NULL))) {
|
||||
DEBUG(0, ("Could not add keepalive event\n"));
|
||||
exit(1);
|
||||
}
|
||||
if (!(event_add_idle(smbd_event_context(), NULL,
|
||||
timeval_set(IDLE_CLOSED_TIMEOUT, 0),
|
||||
"deadtime", deadtime_fn, NULL))) {
|
||||
DEBUG(0, ("Could not add deadtime event\n"));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
smbd_process();
|
||||
|
Loading…
Reference in New Issue
Block a user