summaryrefslogtreecommitdiffstats
path: root/server.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2010-12-22 15:36:44 +0000
committerTiago Cunha <tcunha@gmx.com>2010-12-22 15:36:44 +0000
commita373235106d22fdead116d478087d8f8f11c150d (patch)
tree2f4aba9efa49f7855e918e095d13f6085f8d4d91 /server.c
parent9f3399da001580aa8b2118bb38245c7c5f26e944 (diff)
Sync OpenBSD patchset 806:
Store sessions in an RB tree by name rather than a list, this is tidier and allows them to easily be shown sorted in various lists (list-sessions/choose-sessions). Keep a session index which is used in a couple of places internally but make it an ever-increasing number rather than filling in gaps with new sessions.
Diffstat (limited to 'server.c')
-rw-r--r--server.c61
1 files changed, 27 insertions, 34 deletions
diff --git a/server.c b/server.c
index f1f9dce0..44a43692 100644
--- a/server.c
+++ b/server.c
@@ -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");