You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.9 KiB
74 lines
1.9 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
|
|
/*! @file
|
|
* Implementation of the threading API in Windows.
|
|
*/
|
|
|
|
#include "threadlib.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <malloc.h>
|
|
#include <windows.h>
|
|
|
|
// Structure passed to the start routine in Windows
|
|
typedef struct WIN_THREAD_RTN_ARG_
|
|
{
|
|
THREAD_RTN_PTR m_threadRtn;
|
|
void * m_arg;
|
|
}WIN_THREAD_RTN_ARG;
|
|
|
|
// Thread start routine in Windows
|
|
static DWORD WINAPI WinThreadRtn(LPVOID arg)
|
|
{
|
|
void * retval;
|
|
WIN_THREAD_RTN_ARG winThreadRtnArg = *((WIN_THREAD_RTN_ARG *)arg);
|
|
free(arg);
|
|
retval = winThreadRtnArg.m_threadRtn(winThreadRtnArg.m_arg);
|
|
return ((DWORD)retval);
|
|
}
|
|
|
|
BOOL CreateOneThread(THREAD_HANDLE * pThreadHandle, THREAD_RTN_PTR threadRtn, void * arg)
|
|
{
|
|
HANDLE winThreadHandle;
|
|
WIN_THREAD_RTN_ARG * pWinThreadRtnArg = (WIN_THREAD_RTN_ARG *)malloc(sizeof(WIN_THREAD_RTN_ARG));
|
|
pWinThreadRtnArg->m_threadRtn = threadRtn;
|
|
pWinThreadRtnArg->m_arg = arg;
|
|
|
|
winThreadHandle = CreateThread(NULL, 0, WinThreadRtn, pWinThreadRtnArg, 0, NULL);
|
|
if (winThreadHandle == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
*pThreadHandle = (THREAD_HANDLE)winThreadHandle;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL JoinOneThread(THREAD_HANDLE threadHandle)
|
|
{
|
|
HANDLE winThreadHandle = (HANDLE)threadHandle;
|
|
DWORD waitStatus;
|
|
waitStatus = WaitForSingleObject(winThreadHandle, INFINITE);
|
|
return (waitStatus == WAIT_OBJECT_0);
|
|
}
|
|
|
|
void ExitCurrentThread()
|
|
{
|
|
ExitThread(0);
|
|
}
|
|
|
|
void DelayCurrentThread(unsigned int millisec)
|
|
{
|
|
Sleep(millisec);
|
|
}
|