#include <winpr/debug.h>
#include <errno.h>
+#include <fcntl.h>
#include <winpr/collections.h>
static pthread_once_t thread_initialized = PTHREAD_ONCE_INIT;
static HANDLE_CLOSE_CB _ThreadHandleCloseCb;
-static wListDictionary *thread_list = NULL;
+static wListDictionary* thread_list = NULL;
static BOOL ThreadCloseHandle(HANDLE handle);
-static void cleanup_handle(void *obj);
+static void cleanup_handle(void* obj);
static BOOL ThreadIsHandled(HANDLE handle)
{
- WINPR_THREAD *pThread = (WINPR_THREAD *)handle;
+ WINPR_THREAD* pThread = (WINPR_THREAD*) handle;
if (!pThread || pThread->Type != HANDLE_TYPE_THREAD)
{
return TRUE;
}
-
static void ThreadInitialize(void)
{
_ThreadHandleCloseCb.IsHandled = ThreadIsHandled;
WLog_DBG(TAG, "Called from:");
msg = winpr_backtrace_symbols(stack, &used);
- for (i=0; i<used; i++)
+ for (i = 0; i < used; i++)
WLog_DBG(TAG, "[%d]: %s", i, msg[i]);
free(msg);
WLog_DBG(TAG, "Thread handle created still not closed!");
msg = winpr_backtrace_symbols(thread->create_stack, &used);
- for (i=0; i<used; i++)
+ for (i = 0; i < used; i++)
WLog_DBG(TAG, "[%d]: %s", i, msg[i]);
free(msg);
if (thread->started)
+ {
WLog_DBG(TAG, "Thread still running!");
+ }
else if (!thread->exit_stack)
+ {
WLog_DBG(TAG, "Thread suspended.");
+ }
else
{
WLog_DBG(TAG, "Thread exited at:");
msg = winpr_backtrace_symbols(thread->exit_stack, &used);
- for (i=0; i<used; i++)
+ for (i = 0; i < used; i++)
WLog_DBG(TAG, "[%d]: %s", i, msg[i]);
free(msg);
}
-
#endif
}
status = (length == 0) ? TRUE : FALSE;
#else
-
if (WaitForSingleObject(thread, 0) != WAIT_OBJECT_0)
{
length = write(thread->pipe_fd[1], "-", 1);
{
status = TRUE;
}
-
#endif
return status;
}
return status;
}
-static int thread_compare(void *a, void *b)
+static BOOL thread_compare(void* a, void* b)
{
- pthread_t *p1 = a;
- pthread_t *p2 = b;
- int rc = pthread_equal(*p1, *p2);
+ pthread_t* p1 = a;
+ pthread_t* p2 = b;
+ BOOL rc = pthread_equal(*p1, *p2);
return rc;
}
/* Thread launcher function responsible for registering
* cleanup handlers and calling pthread_exit, if not done
* in thread function. */
-static void *thread_launcher(void *arg)
+static void* thread_launcher(void* arg)
{
- void *rc = NULL;
- WINPR_THREAD *thread = (WINPR_THREAD *)arg;
+ void* rc = NULL;
+ WINPR_THREAD* thread = (WINPR_THREAD*) arg;
if (!thread)
{
}
else
{
- void *(*fkt)(void *) = (void *)thread->lpStartAddress;
+ void *(*fkt)(void*) = (void*) thread->lpStartAddress;
if (!fkt)
{
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId)
{
+ int flags;
HANDLE handle;
- WINPR_THREAD *thread;
- thread = (WINPR_THREAD *) calloc(1, sizeof(WINPR_THREAD));
+ WINPR_THREAD* thread;
+ thread = (WINPR_THREAD*) calloc(1, sizeof(WINPR_THREAD));
if (!thread)
return NULL;
thread->lpParameter = lpParameter;
thread->lpStartAddress = lpStartAddress;
thread->lpThreadAttributes = lpThreadAttributes;
+
#if defined(WITH_DEBUG_THREADS)
thread->create_stack = winpr_backtrace(20);
dump_thread(thread);
#endif
+
#ifdef HAVE_EVENTFD_H
thread->pipe_fd[0] = eventfd(0, EFD_NONBLOCK);
free(thread);
return NULL;
}
-
#else
-
if (pipe(thread->pipe_fd) < 0)
{
WLog_ERR(TAG, "failed to create thread");
free(thread);
return NULL;
}
-
+
+ flags = fcntl(thread->pipe_fd[0], F_GETFL);
+ fcntl(thread->pipe_fd[0], F_SETFL, flags | O_NONBLOCK);
#endif
+
pthread_mutex_init(&thread->mutex, 0);
WINPR_HANDLE_SET_TYPE(thread, HANDLE_TYPE_THREAD);
handle = (HANDLE) thread;
- if (NULL == thread_list)
+ if (!thread_list)
{
thread_list = ListDictionary_New(TRUE);
thread_list->objectKey.fnObjectEquals = thread_compare;
void cleanup_handle(void *obj)
{
- WINPR_THREAD *thread = (WINPR_THREAD *)obj;
+ WINPR_THREAD* thread = (WINPR_THREAD*) obj;
int rc = pthread_mutex_destroy(&thread->mutex);
if (rc)
BOOL ThreadCloseHandle(HANDLE handle)
{
- WINPR_THREAD *thread = (WINPR_THREAD *)handle;
+ WINPR_THREAD* thread = (WINPR_THREAD*) handle;
if (!thread_list)
{
pthread_detach(thread->thread);
}
else
+ {
cleanup_handle(thread);
+ }
ListDictionary_Unlock(thread_list);
{
ULONG Type;
PVOID Object;
- WINPR_THREAD *thread;
+ WINPR_THREAD* thread;
if (!winpr_Handle_GetInfo(hThread, &Type, &Object))
return FALSE;
- thread = (WINPR_THREAD *) Object;
+ thread = (WINPR_THREAD*) Object;
*lpExitCode = thread->dwExitCode;
return TRUE;
}
HANDLE hdl = NULL;
pthread_t tid = pthread_self();
- if (NULL == thread_list)
+ if (!thread_list)
{
WLog_ERR(TAG, "function called without existing thread list!");
#if defined(WITH_DEBUG_THREADS)
if (!winpr_Handle_GetInfo(hThread, &Type, &Object))
return 0;
- thread = (WINPR_THREAD *) Object;
+ thread = (WINPR_THREAD*) Object;
pthread_mutex_lock(&thread->mutex);
if (!thread->started)
{
ULONG Type;
PVOID Object;
- WINPR_THREAD *thread;
+ WINPR_THREAD* thread;
if (!winpr_Handle_GetInfo(hThread, &Type, &Object))
return 0;
- thread = (WINPR_THREAD *) Object;
+ thread = (WINPR_THREAD*) Object;
thread->exited = TRUE;
thread->dwExitCode = dwExitCode;
pthread_mutex_lock(&thread->mutex);
WLog_DBG(TAG, "---------------- Called from ----------------------------");
msg = winpr_backtrace_symbols(stack, &used);
- for (i=0; i<used; i++)
+ for (i = 0; i < used; i++)
+ {
WLog_DBG(TAG, "[%d]: %s", i, msg[i]);
+ }
free(msg);
winpr_backtrace_free(stack);
WLog_DBG(TAG, "---------------- Start Dumping thread handles -----------");
if (!thread_list)
+ {
WLog_DBG(TAG, "All threads properly shut down and disposed of.");
+ }
else
{
ULONG_PTR *keys = NULL;
int x, count = ListDictionary_GetKeys(thread_list, &keys);
WLog_DBG(TAG, "Dumping %d elements\n", count);
- for (x=0; x<count; x++)
+ for (x = 0; x < count; x++)
{
- WINPR_THREAD* thread = ListDictionary_GetItemValue(thread_list, (void*)keys[x]);
+ WINPR_THREAD* thread = ListDictionary_GetItemValue(thread_list, (void*) keys[x]);
WLog_DBG(TAG, "Thread [%d] handle created still not closed!", x);
msg = winpr_backtrace_symbols(thread->create_stack, &used);
- for (i=0; i<used; i++)
+ for (i = 0; i < used; i++)
+ {
WLog_DBG(TAG, "[%d]: %s", i, msg[i]);
+ }
free(msg);
if (thread->started)
+ {
WLog_DBG(TAG, "Thread [%d] still running!", x);
+ }
else
{
WLog_DBG(TAG, "Thread [%d] exited at:", x);