Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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 ();
}