Example #1
0
File: xrdp.c Project: dlinz/xrdp-ng
/* This function is used to run a function from the main thread.
 Sync_func is the function pointer that will run from main thread
 The function can have two long in parameters and must return long */
long g_xrdp_sync(long(*sync_func)(long param1, long param2), long sync_param1, long sync_param2)
{
	long sync_result;
	int sync_command;

	/* If the function is called from the main thread, the function can
	 * be called directly. g_threadid= main thread ID*/
	if (tc_threadid_equal(tc_get_threadid(), g_threadid))
	{
		/* this is the main thread, call the function directly */
		/* in fork mode, this always happens too */
		sync_result = sync_func(sync_param1, sync_param2);
		/*g_writeln("g_xrdp_sync processed IN main thread -> continue");*/
	}
	else
	{
		/* All threads have to wait here until the main thread
		 * process the function. g_process_waiting_function() is called
		 * from the listening thread. g_process_waiting_function() process the function*/
		tc_mutex_lock(g_sync1_mutex);
		tc_mutex_lock(g_sync_mutex);
		g_sync_param1 = sync_param1;
		g_sync_param2 = sync_param2;
		g_sync_func = sync_func;
		/* set a value THREAD_WAITING so the g_process_waiting_function function
		 * know if any function must be processed */
		g_sync_command = THREAD_WAITING;
		tc_mutex_unlock(g_sync_mutex);
		/* set this event so that the main thread know if
		 * g_process_waiting_function() must be called */
		SetEvent(g_SyncEvent);

		do
		{
			g_sleep(100);
			tc_mutex_lock(g_sync_mutex);
			/* load new value from global to see if the g_process_waiting_function()
			 * function has processed the function */
			sync_command = g_sync_command;
			sync_result = g_sync_result;
			tc_mutex_unlock(g_sync_mutex);
		} while (sync_command != 0); /* loop until g_process_waiting_function()

		 * has processed the request */
		tc_mutex_unlock(g_sync1_mutex);
		/*g_writeln("g_xrdp_sync processed BY main thread -> continue");*/
	}

	return sync_result;
}
Example #2
0
long APP_CC
g_xrdp_sync(long (*sync_func)(long param1, long param2), long sync_param1,
            long sync_param2)
{
    long sync_result;
    int sync_command;

    if (tc_threadid_equal(tc_get_threadid(), g_threadid))
    {
        /* this is the main thread, call the function directly */
        sync_result = sync_func(sync_param1, sync_param2);
    }
    else
    {
        tc_mutex_lock(g_sync1_mutex);
        tc_mutex_lock(g_sync_mutex);
        g_sync_param1 = sync_param1;
        g_sync_param2 = sync_param2;
        g_sync_func = sync_func;
        g_sync_command = 100;
        tc_mutex_unlock(g_sync_mutex);
        g_set_wait_obj(g_sync_event);

        do
        {
            g_sleep(100);
            tc_mutex_lock(g_sync_mutex);
            sync_command = g_sync_command;
            sync_result = g_sync_result;
            tc_mutex_unlock(g_sync_mutex);
        }
        while (sync_command != 0);

        tc_mutex_unlock(g_sync1_mutex);
    }

    return sync_result;
}