From c3d75fd5b4fbc1b2f29a48ca49313f41b194b6f2 Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Sun, 14 Aug 2011 22:32:12 +0800 Subject: [PATCH] libfreerdp-utils/svc_plugin: add interval feature. --- include/freerdp/utils/svc_plugin.h | 3 +++ include/freerdp/utils/thread.h | 1 + libfreerdp-utils/svc_plugin.c | 16 +++++++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/include/freerdp/utils/svc_plugin.h b/include/freerdp/utils/svc_plugin.h index 4de2f892d..2f18ecf86 100644 --- a/include/freerdp/utils/svc_plugin.h +++ b/include/freerdp/utils/svc_plugin.h @@ -35,9 +35,12 @@ struct rdp_svc_plugin CHANNEL_ENTRY_POINTS_EX channel_entry_points; CHANNEL_DEF channel_def; + int interval_ms; + void (*connect_callback)(rdpSvcPlugin* plugin); void (*receive_callback)(rdpSvcPlugin* plugin, STREAM* data_in); void (*event_callback)(rdpSvcPlugin* plugin, FRDP_EVENT* event); + void (*interval_callback)(rdpSvcPlugin* plugin); void (*terminate_callback)(rdpSvcPlugin* plugin); rdpSvcPluginPrivate* priv; diff --git a/include/freerdp/utils/thread.h b/include/freerdp/utils/thread.h index 8dab3bd86..cb4c4006d 100644 --- a/include/freerdp/utils/thread.h +++ b/include/freerdp/utils/thread.h @@ -43,6 +43,7 @@ void freerdp_thread_start(freerdp_thread* thread, void* func, void* arg); void freerdp_thread_stop(freerdp_thread* thread); #define freerdp_thread_wait(_t) wait_obj_select(_t->signals, _t->num_signals, -1) +#define freerdp_thread_wait_timeout(_t, _timeout) wait_obj_select(_t->signals, _t->num_signals, _timeout) #define freerdp_thread_is_stopped(_t) wait_obj_is_set(_t->signals[0]) #define freerdp_thread_quit(_t) _t->status = -1 #define freerdp_thread_signal(_t) wait_obj_set(_t->signals[1]) diff --git a/libfreerdp-utils/svc_plugin.c b/libfreerdp-utils/svc_plugin.c index aecf84e80..fbd7d1557 100644 --- a/libfreerdp-utils/svc_plugin.c +++ b/libfreerdp-utils/svc_plugin.c @@ -237,9 +237,9 @@ static void svc_plugin_process_data_in(rdpSvcPlugin* plugin) { /* the ownership of the data is passed to the callback */ if (item->data_in) - plugin->receive_callback(plugin, item->data_in); + IFCALL(plugin->receive_callback, plugin, item->data_in); if (item->event_in) - plugin->event_callback(plugin, item->event_in); + IFCALL(plugin->event_callback, plugin, item->event_in); xfree(item); } else @@ -253,17 +253,23 @@ static void* svc_plugin_thread_func(void* arg) DEBUG_SVC("in"); - plugin->connect_callback(plugin); + IFCALL(plugin->connect_callback, plugin); while (1) { - freerdp_thread_wait(plugin->priv->thread); + if (plugin->interval_ms > 0) + freerdp_thread_wait_timeout(plugin->priv->thread, plugin->interval_ms); + else + freerdp_thread_wait(plugin->priv->thread); if (freerdp_thread_is_stopped(plugin->priv->thread)) break; freerdp_thread_reset(plugin->priv->thread); svc_plugin_process_data_in(plugin); + + if (plugin->interval_ms > 0) + IFCALL(plugin->interval_callback, plugin); } freerdp_thread_quit(plugin->priv->thread); @@ -314,7 +320,7 @@ static void svc_plugin_process_terminated(rdpSvcPlugin* plugin) xfree(plugin->priv); plugin->priv = NULL; - plugin->terminate_callback(plugin); + IFCALL(plugin->terminate_callback, plugin); } static void svc_plugin_init_event(void* pInitHandle, uint32 event, void* pData, uint32 dataLength)