DWORD ResumeThread(HANDLE hThread) { ULONG Type; WINPR_HANDLE* Object; WINPR_THREAD* thread; if (!winpr_Handle_GetInfo(hThread, &Type, &Object)) return (DWORD) - 1; thread = (WINPR_THREAD*) Object; if (pthread_mutex_lock(&thread->mutex)) return (DWORD) - 1; if (!thread->started) { if (!winpr_StartThread(thread)) { pthread_mutex_unlock(&thread->mutex); return (DWORD) - 1; } } else WLog_WARN(TAG, "Thread already started!"); if (pthread_mutex_unlock(&thread->mutex)) return (DWORD) - 1; return 0; }
DWORD ResumeThread(HANDLE hThread) { ULONG Type; PVOID Object; WINPR_THREAD* thread; if (!winpr_Handle_GetInfo(hThread, &Type, &Object)) return 0; thread = (WINPR_THREAD*) Object; pthread_mutex_lock(&thread->mutex); if (!thread->started) winpr_StartThread(thread); pthread_mutex_unlock(&thread->mutex); return 0; }
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId) { HANDLE handle; WINPR_THREAD* thread; thread = (WINPR_THREAD*) malloc(sizeof(WINPR_THREAD)); ZeroMemory(thread, sizeof(WINPR_THREAD)); thread->started = FALSE; thread->dwStackSize = dwStackSize; thread->lpParameter = lpParameter; thread->lpStartAddress = lpStartAddress; thread->lpThreadAttributes = lpThreadAttributes; pthread_mutex_init(&thread->mutex, 0); handle = winpr_Handle_Insert(HANDLE_TYPE_THREAD, (void*) thread); if (!(dwCreationFlags & CREATE_SUSPENDED)) winpr_StartThread(thread); return handle; }
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId) { HANDLE handle; WINPR_THREAD* thread; thread = (WINPR_THREAD*) calloc(1, sizeof(WINPR_THREAD)); if (!thread) return NULL; thread->dwStackSize = dwStackSize; thread->lpParameter = lpParameter; thread->lpStartAddress = lpStartAddress; thread->lpThreadAttributes = lpThreadAttributes; thread->ops = &ops; #if defined(WITH_DEBUG_THREADS) thread->create_stack = winpr_backtrace(20); dump_thread(thread); #endif thread->pipe_fd[0] = -1; thread->pipe_fd[1] = -1; #ifdef HAVE_EVENTFD_H thread->pipe_fd[0] = eventfd(0, EFD_NONBLOCK); if (thread->pipe_fd[0] < 0) { WLog_ERR(TAG, "failed to create thread pipe fd 0"); goto error_pipefd0; } #else if (pipe(thread->pipe_fd) < 0) { WLog_ERR(TAG, "failed to create thread pipe"); goto error_pipefd0; } { int flags = fcntl(thread->pipe_fd[0], F_GETFL); fcntl(thread->pipe_fd[0], F_SETFL, flags | O_NONBLOCK); } #endif if (pthread_mutex_init(&thread->mutex, 0) != 0) { WLog_ERR(TAG, "failed to initialize thread mutex"); goto error_mutex; } if (pthread_mutex_init(&thread->threadIsReadyMutex, NULL) != 0) { WLog_ERR(TAG, "failed to initialize a mutex for a condition variable"); goto error_thread_ready_mutex; } if (pthread_cond_init(&thread->threadIsReady, NULL) != 0) { WLog_ERR(TAG, "failed to initialize a condition variable"); goto error_thread_ready; } WINPR_HANDLE_SET_TYPE_AND_MODE(thread, HANDLE_TYPE_THREAD, WINPR_FD_READ); handle = (HANDLE) thread; if (!thread_list) { thread_list = ListDictionary_New(TRUE); if (!thread_list) { WLog_ERR(TAG, "Couldn't create global thread list"); goto error_thread_list; } thread_list->objectKey.fnObjectEquals = thread_compare; } if (!(dwCreationFlags & CREATE_SUSPENDED)) { if (!winpr_StartThread(thread)) goto error_thread_list; } else { if (!set_event(thread)) goto error_thread_list; } return handle; error_thread_list: pthread_cond_destroy(&thread->threadIsReady); error_thread_ready: pthread_mutex_destroy(&thread->threadIsReadyMutex); error_thread_ready_mutex: pthread_mutex_destroy(&thread->mutex); error_mutex: if (thread->pipe_fd[1] >= 0) close(thread->pipe_fd[1]); if (thread->pipe_fd[0] >= 0) close(thread->pipe_fd[0]); error_pipefd0: free(thread); return NULL; }