diff options
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 61 |
1 files changed, 27 insertions, 34 deletions
@@ -1,4 +1,4 @@ -/* $Id: server.c,v 1.248 2010-10-24 19:54:41 nicm Exp $ */ +/* $Id: server.c,v 1.249 2010-12-22 15:36:44 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -146,8 +146,8 @@ server_start(void) ARRAY_INIT(&windows); ARRAY_INIT(&clients); ARRAY_INIT(&dead_clients); - ARRAY_INIT(&sessions); - ARRAY_INIT(&dead_sessions); + RB_INIT(&sessions); + RB_INIT(&dead_sessions); TAILQ_INIT(&session_groups); mode_key_init_trees(); key_bindings_init(); @@ -175,8 +175,8 @@ server_start(void) * If there is a session already, put the current window and pane into * more mode. */ - if (!ARRAY_EMPTY(&sessions) && !ARRAY_EMPTY(&cfg_causes)) { - wp = ARRAY_FIRST(&sessions)->curw->window->active; + if (!RB_EMPTY(&sessions) && !ARRAY_EMPTY(&cfg_causes)) { + wp = RB_MIN(sessions, &sessions)->curw->window->active; window_pane_set_mode(wp, &window_copy_mode); window_copy_init_for_output(wp); for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) { @@ -224,10 +224,8 @@ server_should_shutdown(void) u_int i; if (!options_get_number(&global_options, "exit-unattached")) { - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - if (ARRAY_ITEM(&sessions, i) != NULL) - return (0); - } + if (!RB_EMPTY(&sessions)) + return (0); } for (i = 0; i < ARRAY_LENGTH(&clients); i++) { if (ARRAY_ITEM(&clients, i) != NULL) @@ -241,7 +239,7 @@ void server_send_shutdown(void) { struct client *c; - struct session *s; + struct session *s, *next_s; u_int i; for (i = 0; i < ARRAY_LENGTH(&clients); i++) { @@ -255,9 +253,11 @@ server_send_shutdown(void) } } - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - if ((s = ARRAY_ITEM(&sessions, i)) != NULL) - session_destroy(s); + s = RB_MIN(sessions, &sessions); + while (s != NULL) { + next_s = RB_NEXT(sessions, &sessions, s); + session_destroy(s); + s = next_s; } } @@ -265,16 +265,19 @@ server_send_shutdown(void) void server_clean_dead(void) { - struct session *s; + struct session *s, *next_s; struct client *c; u_int i; - for (i = 0; i < ARRAY_LENGTH(&dead_sessions); i++) { - s = ARRAY_ITEM(&dead_sessions, i); - if (s == NULL || s->references != 0) - continue; - ARRAY_SET(&dead_sessions, i, NULL); - xfree(s); + s = RB_MIN(sessions, &dead_sessions); + while (s != NULL) { + next_s = RB_NEXT(sessions, &dead_sessions, s); + if (s->references == 0) { + RB_REMOVE(sessions, &dead_sessions, s); + xfree(s->name); + xfree(s); + } + s = next_s; } for (i = 0; i < ARRAY_LENGTH(&dead_clients); i++) { @@ -291,15 +294,13 @@ void server_update_socket(void) { struct session *s; - u_int i; static int last = -1; int n, mode; struct stat sb; n = 0; - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - s = ARRAY_ITEM(&sessions, i); - if (s != NULL && !(s->flags & SESSION_UNATTACHED)) { + RB_FOREACH(s, sessions, &sessions) { + if (!(s->flags & SESSION_UNATTACHED)) { n++; break; } @@ -486,15 +487,11 @@ void server_lock_server(void) { struct session *s; - u_int i; int timeout; time_t t; t = time(NULL); - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - if ((s = ARRAY_ITEM(&sessions, i)) == NULL) - continue; - + RB_FOREACH(s, sessions, &sessions) { if (s->flags & SESSION_UNATTACHED) { if (gettimeofday(&s->activity_time, NULL) != 0) fatal("gettimeofday failed"); @@ -515,15 +512,11 @@ void server_lock_sessions(void) { struct session *s; - u_int i; int timeout; time_t t; t = time(NULL); - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - if ((s = ARRAY_ITEM(&sessions, i)) == NULL) - continue; - + RB_FOREACH(s, sessions, &sessions) { if (s->flags & SESSION_UNATTACHED) { if (gettimeofday(&s->activity_time, NULL) != 0) fatal("gettimeofday failed"); |