From dee76617d95e45624121e0149133686ebd072064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 15 Nov 2016 11:41:01 -0500 Subject: [PATCH] channels: remove thread-local storage usage --- channels/audin/client/alsa/audin_alsa.c | 2 +- channels/audin/client/oss/audin_oss.c | 2 -- channels/audin/server/audin.c | 1 - channels/cliprdr/client/cliprdr_main.c | 1 - channels/cliprdr/server/cliprdr_main.c | 2 +- channels/drdynvc/server/drdynvc_main.c | 2 +- channels/drive/client/drive_main.c | 1 - channels/echo/server/echo_main.c | 1 - channels/encomsp/client/encomsp_main.c | 2 +- channels/encomsp/server/encomsp_main.c | 2 +- channels/parallel/client/parallel_main.c | 1 - channels/printer/client/printer_main.c | 1 - channels/rail/client/rail_main.c | 1 - channels/rdpdr/client/rdpdr_main.c | 3 --- channels/rdpdr/server/rdpdr_main.c | 2 +- channels/rdpei/client/rdpei_main.c | 1 - channels/rdpgfx/server/rdpgfx_main.c | 2 +- channels/rdpsnd/client/rdpsnd_main.c | 3 +-- channels/rdpsnd/server/rdpsnd_main.c | 2 +- channels/remdesk/client/remdesk_main.c | 2 +- channels/remdesk/server/remdesk_main.c | 2 +- channels/serial/client/serial_main.c | 2 -- channels/smartcard/client/smartcard_main.c | 4 +-- channels/tsmf/client/tsmf_media.c | 3 +-- include/freerdp/freerdp.h | 4 --- libfreerdp/core/freerdp.c | 29 ---------------------- 26 files changed, 14 insertions(+), 64 deletions(-) diff --git a/channels/audin/client/alsa/audin_alsa.c b/channels/audin/client/alsa/audin_alsa.c index 73cca5fda..c776fa7e6 100644 --- a/channels/audin/client/alsa/audin_alsa.c +++ b/channels/audin/client/alsa/audin_alsa.c @@ -230,7 +230,7 @@ static void* audin_alsa_thread_func(void* arg) AudinALSADevice* alsa = (AudinALSADevice*) arg; DWORD status; DEBUG_DVC("in"); - freerdp_channel_init_thread_context(alsa->rdpcontext); + rbytes_per_frame = alsa->actual_channels * alsa->bytes_per_channel; tbytes_per_frame = alsa->target_channels * alsa->bytes_per_channel; buffer = (BYTE*) calloc(1, rbytes_per_frame * alsa->frames_per_packet); diff --git a/channels/audin/client/oss/audin_oss.c b/channels/audin/client/oss/audin_oss.c index 28edc3a0b..b1f3db735 100644 --- a/channels/audin/client/oss/audin_oss.c +++ b/channels/audin/client/oss/audin_oss.c @@ -190,8 +190,6 @@ static void* audin_oss_thread_func(void* arg) goto err_out; } - freerdp_channel_init_thread_context(oss->rdpcontext); - if (oss->dev_unit != -1) { sprintf_s(dev_name, (PATH_MAX - 1), "/dev/dsp%i", oss->dev_unit); diff --git a/channels/audin/server/audin.c b/channels/audin/server/audin.c index 39d4c7da4..cefef4cc6 100644 --- a/channels/audin/server/audin.c +++ b/channels/audin/server/audin.c @@ -417,7 +417,6 @@ static void* audin_server_thread_func(void* arg) buffer = NULL; BytesReturned = 0; ChannelEvent = NULL; - freerdp_channel_init_thread_context(audin->context.rdpcontext); if (WTSVirtualChannelQuery(audin->audin_channel, WTSVirtualEventHandle, &buffer, &BytesReturned) == TRUE) diff --git a/channels/cliprdr/client/cliprdr_main.c b/channels/cliprdr/client/cliprdr_main.c index 0cefefbcc..c0bcd2ae7 100644 --- a/channels/cliprdr/client/cliprdr_main.c +++ b/channels/cliprdr/client/cliprdr_main.c @@ -1052,7 +1052,6 @@ static void* cliprdr_virtual_channel_client_thread(void* arg) wMessage message; cliprdrPlugin* cliprdr = (cliprdrPlugin*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(cliprdr->context->rdpcontext); while (1) { diff --git a/channels/cliprdr/server/cliprdr_main.c b/channels/cliprdr/server/cliprdr_main.c index bbc98709a..80955c721 100644 --- a/channels/cliprdr/server/cliprdr_main.c +++ b/channels/cliprdr/server/cliprdr_main.c @@ -1328,7 +1328,7 @@ static void* cliprdr_server_thread(void* arg) CliprdrServerContext* context = (CliprdrServerContext*) arg; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; UINT error; - freerdp_channel_init_thread_context(context->rdpcontext); + ChannelEvent = context->GetEventHandle(context); nCount = 0; events[nCount++] = cliprdr->StopEvent; diff --git a/channels/drdynvc/server/drdynvc_main.c b/channels/drdynvc/server/drdynvc_main.c index 7dd71e216..bf2b40e17 100644 --- a/channels/drdynvc/server/drdynvc_main.c +++ b/channels/drdynvc/server/drdynvc_main.c @@ -49,7 +49,7 @@ static void* drdynvc_server_thread(void* arg) buffer = NULL; BytesReturned = 0; ChannelEvent = NULL; - freerdp_channel_init_thread_context(context->rdpcontext); + s = Stream_New(NULL, 4096); if (!s) diff --git a/channels/drive/client/drive_main.c b/channels/drive/client/drive_main.c index 41ba19168..1df2dddc1 100644 --- a/channels/drive/client/drive_main.c +++ b/channels/drive/client/drive_main.c @@ -683,7 +683,6 @@ static void* drive_thread_func(void* arg) wMessage message; DRIVE_DEVICE* drive = (DRIVE_DEVICE*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(drive->rdpcontext); while (1) { diff --git a/channels/echo/server/echo_main.c b/channels/echo/server/echo_main.c index e4ae1e8c7..277a37e6a 100644 --- a/channels/echo/server/echo_main.c +++ b/channels/echo/server/echo_main.c @@ -117,7 +117,6 @@ static void* echo_server_thread_func(void* arg) echo_server* echo = (echo_server*) arg; UINT error; DWORD status; - freerdp_channel_init_thread_context(echo->context.rdpcontext); if ((error = echo_server_open_channel(echo))) { diff --git a/channels/encomsp/client/encomsp_main.c b/channels/encomsp/client/encomsp_main.c index d896d316b..6f2e8302c 100644 --- a/channels/encomsp/client/encomsp_main.c +++ b/channels/encomsp/client/encomsp_main.c @@ -1045,7 +1045,7 @@ static void* encomsp_virtual_channel_client_thread(void* arg) wMessage message; encomspPlugin* encomsp = (encomspPlugin*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(encomsp->rdpcontext); + encomsp_process_connect(encomsp); while (1) diff --git a/channels/encomsp/server/encomsp_main.c b/channels/encomsp/server/encomsp_main.c index 4116c152d..4c3cbae0b 100644 --- a/channels/encomsp/server/encomsp_main.c +++ b/channels/encomsp/server/encomsp_main.c @@ -187,7 +187,7 @@ static void* encomsp_server_thread(void* arg) UINT error = CHANNEL_RC_OK; DWORD status; context = (EncomspServerContext*) arg; - freerdp_channel_init_thread_context(context->rdpcontext); + buffer = NULL; BytesReturned = 0; ChannelEvent = NULL; diff --git a/channels/parallel/client/parallel_main.c b/channels/parallel/client/parallel_main.c index dda95ce0a..c38e4dedd 100644 --- a/channels/parallel/client/parallel_main.c +++ b/channels/parallel/client/parallel_main.c @@ -310,7 +310,6 @@ static void* parallel_thread_func(void* arg) wMessage message; PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(parallel->rdpcontext); while (1) { diff --git a/channels/printer/client/printer_main.c b/channels/printer/client/printer_main.c index 6a569a0c9..210cb7772 100644 --- a/channels/printer/client/printer_main.c +++ b/channels/printer/client/printer_main.c @@ -237,7 +237,6 @@ static void* printer_thread_func(void* arg) PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*) arg; HANDLE obj[] = {printer_dev->event, printer_dev->stopEvent}; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(printer_dev->rdpcontext); while (1) { diff --git a/channels/rail/client/rail_main.c b/channels/rail/client/rail_main.c index 14f85631b..456598d37 100644 --- a/channels/rail/client/rail_main.c +++ b/channels/rail/client/rail_main.c @@ -586,7 +586,6 @@ static void* rail_virtual_channel_client_thread(void* arg) wMessage message; railPlugin* rail = (railPlugin*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(rail->rdpcontext); while (1) { diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index 0c8fdb1d1..0b1062d79 100755 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -864,7 +864,6 @@ static void* drive_hotplug_thread_func(void* arg) UINT error = 0; DWORD status; rdpdr = (rdpdrPlugin*) arg; - freerdp_channel_init_thread_context(rdpdr->rdpcontext); if (!(rdpdr->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL))) { @@ -1563,8 +1562,6 @@ static void* rdpdr_virtual_channel_client_thread(void* arg) return NULL; } - freerdp_channel_init_thread_context(rdpdr->rdpcontext); - if ((error = rdpdr_process_connect(rdpdr))) { WLog_ERR(TAG, "rdpdr_process_connect failed with error %lu!", error); diff --git a/channels/rdpdr/server/rdpdr_main.c b/channels/rdpdr/server/rdpdr_main.c index 397cd7860..2ee788594 100644 --- a/channels/rdpdr/server/rdpdr_main.c +++ b/channels/rdpdr/server/rdpdr_main.c @@ -1151,7 +1151,7 @@ static void* rdpdr_server_thread(void* arg) buffer = NULL; BytesReturned = 0; ChannelEvent = NULL; - freerdp_channel_init_thread_context(context->rdpcontext); + s = Stream_New(NULL, 4096); if (!s) diff --git a/channels/rdpei/client/rdpei_main.c b/channels/rdpei/client/rdpei_main.c index 01777236a..d3fa8f256 100644 --- a/channels/rdpei/client/rdpei_main.c +++ b/channels/rdpei/client/rdpei_main.c @@ -176,7 +176,6 @@ static void* rdpei_schedule_thread(void* arg) RdpeiClientContext* context = (RdpeiClientContext*) rdpei->iface.pInterface; HANDLE hdl[] = {rdpei->event, rdpei->stopEvent}; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(rdpei->rdpcontext); if (!rdpei) { diff --git a/channels/rdpgfx/server/rdpgfx_main.c b/channels/rdpgfx/server/rdpgfx_main.c index 1f471d304..63aefbae0 100644 --- a/channels/rdpgfx/server/rdpgfx_main.c +++ b/channels/rdpgfx/server/rdpgfx_main.c @@ -1335,7 +1335,7 @@ static void* rdpgfx_server_thread_func(void* arg) buffer = NULL; BytesReturned = 0; nCount = 0; - freerdp_channel_init_thread_context(context->rdpcontext); + events[nCount++] = priv->stopEvent; events[nCount++] = priv->channelEvent; diff --git a/channels/rdpsnd/client/rdpsnd_main.c b/channels/rdpsnd/client/rdpsnd_main.c index 1194e00e3..b400909c6 100644 --- a/channels/rdpsnd/client/rdpsnd_main.c +++ b/channels/rdpsnd/client/rdpsnd_main.c @@ -113,7 +113,7 @@ static void* rdpsnd_schedule_thread(void* arg) HANDLE events[2]; UINT error = CHANNEL_RC_OK; DWORD status; - freerdp_channel_init_thread_context(rdpsnd->rdpcontext); + events[0] = MessageQueue_Event(rdpsnd->MsgPipe->Out); events[1] = rdpsnd->stopEvent; @@ -1247,7 +1247,6 @@ static void* rdpsnd_virtual_channel_client_thread(void* arg) wMessage message; rdpsndPlugin* rdpsnd = (rdpsndPlugin*) arg; UINT error; - freerdp_channel_init_thread_context(rdpsnd->rdpcontext); if ((error = rdpsnd_process_connect(rdpsnd))) { diff --git a/channels/rdpsnd/server/rdpsnd_main.c b/channels/rdpsnd/server/rdpsnd_main.c index f62ebf555..09f6d27a0 100644 --- a/channels/rdpsnd/server/rdpsnd_main.c +++ b/channels/rdpsnd/server/rdpsnd_main.c @@ -246,7 +246,7 @@ static void* rdpsnd_server_thread(void* arg) RdpsndServerContext* context; UINT error = CHANNEL_RC_OK; context = (RdpsndServerContext*)arg; - freerdp_channel_init_thread_context(context->rdpcontext); + nCount = 0; events[nCount++] = context->priv->channelEvent; events[nCount++] = context->priv->StopEvent; diff --git a/channels/remdesk/client/remdesk_main.c b/channels/remdesk/client/remdesk_main.c index 52711b07f..9dea16ba1 100644 --- a/channels/remdesk/client/remdesk_main.c +++ b/channels/remdesk/client/remdesk_main.c @@ -848,7 +848,7 @@ static void* remdesk_virtual_channel_client_thread(void* arg) wMessage message; remdeskPlugin* remdesk = (remdeskPlugin*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(remdesk->rdpcontext); + remdesk_process_connect(remdesk); while (1) diff --git a/channels/remdesk/server/remdesk_main.c b/channels/remdesk/server/remdesk_main.c index 36feb2cbb..45317407d 100644 --- a/channels/remdesk/server/remdesk_main.c +++ b/channels/remdesk/server/remdesk_main.c @@ -592,7 +592,7 @@ static void* remdesk_server_thread(void* arg) RemdeskServerContext* context; UINT error; context = (RemdeskServerContext*) arg; - freerdp_channel_init_thread_context(context->rdpcontext); + buffer = NULL; BytesReturned = 0; ChannelEvent = NULL; diff --git a/channels/serial/client/serial_main.c b/channels/serial/client/serial_main.c index c97ea210d..6d04df141 100644 --- a/channels/serial/client/serial_main.c +++ b/channels/serial/client/serial_main.c @@ -462,7 +462,6 @@ static void* irp_thread_func(void* arg) { IRP_THREAD_DATA* data = (IRP_THREAD_DATA*)arg; UINT error; - freerdp_channel_init_thread_context(data->serial->rdpcontext); /* blocks until the end of the request */ if ((error = serial_process_irp(data->serial, data->irp))) @@ -680,7 +679,6 @@ static void* serial_thread_func(void* arg) wMessage message; SERIAL_DEVICE* serial = (SERIAL_DEVICE*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(serial->rdpcontext); while (1) { diff --git a/channels/smartcard/client/smartcard_main.c b/channels/smartcard/client/smartcard_main.c index 9b046378f..0d2e3151f 100644 --- a/channels/smartcard/client/smartcard_main.c +++ b/channels/smartcard/client/smartcard_main.c @@ -45,7 +45,7 @@ void* smartcard_context_thread(SMARTCARD_CONTEXT* pContext) SMARTCARD_OPERATION* operation; UINT error = CHANNEL_RC_OK; smartcard = pContext->smartcard; - freerdp_channel_init_thread_context(smartcard->rdpcontext); + nCount = 0; hEvents[nCount++] = MessageQueue_Event(pContext->IrpQueue); @@ -516,7 +516,7 @@ static void* smartcard_thread_func(void* arg) wMessage message; SMARTCARD_DEVICE* smartcard = (SMARTCARD_DEVICE*) arg; UINT error = CHANNEL_RC_OK; - freerdp_channel_init_thread_context(smartcard->rdpcontext); + nCount = 0; hEvents[nCount++] = MessageQueue_Event(smartcard->IrpQueue); hEvents[nCount++] = Queue_Event(smartcard->CompletedIrpQueue); diff --git a/channels/tsmf/client/tsmf_media.c b/channels/tsmf/client/tsmf_media.c index 17af1fa4e..c4c6c2969 100644 --- a/channels/tsmf/client/tsmf_media.c +++ b/channels/tsmf/client/tsmf_media.c @@ -718,7 +718,7 @@ static void* tsmf_stream_ack_func(void* arg) TSMF_STREAM* stream = (TSMF_STREAM*) arg; UINT error = CHANNEL_RC_OK; DEBUG_TSMF("in %d", stream->stream_id); - freerdp_channel_init_thread_context(stream->rdpcontext); + hdl[0] = stream->stopEvent; hdl[1] = Queue_Event(stream->sample_ack_list); @@ -806,7 +806,6 @@ static void* tsmf_stream_playback_func(void* arg) UINT error = CHANNEL_RC_OK; DWORD status; DEBUG_TSMF("in %d", stream->stream_id); - freerdp_channel_init_thread_context(stream->rdpcontext); if (stream->major_type == TSMF_MAJOR_TYPE_AUDIO && stream->sample_rate && stream->channels && stream->bits_per_sample) diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h index 0f7177747..4abe1fb47 100644 --- a/include/freerdp/freerdp.h +++ b/include/freerdp/freerdp.h @@ -307,10 +307,6 @@ FREERDP_API BOOL freerdp_shall_disconnect(freerdp* instance); FREERDP_API BOOL freerdp_disconnect(freerdp* instance); FREERDP_API BOOL freerdp_reconnect(freerdp* instance); -FREERDP_API void freerdp_channel_init_thread_context(rdpContext* context); -FREERDP_API freerdp* freerdp_channel_get_instance(void); -FREERDP_API rdpContext* freerdp_channel_get_context(void); - FREERDP_API UINT freerdp_channel_add_init_handle_data(rdpChannelHandles* handles, void* pInitHandle, void* pUserData); FREERDP_API void* freerdp_channel_get_init_handle_data(rdpChannelHandles* handles, void* pInitHandle); FREERDP_API void freerdp_channel_remove_init_handle_data(rdpChannelHandles* handles, void* pInitHandle); diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 8fd967a92..ee974ac2d 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -51,34 +51,6 @@ /* connectErrorCode is 'extern' in error.h. See comment there.*/ -/* Thread local storage variables. - * They need to be initialized in every thread that - * has to use them. */ -static WINPR_TLS rdpContext* s_TLSContext = NULL; - -void freerdp_channel_init_thread_context(rdpContext* context) -{ - s_TLSContext = context; -} - -freerdp* freerdp_channel_get_instance(void) -{ - if (!s_TLSContext) - { - WLog_ERR(TAG, - "Funcion was called from thread that did not call freerdp_channel_init_thread_context"); - winpr_log_backtrace(TAG, WLOG_ERROR, 20); - return NULL; - } - - return s_TLSContext->instance; -} - -rdpContext* freerdp_channel_get_context(void) -{ - return s_TLSContext; -} - UINT freerdp_channel_add_init_handle_data(rdpChannelHandles* handles, void* pInitHandle, void* pUserData) { if (!handles->init) @@ -181,7 +153,6 @@ BOOL freerdp_connect(freerdp* instance) if (!instance) return FALSE; - freerdp_channel_init_thread_context(instance->context); /* We always set the return code to 0 before we start the connect sequence*/ connectErrorCode = 0; freerdp_set_last_error(instance->context, FREERDP_ERROR_SUCCESS);