diff options
author | Luigi Rizzo <rizzo@icir.org> | 2006-11-28 11:20:39 +0000 |
---|---|---|
committer | Luigi Rizzo <rizzo@icir.org> | 2006-11-28 11:20:39 +0000 |
commit | 0153bdd72cda80a8a157533964786a2aa34948e1 (patch) | |
tree | a36784d5857499517803790b8d96a12d4c3f88e1 /main | |
parent | 5ce08d37ca6b649085585d5f75f871df23f605d4 (diff) |
Move the code to purge stale sessions to a function,
to simplify the body of the main loop of the accepting thread.
Rename purge_unused() to purge_events() so one knows what the
function does.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48081 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r-- | main/manager.c | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/main/manager.c b/main/manager.c index b8d543067..d15cc729c 100644 --- a/main/manager.c +++ b/main/manager.c @@ -271,7 +271,7 @@ static struct eventqent *grab_last(void) * Purge unused events. Remove elements from the head * as long as their usecount is 0 and there is a next element. */ -static void purge_unused(void) +static void purge_events(void) { struct eventqent *ev; @@ -2136,6 +2136,32 @@ static void *session_do(void *data) return NULL; } +/*! \brief remove at most n_max stale session from the list. */ +static void purge_sessions(int n_max) +{ + struct mansession *s; + time_t now = time(NULL); + + AST_LIST_LOCK(&sessions); + AST_LIST_TRAVERSE_SAFE_BEGIN(&sessions, s, list) { + if (s->sessiontimeout && (now > s->sessiontimeout) && !s->inuse) { + ast_verbose("destroy session[2] %lx now %lu to %lu\n", + s->managerid, (unsigned long)now, (unsigned long)s->sessiontimeout); + AST_LIST_REMOVE_CURRENT(&sessions, list); + ast_atomic_fetchadd_int(&num_sessions, -1); + if (s->authenticated && (option_verbose > 1) && displayconnects) { + ast_verbose(VERBOSE_PREFIX_2 "HTTP Manager '%s' timed out from %s\n", + s->username, ast_inet_ntoa(s->sin.sin_addr)); + } + free_session(s); /* XXX outside ? */ + if (--n_max <= 0) + break; + } + } + AST_LIST_TRAVERSE_SAFE_END + AST_LIST_UNLOCK(&sessions); +} + /*! \brief The thread accepting connections on the manager interface port. * As a side effect, it purges stale sessions, one per each iteration, * which is at least every 5 seconds. @@ -2149,40 +2175,20 @@ static void *accept_thread(void *ignore) for (;;) { struct mansession *s; - time_t now = time(NULL); int as; struct sockaddr_in sin; socklen_t sinlen; struct protoent *p; int flags; - struct pollfd pfds[1]; - AST_LIST_LOCK(&sessions); - AST_LIST_TRAVERSE_SAFE_BEGIN(&sessions, s, list) { - if (s->sessiontimeout && (now > s->sessiontimeout) && !s->inuse) { - ast_verbose("destroy session[2] %lx now %lu to %lu\n", - s->managerid, (unsigned long)now, (unsigned long)s->sessiontimeout); - AST_LIST_REMOVE_CURRENT(&sessions, list); - ast_atomic_fetchadd_int(&num_sessions, -1); - if (s->authenticated && (option_verbose > 1) && displayconnects) { - ast_verbose(VERBOSE_PREFIX_2 "HTTP Manager '%s' timed out from %s\n", - s->username, ast_inet_ntoa(s->sin.sin_addr)); - } - free_session(s); /* XXX outside ? */ - break; - } - } - AST_LIST_TRAVERSE_SAFE_END - AST_LIST_UNLOCK(&sessions); - purge_unused(); + purge_sessions(1); + purge_events(); - sinlen = sizeof(sin); - pfds[0].fd = asock; - pfds[0].events = POLLIN; /* Wait for something to happen, but timeout every few seconds so we can ditch any old manager sessions */ - if (poll(pfds, 1, 5000) < 1) + if (ast_wait_for_input(asock, 5000) < 1) continue; + sinlen = sizeof(sin); as = accept(asock, (struct sockaddr *)&sin, &sinlen); if (as < 0) { ast_log(LOG_NOTICE, "Accept returned -1: %s\n", strerror(errno)); |