void link_wait (void) { if (!(link_is_thread_safe && link_is_io_in_thread)) { link_unlock (); link_main_iteration (TRUE); link_lock (); } else { g_assert (link_main_cond != NULL); g_cond_wait (link_main_cond, link_main_lock); } }
void link_push(Link* link ,M_Node* node){ link_lock(link); if (!link->rear) { link->front = link->rear = node; }else{ link->rear->next = node; link->rear = node; } link->node_count ++; link->size += node->data_buffer_size; link_unlock(link); }
M_Node* link_pop(Link* link){ link_lock(link); M_Node* node = link->front; if(node){ link->front = node->next; if(!link->front){ link->rear = link->front; } node->next = NULL; link->node_count --; link->size -= node->data_buffer_size; } link_unlock(link); return node; }
static void link_exec_set_io_thread (gpointer data, gboolean immediate) { GError *error = NULL; gboolean to_io_thread = TRUE; if (link_is_io_in_thread) return; link_lock (); g_mutex_lock (link_cmd_queue_lock); link_is_io_in_thread = TRUE; link_thread_context = g_main_context_new (); link_thread_loop = g_main_loop_new (link_thread_context, TRUE); link_connections_move_io_T (to_io_thread); link_servers_move_io_T (to_io_thread); if (link_pipe (link_wakeup_fds) < 0) g_error ("Can't create CORBA main-thread wakeup pipe"); link_main_source = link_source_create_watch (link_thread_context, LINK_WAKEUP_POLL, NULL, (G_IO_IN | G_IO_PRI), link_mainloop_handle_input, NULL); link_io_thread = g_thread_create_full (link_io_thread_fn, NULL, 256 * 1024, TRUE, FALSE, G_THREAD_PRIORITY_NORMAL, &error); if (!link_io_thread || error) g_error ("Failed to create linc worker thread"); g_main_loop_quit (link_loop); g_mutex_unlock (link_cmd_queue_lock); link_unlock (); }