/*****************************************************************************/ /* This function is used to run a function from the main thread. Sync_funcisthefunctionpointerthatwillrunfrommainthread
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);
LOG_DEVEL(LOG_LEVEL_DEBUG, "g_xrdp_sync processed IN main thread -> continue");
} else
{ /* All threads have to wait here until the main thread *processthefunction.g_process_waiting_function()iscalled
* 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 */
g_set_wait_obj(g_sync_event);
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);
LOG_DEVEL(LOG_LEVEL_DEBUG, "g_xrdp_sync processed BY main thread -> continue");
}
return sync_result;
}
/*****************************************************************************/ /* Signal handler for SIGCHLD in the child *Note:onlysignalsafecode(eg.settingwaitevent)shouldbeexecutedin *thisfunction.Formoredetailssee`mansignal-safety`
*/ staticvoid
xrdp_child_sigchld_handler(int sig)
{ while (g_waitchild(NULL) > 0)
{
}
}
/*****************************************************************************/ /* called in child just after fork */ int
xrdp_child_fork(void)
{ int pid; char text[256];
/* SIGCHLD in the child is of no interest to us */
g_signal_child_stop(xrdp_child_sigchld_handler); /* SIGCHLD */
/*****************************************************************************/ /*Some function must be called from the main thread.
if g_sync_command==THREAD_WAITING a function is waiting to be processed*/ void
g_process_waiting_function(void)
{
tc_mutex_lock(g_sync_mutex);
if (g_sync_command != 0)
{ if (g_sync_func != 0)
{ if (g_sync_command == THREAD_WAITING)
{
g_sync_result = g_sync_func(g_sync_param1, g_sync_param2);
}
}
g_sync_command = 0;
}
tc_mutex_unlock(g_sync_mutex);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-07-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.