void userlist_clear (session *sess) { fe_userlist_clear (sess); userlist_free (sess); fe_userlist_numbers (sess); }
static LIST_FREE_ITEM(session_free_item, session_t *) { xfree(data->alias); xfree(data->uid); xfree(data->descr); userlist_free(data); }
static void group_cache_drop(struct uldb_mysql_state *state) { struct xml_tree *p, *q; for (p = state->groups.first; p; p = q) { q = p->right; p->left = p->right = 0; userlist_free(p); } xfree(state->groups.group_map); memset(&state->groups, 0, sizeof(state->groups)); }
static void group_cache_remove_by_id(struct uldb_mysql_state *state, int group_id) { struct userlist_group *grp; if (group_id <= 0 || group_id >= state->groups.size) return; if (!(grp = state->groups.group_map[group_id])) return; state->groups.group_map[grp->group_id] = 0; state->groups.count--; UNLINK_FROM_LIST(&grp->b,state->groups.first,state->groups.last,left,right); userlist_free(&grp->b); memset(grp, 0, sizeof(*grp)); }
static void group_cache_remove(struct uldb_mysql_state *state, struct userlist_group *grp) { if (!grp) return; if (grp->group_id > 0 && grp->group_id < state->groups.size && state->groups.group_map[grp->group_id] == grp) { state->groups.group_map[grp->group_id] = 0; state->groups.count--; } UNLINK_FROM_LIST(&grp->b,state->groups.first,state->groups.last,left,right); userlist_free(&grp->b); memset(grp, 0, sizeof(*grp)); }
static void do_remove_session(struct session_info *p) { if (!p) return; if (!p->prev) { session_first = p->next; } else { p->prev->next = p->next; } if (!p->next) { session_last = p->prev; } else { p->next->prev = p->prev; } // cleanup p userlist_free(&p->user_info->b); xfree(p); }
static void do_remove_login_from_pool( struct users_cache *uc, struct userlist_user *u) { struct xml_tree *u_xml = (struct xml_tree*) u; if (!u) return; ASSERT(u->id > 0 && u->id < uc->size); uc->user_map[u->id] = 0; UNLINK_FROM_LIST(u_xml, uc->first, uc->last, left, right); // don't even try to free nested cntsregs and cookies if (u->contests) { u->contests->first_down = u->contests->last_down = 0; } if (u->cookies) { u->cookies->first_down = u->cookies->last_down = 0; } userlist_free(u_xml); uc->count--; }
void session_free (session *killsess) { server *killserv = killsess->server; session *sess; GSList *list; int oldidx; plugin_emit_dummy_print (killsess, "Close Context"); if (current_tab == killsess) current_tab = NULL; if (killserv->server_session == killsess) killserv->server_session = NULL; if (killserv->front_session == killsess) { /* front_session is closed, find a valid replacement */ killserv->front_session = NULL; list = sess_list; while (list) { sess = (session *) list->data; if (sess != killsess && sess->server == killserv) { killserv->front_session = sess; if (!killserv->server_session) killserv->server_session = sess; break; } list = list->next; } } if (!killserv->server_session) killserv->server_session = killserv->front_session; sess_list = g_slist_remove (sess_list, killsess); if (killsess->type == SESS_CHANNEL) userlist_free (killsess); oldidx = killsess->lastact_idx; if (oldidx != LACT_NONE) sess_list_by_lastact[oldidx] = g_list_remove(sess_list_by_lastact[oldidx], killsess); exec_notify_kill (killsess); log_close (killsess); scrollback_close (killsess); chanopt_save (killsess); send_quit_or_part (killsess); history_free (&killsess->history); if (killsess->topic) free (killsess->topic); if (killsess->current_modes) free (killsess->current_modes); fe_session_callback (killsess); if (current_sess == killsess) { current_sess = NULL; if (sess_list) current_sess = sess_list->data; } free (killsess); if (!sess_list && !in_hexchat_exit) hexchat_exit (); /* sess_list is empty, quit! */ list = sess_list; while (list) { sess = (session *) list->data; if (sess->server == killserv) return; /* this server is still being used! */ list = list->next; } server_free (killserv); }
void session_free (session *killsess) { server *killserv = killsess->server; session *sess; GSList *list; if (current_tab == killsess) current_tab = NULL; if (killserv->server_session == killsess) killserv->server_session = NULL; if (killserv->front_session == killsess) { /* front_session is closed, find a valid replacement */ killserv->front_session = NULL; list = sess_list; while (list) { sess = (session *) list->data; if (sess != killsess && sess->server == killserv) { killserv->front_session = sess; if (!killserv->server_session) killserv->server_session = sess; break; } list = list->next; } } if (!killserv->server_session) killserv->server_session = killserv->front_session; sess_list = g_slist_remove (sess_list, killsess); signal_emit("session destroy", 1, killsess); if (killsess->type == SESS_CHANNEL) userlist_free (killsess); log_close (killsess); scrollback_close (killsess); send_quit_or_part (killsess); history_free (&killsess->history); if (killsess->topic) free (killsess->topic); if (killsess->current_modes) free (killsess->current_modes); fe_session_callback (killsess); if (current_sess == killsess) { current_sess = NULL; if (sess_list) current_sess = sess_list->data; } if (killsess->lastact_elem) { if (killsess->lastact_idx != LACT_NONE) sess_list_by_lastact[killsess->lastact_idx] = g_list_delete_link(sess_list_by_lastact[killsess->lastact_idx], killsess->lastact_elem); else g_list_free_1(killsess->lastact_elem); } free (killsess); if (!sess_list && !in_xchat_exit) xchat_exit (); /* sess_list is empty, quit! */ list = sess_list; while (list) { sess = (session *) list->data; if (sess->server == killserv) return; /* this server is still being used! */ list = list->next; } server_free (killserv); }