AmendHub

jcs

/

subtext

/

amendments

/

136

session: Turn sessions array into a static array of pointers

This doesn't need to keep moving around and resizing, walking it is
easy

jcs made amendment 136 5 months ago
--- session.c Wed Jun 8 21:55:55 2022 +++ session.c Sun Jun 12 09:38:55 2022 @@ -35,7 +35,7 @@ #include "console.h" -struct session **sessions = NULL; +struct session *sessions[MAX_SESSIONS] = { 0 }; short nsessions = 0; void session_run(struct uthread *uthread, void *arg); @@ -50,7 +50,13 @@ struct session * session_create(char *node, char *via, struct node_funcs *node_funcs) { struct session *session; + size_t n; + + if (nsessions >= MAX_SESSIONS) + return NULL; + nsessions++; + session = xmalloczero(sizeof(struct session)); session->uthread = uthread_add(session_run, session); if (!session->uthread) { @@ -64,11 +70,15 @@ session_create(char *node, char *via, struct node_func strlcpy(session->via, via, sizeof(session->via)); session->last_input_at = Time; - nsessions++; - sessions = xreallocarray(sessions, nsessions, sizeof(struct session)); - sessions[nsessions - 1] = session; + for (n = 0; n < MAX_SESSIONS; n++) { + if (sessions[n] == NULL) { + sessions[n] = session; + return session; + } + } - return session; + panic("session_create failed to find slot for new session (%d)", + nsessions); } void @@ -258,9 +268,9 @@ get_another_char: void session_close(struct session *session) { - struct session **newsessions; unsigned long now; - short newnsessions, n; + short n; + bool found; if (!session->ending) { /* give 1 second to flush output */ @@ -287,23 +297,20 @@ session_close(struct session *session) session->node_funcs->close(session); /* remove session from sessions */ - newnsessions = nsessions - 1; - if (newnsessions) { - newsessions = xcalloc(newnsessions, sizeof(struct session)); - nsessions = 0; - for (n = 0; n < newnsessions; n++) { - if (sessions[n] == session) - continue; - newsessions[nsessions++] = sessions[n]; + found = false; + for (n = 0; n < MAX_SESSIONS; n++) { + if (sessions[n] == session) { + sessions[n] = NULL; + found = true; + break; } - } else { - nsessions = 0; - newsessions = NULL; } - free(sessions); - sessions = newsessions; - free(session); + if (!found) + panic("session_close failed to find session to remove"); + + nsessions--; + free(sessions); } void @@ -1199,7 +1206,10 @@ session_who(struct session *s) "{{B}}Node User Via Speed Idle{{/B}}\r\n"); session_flush(s); - for (n = 0; n < nsessions; n++) { + for (n = 0; n < MAX_SESSIONS; n++) { + if (sessions[n] == NULL) + continue; + idle = Time - sessions[n]->last_input_at; if (idle < 60) sprintf(idle_s, "%lds", idle); --- session.h Tue Jun 7 21:21:41 2022 +++ session.h Sun Jun 12 09:24:34 2022 @@ -97,7 +97,8 @@ struct session { struct uthread *uthread; }; -extern struct session **sessions; +#define MAX_SESSIONS 20 +extern struct session *sessions[MAX_SESSIONS]; extern short nsessions; struct session_tally {