From 9bd13c25c96610b847c43333513cae5e2476f447 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 8 Mar 2018 13:46:46 +0100 Subject: [PATCH] Added WaitableTimer implementation for mac OS. --- client/Mac/MRDPView.m | 7 +- client/X11/xf_client.c | 6 +- client/common/cmdline.c | 4 +- include/freerdp/client/cmdline.h | 4 +- scripts/format_code.sh | 23 +-- winpr/libwinpr/synch/critical.c | 23 ++- winpr/libwinpr/synch/synch.h | 16 +- winpr/libwinpr/synch/test/TestSynchWaitableTimer.c | 31 +--- .../synch/test/TestSynchWaitableTimerAPC.c | 16 +- winpr/libwinpr/synch/timer.c | 198 ++++++++++++++++++--- 10 files changed, 234 insertions(+), 94 deletions(-) diff --git a/client/Mac/MRDPView.m b/client/Mac/MRDPView.m index d98982b..20184ee 100644 --- a/client/Mac/MRDPView.m +++ b/client/Mac/MRDPView.m @@ -135,7 +135,7 @@ static DWORD mac_client_update_thread(void* param) return 0; } -static DWORD mac_client_input_thread(void* param) +static DWORD WINAPI mac_client_input_thread(LPVOID param) { int status; wMessage message; @@ -194,8 +194,7 @@ DWORD mac_client_thread(void* param) if (settings->AsyncInput) { - if (!(inputThread = CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE) mac_client_input_thread, context, 0, NULL))) + if (!(inputThread = CreateThread(NULL, 0, mac_client_input_thread, context, 0, NULL))) { WLog_ERR(TAG, "failed to create async input thread"); goto disconnect; @@ -738,7 +737,7 @@ DWORD fixKeyCode(DWORD keyCode, unichar keyChar, enum APPLE_KEYBOARD_TYPE type) - (void) onPasteboardTimerFired :(NSTimer*) timer { - BYTE* data; + const BYTE* data; UINT32 size; UINT32 formatId; BOOL formatMatch; diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 05ee012..fba5b4a 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1521,7 +1521,7 @@ static DWORD WINAPI xf_client_thread(LPVOID param) } settings = context->settings; - timer = CreateWaitableTimerA(NULL, FALSE, NULL); + timer = CreateWaitableTimerA(NULL, FALSE, "mainloop-periodic-timer"); if (!timer) { @@ -1581,7 +1581,7 @@ static DWORD WINAPI xf_client_thread(LPVOID param) nCount += tmp; } - waitStatus = WaitForMultipleObjects(nCount, handles, FALSE, 100); + waitStatus = WaitForMultipleObjects(nCount, handles, FALSE, INFINITE); if (waitStatus == WAIT_FAILED) break; @@ -1609,7 +1609,7 @@ static DWORD WINAPI xf_client_thread(LPVOID param) } } - if (status != WAIT_TIMEOUT && WaitForSingleObject(timer, 0)) + if ((status != WAIT_TIMEOUT) && (waitStatus == WAIT_OBJECT_0)) { timerEvent.now = GetTickCount64(); PubSub_OnTimer(context->pubSub, context, &timerEvent); diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 29dff25..1a8c829 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -817,7 +817,7 @@ static int freerdp_client_command_line_post_filter(void* context, return status ? 1 : -1; } -BOOL freerdp_parse_username(char* username, char** user, char** domain) +BOOL freerdp_parse_username(const char* username, char** user, char** domain) { char* p; int length = 0; @@ -871,7 +871,7 @@ BOOL freerdp_parse_username(char* username, char** user, char** domain) return TRUE; } -BOOL freerdp_parse_hostname(char* hostname, char** host, int* port) +BOOL freerdp_parse_hostname(const char* hostname, char** host, int* port) { char* p; p = strrchr(hostname, ':'); diff --git a/include/freerdp/client/cmdline.h b/include/freerdp/client/cmdline.h index 4c4337e..065d973 100644 --- a/include/freerdp/client/cmdline.h +++ b/include/freerdp/client/cmdline.h @@ -44,8 +44,8 @@ FREERDP_API BOOL freerdp_client_print_command_line_help(int argc, char** argv); FREERDP_API BOOL freerdp_client_print_command_line_help_ex( int argc, char** argv, COMMAND_LINE_ARGUMENT_A* custom); -FREERDP_API BOOL freerdp_parse_username(char* username, char** user, char** domain); -FREERDP_API BOOL freerdp_parse_hostname(char* hostname, char** host, int* port); +FREERDP_API BOOL freerdp_parse_username(const char* username, char** user, char** domain); +FREERDP_API BOOL freerdp_parse_hostname(const char* hostname, char** host, int* port); FREERDP_API BOOL freerdp_set_connection_type(rdpSettings* settings, int type); FREERDP_API BOOL freerdp_client_add_device_channel(rdpSettings* settings, int count, char** params); diff --git a/scripts/format_code.sh b/scripts/format_code.sh index 92ed9b9..3ad769b 100755 --- a/scripts/format_code.sh +++ b/scripts/format_code.sh @@ -14,14 +14,17 @@ VERSION=$(echo $STR_VERSION | cut -d ' ' -f4) MAJOR_VERSION=$(echo $VERSION | cut -d'.' -f1) MINOR_VERSION=$(echo $VERSION | cut -d'.' -f2) -if [ "$MAJOR_VERSION" -lt "2" ]; then - echo "Your version of astyle($VERSION) is too old, need at least 2.03" - exit 1 -fi - -if [ "$MINOR_VERSION" -lt "3" ]; then +if [ "$MAJOR_VERSION" -lt "2" ]; +then echo "Your version of astyle($VERSION) is too old, need at least 2.03" exit 1 +elif [ "$MAJOR_VERSION" -eq "2" ]; +then + if [ "$MINOR_VERSION" -lt "3" ]; + then + echo "Your version of astyle($VERSION) is too old, need at least 2.03" + exit 1 + fi fi if [ $# -le 0 ]; then @@ -31,9 +34,9 @@ if [ $# -le 0 ]; then fi $ASTYLE --lineend=linux --mode=c --indent=tab=4 --pad-header --pad-oper --style=allman --min-conditional-indent=0 \ - --indent-switches --indent-cases --indent-preprocessor -k1 --max-code-length=100 \ - --indent-col1-comments --delete-empty-lines --break-closing-brackets \ - --align-pointer=type --indent-labels -xe --break-after-logical \ - --unpad-paren --break-blocks $@ + --indent-switches --indent-cases --indent-preprocessor -k1 --max-code-length=100 \ + --indent-col1-comments --delete-empty-lines --break-closing-brackets \ + --align-pointer=type --indent-labels -xe --break-after-logical \ + --unpad-paren --break-blocks $@ exit $? diff --git a/winpr/libwinpr/synch/critical.c b/winpr/libwinpr/synch/critical.c index fe2fdfe..610072b 100644 --- a/winpr/libwinpr/synch/critical.c +++ b/winpr/libwinpr/synch/critical.c @@ -34,6 +34,12 @@ #include #endif +#if defined(__APPLE__) +#include +#include +#include +#endif + #ifndef _WIN32 #include "../log.h" @@ -44,7 +50,8 @@ VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) InitializeCriticalSectionEx(lpCriticalSection, 0, 0); } -BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags) +BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, + DWORD Flags) { /** * See http://msdn.microsoft.com/en-us/library/ff541979(v=vs.85).aspx @@ -67,18 +74,24 @@ BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwS lpCriticalSection->RecursionCount = 0; lpCriticalSection->OwningThread = NULL; lpCriticalSection->LockSemaphore = (winpr_sem_t*) malloc(sizeof(winpr_sem_t)); + if (!lpCriticalSection->LockSemaphore) return FALSE; + #if defined(__APPLE__) - if (semaphore_create(mach_task_self(), lpCriticalSection->LockSemaphore, SYNC_POLICY_FIFO, 0) != KERN_SUCCESS) + + if (semaphore_create(mach_task_self(), lpCriticalSection->LockSemaphore, SYNC_POLICY_FIFO, + 0) != KERN_SUCCESS) goto out_fail; + #else - if(sem_init(lpCriticalSection->LockSemaphore, 0, 0) != 0) + + if (sem_init(lpCriticalSection->LockSemaphore, 0, 0) != 0) goto out_fail; + #endif SetCriticalSectionSpinCount(lpCriticalSection, dwSpinCount); return TRUE; - out_fail: free(lpCriticalSection->LockSemaphore); return FALSE; @@ -150,7 +163,7 @@ VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) } /* Failed to get the lock. Let the scheduler know that we're spinning. */ - if (sched_yield()!=0) + if (sched_yield() != 0) { /** * On some operating systems sched_yield is a stub. diff --git a/winpr/libwinpr/synch/synch.h b/winpr/libwinpr/synch/synch.h index d4948c3..b0f0db2 100644 --- a/winpr/libwinpr/synch/synch.h +++ b/winpr/libwinpr/synch/synch.h @@ -86,6 +86,10 @@ typedef struct winpr_event WINPR_EVENT; #include #endif +#if defined(__APPLE__) +#include +#endif + struct winpr_timer { WINPR_HANDLE_DEF(); @@ -96,11 +100,17 @@ struct winpr_timer BOOL bManualReset; PTIMERAPCROUTINE pfnCompletionRoutine; LPVOID lpArgToCompletionRoutine; - + #ifdef WITH_POSIX_TIMER timer_t tid; struct itimerspec timeout; #endif +#if defined(__APPLE__) + dispatch_queue_t queue; + dispatch_source_t source; + int pipe[2]; + BOOL running; +#endif }; typedef struct winpr_timer WINPR_TIMER; @@ -109,7 +119,7 @@ typedef struct winpr_timer_queue_timer WINPR_TIMER_QUEUE_TIMER; struct winpr_timer_queue { WINPR_HANDLE_DEF(); - + pthread_t thread; pthread_attr_t attr; pthread_mutex_t mutex; @@ -132,7 +142,7 @@ struct winpr_timer_queue_timer DWORD Period; PVOID Parameter; WAITORTIMERCALLBACK Callback; - + int FireCount; struct timespec StartTime; diff --git a/winpr/libwinpr/synch/test/TestSynchWaitableTimer.c b/winpr/libwinpr/synch/test/TestSynchWaitableTimer.c index c0efd48..25e8f02 100644 --- a/winpr/libwinpr/synch/test/TestSynchWaitableTimer.c +++ b/winpr/libwinpr/synch/test/TestSynchWaitableTimer.c @@ -9,7 +9,6 @@ int TestSynchWaitableTimer(int argc, char* argv[]) LONG period; LARGE_INTEGER due; int result = -1; - timer = CreateWaitableTimer(NULL, FALSE, NULL); if (!timer) @@ -35,17 +34,16 @@ int TestSynchWaitableTimer(int argc, char* argv[]) } printf("Timer Signaled\n"); - status = WaitForSingleObject(timer, 2000); if (status != WAIT_TIMEOUT) { - printf("WaitForSingleObject(timer, 2000) failure: Actual: 0x%08"PRIX32", Expected: 0x%08X\n", status, WAIT_TIMEOUT); + printf("WaitForSingleObject(timer, 2000) failure: Actual: 0x%08"PRIX32", Expected: 0x%08X\n", + status, WAIT_TIMEOUT); goto out; } due.QuadPart = 0; - period = 1200; /* 1.2 seconds */ if (!SetWaitableTimer(timer, &due, period, NULL, NULL, 0)) @@ -62,6 +60,12 @@ int TestSynchWaitableTimer(int argc, char* argv[]) printf("Timer Signaled\n"); + if (!SetWaitableTimer(timer, &due, period, NULL, NULL, 0)) + { + printf("SetWaitableTimer failure\n"); + goto out; + } + if (WaitForMultipleObjects(1, &timer, FALSE, INFINITE) != WAIT_OBJECT_0) { printf("WaitForMultipleObjects(timer, INFINITE) failure\n"); @@ -69,28 +73,9 @@ int TestSynchWaitableTimer(int argc, char* argv[]) } printf("Timer Signaled\n"); - result = 0; - out: CloseHandle(timer); - - -#ifdef __APPLE__ - if (result == 0) - { - printf("%s: Error, this test is currently expected not to succeed on this platform.\n", - __FUNCTION__); - result = -1; - } - else - { - printf("%s: This test is currently expected to fail on this platform.\n", - __FUNCTION__); - result = 0; - } -#endif - return result; } diff --git a/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c b/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c index 0bfaf9f..97f3e26 100644 --- a/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c +++ b/winpr/libwinpr/synch/test/TestSynchWaitableTimerAPC.c @@ -12,7 +12,7 @@ struct apc_data }; typedef struct apc_data APC_DATA; -VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue) +static VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue) { APC_DATA* apcData; UINT32 CurrentTime = GetTickCount(); @@ -108,20 +108,6 @@ cleanup: CloseHandle(g_Event); free(apcData); -#ifdef __APPLE__ - if (status == 0) - { - printf("%s: Error, this test is currently expected not to succeed on this platform.\n", - __FUNCTION__); - status = -1; - } - else - { - printf("%s: This test is currently expected to fail on this platform.\n", - __FUNCTION__); - status = 0; - } -#endif return status; } diff --git a/winpr/libwinpr/synch/timer.c b/winpr/libwinpr/synch/timer.c index 37746c4..dbd628f 100644 --- a/winpr/libwinpr/synch/timer.c +++ b/winpr/libwinpr/synch/timer.c @@ -77,14 +77,24 @@ static DWORD TimerCleanupHandle(HANDLE handle) if (!TimerIsHandled(handle)) return WAIT_FAILED; + if (timer->bManualReset) + return WAIT_OBJECT_0; + length = read(timer->fd, (void*) &expirations, sizeof(UINT64)); if (length != 8) { if (length == -1) { - if (errno == ETIMEDOUT) - return WAIT_TIMEOUT; + switch (errno) + { + case ETIMEDOUT: + case EAGAIN: + return WAIT_TIMEOUT; + + default: + break; + } WLog_ERR(TAG, "timer read() failure [%d] %s", errno, strerror(errno)); } @@ -123,6 +133,17 @@ BOOL TimerCloseHandle(HANDLE handle) #endif } +#if defined(__APPLE__) + dispatch_release(timer->queue); + dispatch_release(timer->source); + + if (timer->pipe[0] != -1) + close(timer->pipe[0]); + + if (timer->pipe[1] != -1) + close(timer->pipe[1]); + +#endif free(timer); return TRUE; } @@ -131,11 +152,11 @@ BOOL TimerCloseHandle(HANDLE handle) static BOOL g_WaitableTimerSignalHandlerInstalled = FALSE; -static void WaitableTimerSignalHandler(int signum, siginfo_t* siginfo, void* arg) +static void WaitableTimerHandler(void* arg) { - WINPR_TIMER* timer = siginfo->si_value.sival_ptr; + WINPR_TIMER* timer = (WINPR_TIMER*)arg; - if (!timer || (signum != SIGALRM)) + if (!timer) return; if (timer->pfnCompletionRoutine) @@ -154,6 +175,15 @@ static void WaitableTimerSignalHandler(int signum, siginfo_t* siginfo, void* arg } } } +static void WaitableTimerSignalHandler(int signum, siginfo_t* siginfo, void* arg) +{ + WINPR_TIMER* timer = siginfo->si_value.sival_ptr; + + if (!timer || (signum != SIGALRM)) + return; + + WaitableTimerHandler(timer); +} static int InstallWaitableTimerSignalHandler(void) { @@ -173,7 +203,31 @@ static int InstallWaitableTimerSignalHandler(void) #endif -int InitializeWaitableTimer(WINPR_TIMER* timer) +#if defined(__APPLE__) +static void WaitableTimerHandler(void* arg) +{ + UINT64 data = 1; + WINPR_TIMER* timer = (WINPR_TIMER*)arg; + + if (!timer) + return; + + if (timer->pfnCompletionRoutine) + timer->pfnCompletionRoutine(timer->lpArgToCompletionRoutine, 0, 0); + + if (write(timer->pipe[1], &data, sizeof(data)) != sizeof(data)) + WLog_ERR(TAG, "failed to write to pipe"); + + if (timer->lPeriod == 0) + { + if (timer->running) + dispatch_suspend(timer->source); + timer->running = FALSE; + } +} +#endif + +static int InitializeWaitableTimer(WINPR_TIMER* timer) { int result = 0; @@ -197,6 +251,7 @@ int InitializeWaitableTimer(WINPR_TIMER* timer) return -1; } +#elif defined(__APPLE__) #else WLog_ERR(TAG, "%s: os specific implementation is missing", __FUNCTION__); result = -1; @@ -218,6 +273,7 @@ int InitializeWaitableTimer(WINPR_TIMER* timer) return -1; } +#elif defined(__APPLE__) #else WLog_ERR(TAG, "%s: os specific implementation is missing", __FUNCTION__); result = -1; @@ -259,15 +315,49 @@ HANDLE CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManua timer->lpArgToCompletionRoutine = NULL; timer->bInit = FALSE; timer->ops = &ops; +#if defined(__APPLE__) + + if (pipe(timer->pipe) != 0) + goto fail; + + timer->queue = dispatch_queue_create(TAG, DISPATCH_QUEUE_SERIAL); + + if (!timer->queue) + goto fail; + + timer->source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, timer->queue); + + if (!timer->source) + goto fail; + + dispatch_set_context(timer->source, timer); + dispatch_source_set_event_handler_f(timer->source, WaitableTimerHandler); + timer->fd = timer->pipe[0]; + if (fcntl(timer->fd, F_SETFL, O_NONBLOCK) < 0) + goto fail; +#endif } return handle; +fail: + TimerCloseHandle(handle); + return NULL; } HANDLE CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCWSTR lpTimerName) { - return NULL; + int rc; + HANDLE handle; + LPSTR name = NULL; + rc = ConvertFromUnicode(CP_UTF8, 0, lpTimerName, -1, &name, 0, NULL, NULL); + + if (rc < 0) + return NULL; + + handle = CreateWaitableTimerA(lpTimerAttributes, bManualReset, name); + free(name); + return handle; } HANDLE CreateWaitableTimerExA(LPSECURITY_ATTRIBUTES lpTimerAttributes, LPCSTR lpTimerName, @@ -281,7 +371,17 @@ HANDLE CreateWaitableTimerExA(LPSECURITY_ATTRIBUTES lpTimerAttributes, LPCSTR lp HANDLE CreateWaitableTimerExW(LPSECURITY_ATTRIBUTES lpTimerAttributes, LPCWSTR lpTimerName, DWORD dwFlags, DWORD dwDesiredAccess) { - return NULL; + int rc; + HANDLE handle; + LPSTR name = NULL; + rc = ConvertFromUnicode(CP_UTF8, 0, lpTimerName, -1, &name, 0, NULL, NULL); + + if (rc < 0) + return NULL; + + handle = CreateWaitableTimerExA(lpTimerAttributes, name, dwFlags, dwDesiredAccess); + free(name); + return handle; } BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER* lpDueTime, LONG lPeriod, @@ -290,7 +390,7 @@ BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER* lpDueTime, LONG lPerio ULONG Type; WINPR_HANDLE* Object; WINPR_TIMER* timer; -#ifdef WITH_POSIX_TIMER +#if defined(WITH_POSIX_TIMER) || defined(__APPLE__) LONGLONG seconds = 0; LONGLONG nanoseconds = 0; #ifdef HAVE_SYS_TIMERFD_H @@ -380,6 +480,44 @@ BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER* lpDueTime, LONG lPerio } } +#elif defined(__APPLE__) + + if (lpDueTime->QuadPart < 0) + { + LONGLONG due = lpDueTime->QuadPart * (-1); + /* due time is in 100 nanosecond intervals */ + seconds = (due / 10000000); + nanoseconds = due * 100; + } + else if (lpDueTime->QuadPart == 0) + { + seconds = nanoseconds = 0; + } + else + { + WLog_ERR(TAG, "absolute time not implemented"); + return FALSE; + } + + { /* Clean out old data from FD */ + BYTE buffer[32]; + + while (read(timer->fd, buffer, sizeof(buffer)) > 0); + } + { + if (timer->running) + dispatch_suspend(timer->source); + + dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, nanoseconds); + uint64_t interval = DISPATCH_TIME_FOREVER; + if (lPeriod > 0) + interval = lPeriod * 1000000; + + dispatch_source_set_timer(timer->source, start, interval, 0); + dispatch_resume(timer->source); + timer->running = TRUE; + } + #endif return TRUE; } @@ -388,18 +526,8 @@ BOOL SetWaitableTimerEx(HANDLE hTimer, const LARGE_INTEGER* lpDueTime, LONG lPer PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, PREASON_CONTEXT WakeContext, ULONG TolerableDelay) { - ULONG Type; - WINPR_HANDLE* Object; - - if (!winpr_Handle_GetInfo(hTimer, &Type, &Object)) - return FALSE; - - (void)Object; - - if (Type == HANDLE_TYPE_TIMER) - return TRUE; - - return TRUE; + return SetWaitableTimer(hTimer, lpDueTime, lPeriod, pfnCompletionRoutine, lpArgToCompletionRoutine, + FALSE); } HANDLE OpenWaitableTimerA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpTimerName) @@ -414,6 +542,22 @@ HANDLE OpenWaitableTimerW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lp BOOL CancelWaitableTimer(HANDLE hTimer) { + ULONG Type; + WINPR_HANDLE* Object; + WINPR_TIMER* timer; + + if (!winpr_Handle_GetInfo(hTimer, &Type, &Object)) + return FALSE; + + if (Type != HANDLE_TYPE_TIMER) + return FALSE; + + timer = (WINPR_TIMER*)Object; +#if defined(__APPLE__) + if (timer->running) + dispatch_suspend(timer->source); + timer->running = FALSE; +#endif return TRUE; } @@ -426,14 +570,14 @@ BOOL CancelWaitableTimer(HANDLE hTimer) * http://www.cs.wustl.edu/~schmidt/Timer_Queue.html */ -void timespec_add_ms(struct timespec* tspec, UINT32 ms) +static void timespec_add_ms(struct timespec* tspec, UINT32 ms) { UINT64 ns = tspec->tv_nsec + (ms * 1000000); tspec->tv_sec += (ns / 1000000000); tspec->tv_nsec = (ns % 1000000000); } -UINT64 timespec_to_ms(struct timespec* tspec) +static UINT64 timespec_to_ms(struct timespec* tspec) { UINT64 ms; ms = tspec->tv_sec * 1000; @@ -463,7 +607,7 @@ static void timespec_copy(struct timespec* dst, struct timespec* src) dst->tv_nsec = src->tv_nsec; } -void InsertTimerQueueTimer(WINPR_TIMER_QUEUE_TIMER** pHead, WINPR_TIMER_QUEUE_TIMER* timer) +static void InsertTimerQueueTimer(WINPR_TIMER_QUEUE_TIMER** pHead, WINPR_TIMER_QUEUE_TIMER* timer) { WINPR_TIMER_QUEUE_TIMER* node; @@ -499,7 +643,7 @@ void InsertTimerQueueTimer(WINPR_TIMER_QUEUE_TIMER** pHead, WINPR_TIMER_QUEUE_TI } } -void RemoveTimerQueueTimer(WINPR_TIMER_QUEUE_TIMER** pHead, WINPR_TIMER_QUEUE_TIMER* timer) +static void RemoveTimerQueueTimer(WINPR_TIMER_QUEUE_TIMER** pHead, WINPR_TIMER_QUEUE_TIMER* timer) { BOOL found = FALSE; WINPR_TIMER_QUEUE_TIMER* node; @@ -538,7 +682,7 @@ void RemoveTimerQueueTimer(WINPR_TIMER_QUEUE_TIMER** pHead, WINPR_TIMER_QUEUE_TI } } -int FireExpiredTimerQueueTimers(WINPR_TIMER_QUEUE* timerQueue) +static int FireExpiredTimerQueueTimers(WINPR_TIMER_QUEUE* timerQueue) { struct timespec CurrentTime; WINPR_TIMER_QUEUE_TIMER* node; @@ -616,7 +760,7 @@ static void* TimerQueueThread(void* arg) return NULL; } -int StartTimerQueueThread(WINPR_TIMER_QUEUE* timerQueue) +static int StartTimerQueueThread(WINPR_TIMER_QUEUE* timerQueue) { pthread_cond_init(&(timerQueue->cond), NULL); pthread_mutex_init(&(timerQueue->cond_mutex), NULL); -- 2.7.4