void mbb_session_del_var(struct mbb_var *var) { mbb_plock_writer_lock(); g_queue_remove(&var_queue, var); if (ht != NULL) { struct mbb_session_var *priv; struct mbb_session *ss; GHashTableIter iter; priv = mbb_var_get_priv(var); g_hash_table_iter_init(&iter, ht); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &ss)) { gpointer data; if (session_lookup_var(ss, var, &data)) { if (priv->op_free != NULL) priv->op_free(data); g_hash_table_remove(ss->vars, var); } } } mbb_plock_writer_unlock(); }
guint mbb_session_new(struct mbb_session *ss, gchar *peer, guint port, mbb_session_type type) { guint sid; ss->user = NULL; ss->peer = g_strdup(peer); ss->port = port; ss->type = type; time(&ss->start); ss->mtime = ss->start; ss->killed = FALSE; ss->kill_msg = NULL; session_vars_init(ss); mbb_plock_writer_lock(); sid = session_id++; if (ht == NULL) ht_init(); g_hash_table_insert(ht, GINT_TO_POINTER(sid), ss); mbb_plock_writer_unlock(); return sid; }
void mbb_session_quit(guint sid) { mbb_plock_writer_lock(); if (ht != NULL) g_hash_table_remove(ht, GINT_TO_POINTER(sid)); mbb_plock_writer_unlock(); }
static void mbb_task_free(struct mbb_task *task) { mbb_plock_writer_lock(); if (ht != NULL) g_hash_table_remove(ht, GINT_TO_POINTER(task->id)); mbb_plock_writer_unlock(); mbb_module_unuse(task->mod); mbb_user_unref(task->user); g_mutex_free(task->mutex); g_cond_free(task->cond); g_free(task); }
static struct mbb_task *mbb_task_new(GQuark name, struct mbb_task_hook *hook, gpointer data) { struct mbb_task *task; task = g_new(struct mbb_task, 1); task->name = name; time(&task->start); task->cancel = FALSE; task->run = TRUE; task->sid = mbb_thread_get_tid(); if (task->sid >= 0) task->user = mbb_user_ref(mbb_thread_get_user()); else { task->sid = mbb_task_get_tid(); task->user = mbb_user_ref(mbb_task_get_user()); } task->hook = hook; task->data = data; task->mutex = g_mutex_new(); task->cond = g_cond_new(); task->mod = mbb_module_last_used(); mbb_module_use(task->mod); mbb_plock_writer_lock(); if (ht == NULL) ht = g_hash_table_new(g_direct_hash, g_direct_equal); task->id = task_id++; g_hash_table_insert(ht, GINT_TO_POINTER(task->id), task); mbb_plock_writer_unlock(); return task; }
void mbb_session_add_var(struct mbb_var *var) { mbb_plock_writer_lock(); g_queue_push_tail(&var_queue, var); mbb_plock_writer_unlock(); }