本文整理汇总了C++中CPalThread类的典型用法代码示例。如果您正苦于以下问题:C++ CPalThread类的具体用法?C++ CPalThread怎么用?C++ CPalThread使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了CPalThread类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: PAL_HasEntered
/*++
Function:
PAL_HasEntered
Abstract:
This function can be called to determine if the thread has entered the
PAL through PAL_Enter or related calls.
--*/
BOOL
PALAPI
PAL_HasEntered()
{
ENTRY_EXTERNAL("PAL_HasEntered()\n");
CPalThread *pThread = GetCurrentPalThread();
if (pThread == NULL)
{
ASSERT("PAL_Reenter called on a thread unknown to this PAL\n");
}
LOGEXIT("PAL_HasEntered returned\n");
return pThread->IsInPal();
}
示例2: CreateMutexA
HANDLE
PALAPI
CreateMutexA(
IN LPSECURITY_ATTRIBUTES lpMutexAttributes,
IN BOOL bInitialOwner,
IN LPCSTR lpName)
{
HANDLE hMutex = NULL;
CPalThread *pthr = NULL;
PAL_ERROR palError;
PERF_ENTRY(CreateMutexA);
ENTRY("CreateMutexA(lpMutexAttr=%p, bInitialOwner=%d, lpName=%p (%s)\n",
lpMutexAttributes, bInitialOwner, lpName, lpName?lpName:"NULL");
pthr = InternalGetCurrentThread();
if (lpName != nullptr)
{
ASSERT("lpName: Cross-process named objects are not supported in PAL");
palError = ERROR_NOT_SUPPORTED;
}
else
{
palError = InternalCreateMutex(
pthr,
lpMutexAttributes,
bInitialOwner,
NULL,
&hMutex
);
}
//
// We always need to set last error, even on success:
// we need to protect ourselves from the situation
// where last error is set to ERROR_ALREADY_EXISTS on
// entry to the function
//
pthr->SetLastError(palError);
LOGEXIT("CreateMutexA returns HANDLE %p\n", hMutex);
PERF_EXIT(CreateMutexA);
return hMutex;
}
示例3: OpenSemaphoreW
HANDLE
PALAPI
OpenSemaphoreW(
IN DWORD dwDesiredAccess,
IN BOOL bInheritHandle,
IN LPCWSTR lpName)
{
HANDLE hSemaphore = NULL;
PAL_ERROR palError = NO_ERROR;
CPalThread *pthr = NULL;
PERF_ENTRY(OpenSemaphoreW);
ENTRY("OpenSemaphoreW(dwDesiredAccess=%#x, bInheritHandle=%d, lpName=%p (%S))\n",
dwDesiredAccess, bInheritHandle, lpName, lpName?lpName:W16_NULLSTRING);
pthr = InternalGetCurrentThread();
/* validate parameters */
if (lpName == NULL)
{
ERROR("lpName is NULL\n");
palError = ERROR_INVALID_PARAMETER;
goto OpenSemaphoreWExit;
}
palError = InternalOpenSemaphore(
pthr,
dwDesiredAccess,
bInheritHandle,
lpName,
&hSemaphore
);
OpenSemaphoreWExit:
if (NO_ERROR != palError)
{
pthr->SetLastError(palError);
}
LOGEXIT("OpenSemaphoreW returns HANDLE %p\n", hSemaphore);
PERF_EXIT(OpenSemaphoreW);
return hSemaphore;
}
示例4: PAL_Reenter
/*++
Function:
PAL_Reenter
Abstract:
This function needs to be called on a thread when it enters
a region of code that depends on this instance of the PAL
in the process, and the current thread is already known to
the PAL.
NOTE: This function must not modify LastError.
--*/
VOID
PALAPI
PAL_Reenter(PAL_Boundary boundary)
{
ENTRY_EXTERNAL("PAL_Reenter(boundary=%u)\n", boundary);
CPalThread *pThread = GetCurrentPalThread();
if (pThread == NULL)
{
ASSERT("PAL_Reenter called on a thread unknown to this PAL\n");
}
// We ignore the return code. This call should only fail on internal
// error, and we assert at the actual failure.
pThread->Enter(boundary);
LOGEXIT("PAL_Reenter returns\n");
}
示例5: AllocatePalThread
PAL_ERROR
AllocatePalThread(CPalThread **ppThread)
{
CPalThread *pThread = NULL;
PAL_ERROR palError;
#if !HAVE_MACH_EXCEPTIONS
// Ensure alternate stack for SIGSEGV handling. Our SIGSEGV handler is set to
// run on an alternate stack and the stack needs to be allocated per thread.
if (!EnsureSignalAlternateStack())
{
ERROR("Cannot allocate alternate stack for SIGSEGV handler!\n");
palError = ERROR_NOT_ENOUGH_MEMORY;
goto exit;
}
#endif // !HAVE_MACH_EXCEPTIONS
palError = CreateThreadData(&pThread);
if (NO_ERROR != palError)
{
goto exit;
}
HANDLE hThread;
palError = CreateThreadObject(pThread, pThread, &hThread);
if (NO_ERROR != palError)
{
pthread_setspecific(thObjKey, NULL);
pThread->ReleaseThreadReference();
goto exit;
}
// Like CreateInitialProcessAndThreadObjects, we do not need this
// thread handle, since we're not returning it to anyone who will
// possibly release it.
(void)g_pObjectManager->RevokeHandle(pThread, hThread);
PROCAddThread(pThread, pThread);
exit:
*ppThread = pThread;
return palError;
}
示例6: CreateSemaphoreW
HANDLE
PALAPI
CreateSemaphoreW(
IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
IN LONG lInitialCount,
IN LONG lMaximumCount,
IN LPCWSTR lpName)
{
HANDLE hSemaphore = NULL;
PAL_ERROR palError;
CPalThread *pthr = NULL;
PERF_ENTRY(CreateSemaphoreW);
ENTRY("CreateSemaphoreW(lpSemaphoreAttributes=%p, lInitialCount=%d, "
"lMaximumCount=%d, lpName=%p (%S))\n",
lpSemaphoreAttributes, lInitialCount, lMaximumCount,
lpName, lpName?lpName:W16_NULLSTRING);
pthr = InternalGetCurrentThread();
palError = InternalCreateSemaphore(
pthr,
lpSemaphoreAttributes,
lInitialCount,
lMaximumCount,
lpName,
&hSemaphore
);
//
// We always need to set last error, even on success:
// we need to protect ourselves from the situation
// where last error is set to ERROR_ALREADY_EXISTS on
// entry to the function
//
pthr->SetLastError(palError);
LOGEXIT("CreateSemaphoreW returns HANDLE %p\n", hSemaphore);
PERF_EXIT(CreateSemaphoreW);
return hSemaphore;
}
示例7: Sleep
/*++
Function:
Sleep
See MSDN doc.
--*/
VOID
PALAPI
Sleep(IN DWORD dwMilliseconds)
{
PERF_ENTRY(Sleep);
ENTRY("Sleep(dwMilliseconds=%u)\n", dwMilliseconds);
CPalThread * pThread = InternalGetCurrentThread();
DWORD internalSleepRet = InternalSleepEx(pThread, dwMilliseconds, FALSE);
if (internalSleepRet != 0)
{
ERROR("Sleep(dwMilliseconds=%u) failed [error=%u]\n", dwMilliseconds, internalSleepRet);
pThread->SetLastError(internalSleepRet);
}
LOGEXIT("Sleep returns VOID\n");
PERF_EXIT(Sleep);
}
示例8: CheckPalThread
/*++
Function:
CheckPalThread
Abstract:
This function is called by the ENTRY macro to validate consistency:
Whenever a PAL function is called, that thread must have previously
registered the fact that it is currently executing code that depends
on this PAL by means of PAL_ReverseEnter or PAL_Enter.
--*/
extern "C" void CheckPalThread()
{
if (PALIsInitialized())
{
CPalThread *pThread = InternalGetCurrentThread();
if (!pThread)
{
ASSERT("PAL function called on a thread unknown to this PAL\n");
}
else if (!pThread->IsInPal())
{
// There are several outstanding issues where we are not maintaining
// correct in- vs. out-of-thePAL state. With the advent of
// single registration of Mach EH handling per thread, there's no
// need to actually be in the PAL any more, and so the following
// is being made into a warning, and we'll deprecate the
// entire concept later.
WARN("PAL function called on a thread external to this PAL\n");
}
}
}
示例9: OpenSemaphoreW
HANDLE
PALAPI
OpenSemaphoreW(
IN DWORD dwDesiredAccess,
IN BOOL bInheritHandle,
IN LPCWSTR lpName)
{
HANDLE hSemaphore = NULL;
PAL_ERROR palError = NO_ERROR;
CPalThread *pthr = NULL;
PERF_ENTRY(OpenSemaphoreW);
ENTRY("OpenSemaphoreW(dwDesiredAccess=%#x, bInheritHandle=%d, lpName=%p (%S))\n",
dwDesiredAccess, bInheritHandle, lpName, lpName?lpName:W16_NULLSTRING);
pthr = InternalGetCurrentThread();
/* validate parameters */
if (lpName == nullptr)
{
ERROR("lpName is NULL\n");
palError = ERROR_INVALID_PARAMETER;
}
else
{
ASSERT("lpName: Cross-process named objects are not supported in PAL");
palError = ERROR_NOT_SUPPORTED;
}
if (NO_ERROR != palError)
{
pthr->SetLastError(palError);
}
LOGEXIT("OpenSemaphoreW returns HANDLE %p\n", hSemaphore);
PERF_EXIT(OpenSemaphoreW);
return hSemaphore;
}
示例10: CreateMutexW
HANDLE
PALAPI
CreateMutexW(
IN LPSECURITY_ATTRIBUTES lpMutexAttributes,
IN BOOL bInitialOwner,
IN LPCWSTR lpName)
{
HANDLE hMutex = NULL;
PAL_ERROR palError;
CPalThread *pthr = NULL;
PERF_ENTRY(CreateMutexW);
ENTRY("CreateMutexW(lpMutexAttr=%p, bInitialOwner=%d, lpName=%p (%S)\n",
lpMutexAttributes, bInitialOwner, lpName, lpName?lpName:W16_NULLSTRING);
pthr = InternalGetCurrentThread();
palError = InternalCreateMutex(
pthr,
lpMutexAttributes,
bInitialOwner,
lpName,
&hMutex
);
//
// We always need to set last error, even on success:
// we need to protect ourselves from the situation
// where last error is set to ERROR_ALREADY_EXISTS on
// entry to the function
//
pthr->SetLastError(palError);
LOGEXIT("CreateMutexW returns HANDLE %p\n", hMutex);
PERF_EXIT(CreateMutexW);
return hMutex;
}
示例11: ReleaseMutex
BOOL
PALAPI
ReleaseMutex( IN HANDLE hMutex )
{
PAL_ERROR palError = NO_ERROR;
CPalThread *pthr = NULL;
PERF_ENTRY(ReleaseMutex);
ENTRY("ReleaseMutex(hMutex=%p)\n", hMutex);
pthr = InternalGetCurrentThread();
palError = InternalReleaseMutex(pthr, hMutex);
if (NO_ERROR != palError)
{
pthr->SetLastError(palError);
}
LOGEXIT("ReleaseMutex returns BOOL %d\n", (NO_ERROR == palError));
PERF_EXIT(ReleaseMutex);
return (NO_ERROR == palError);
}
示例12: OpenMutexA
HANDLE
PALAPI
OpenMutexA (
IN DWORD dwDesiredAccess,
IN BOOL bInheritHandle,
IN LPCSTR lpName)
{
HANDLE hMutex = NULL;
CPalThread *pthr = NULL;
PAL_ERROR palError;
PERF_ENTRY(OpenMutexA);
ENTRY("OpenMutexA(dwDesiredAccess=%#x, bInheritHandle=%d, lpName=%p (%s))\n",
dwDesiredAccess, bInheritHandle, lpName, lpName?lpName:"NULL");
pthr = InternalGetCurrentThread();
/* validate parameters */
if (lpName == nullptr)
{
ERROR("name is NULL\n");
palError = ERROR_INVALID_PARAMETER;
goto OpenMutexAExit;
}
palError = InternalOpenMutex(pthr, dwDesiredAccess, bInheritHandle, lpName, &hMutex);
OpenMutexAExit:
if (NO_ERROR != palError)
{
pthr->SetLastError(palError);
}
LOGEXIT("OpenMutexA returns HANDLE %p\n", hMutex);
PERF_EXIT(OpenMutexA);
return hMutex;
}
示例13: GetThreadContext
/*++
Function:
GetThreadContext
See MSDN doc.
--*/
BOOL
PALAPI
GetThreadContext(
IN HANDLE hThread,
IN OUT LPCONTEXT lpContext)
{
PAL_ERROR palError;
CPalThread *pThread;
CPalThread *pTargetThread;
IPalObject *pobjThread = NULL;
BOOL ret = FALSE;
PERF_ENTRY(GetThreadContext);
ENTRY("GetThreadContext (hThread=%p, lpContext=%p)\n",hThread,lpContext);
pThread = InternalGetCurrentThread();
palError = InternalGetThreadDataFromHandle(
pThread,
hThread,
0, // THREAD_GET_CONTEXT
&pTargetThread,
&pobjThread
);
if (NO_ERROR == palError)
{
if (!pTargetThread->IsDummy())
{
ret = CONTEXT_GetThreadContext(
GetCurrentProcessId(),
pTargetThread->GetPThreadSelf(),
lpContext
);
}
else
{
ASSERT("Dummy thread handle passed to GetThreadContext\n");
pThread->SetLastError(ERROR_INVALID_HANDLE);
}
}
else
{
pThread->SetLastError(palError);
}
if (NULL != pobjThread)
{
pobjThread->ReleaseReference(pThread);
}
LOGEXIT("GetThreadContext returns ret:%d\n", ret);
PERF_EXIT(GetThreadContext);
return ret;
}
示例14: InternalGetCurrentThread
bool CatchHardwareExceptionHolder::IsEnabled()
{
CPalThread *pThread = InternalGetCurrentThread();
return pThread->IsHardwareExceptionsEnabled();
}
示例15: GetComputerNameW
/*++
Function:
GetComputerNameW
Uses gethostname to get the computer name. See MSDN for functional spec.
--*/
PALIMPORT
BOOL
PALAPI
GetComputerNameW(
OUT LPWSTR lpBuffer, // address of name buffer
IN OUT LPDWORD nSize) // address of size of name buffer
{
BOOL fRet = FALSE;
char szHostName[MAXHOSTNAMELEN+1];
char *pchDot = NULL;
DWORD cwchLen = 0;
CPalThread *pPalThread = InternalGetCurrentThread();
PERF_ENTRY(GetComputerNameW);
ENTRY("GetComputerNameW(lpBuffer = %p, nSize = %p (%d)\n",
lpBuffer, nSize, nSize?*nSize:0);
if (NULL == lpBuffer || NULL == nSize)
{
ERROR("lpBuffer == NULL or nSize == NULL");
pPalThread->SetLastError(ERROR_INVALID_PARAMETER);
goto done;
}
if (0 != gethostname(szHostName, sizeof(szHostName)/sizeof(szHostName[0])))
{
ERROR("gethostname failed with error (%d) %s\n", errno, strerror(errno));
pPalThread->SetLastError(ERROR_INTERNAL_ERROR);
goto done;
}
// Null terminate the string
szHostName[sizeof(szHostName)/sizeof(szHostName[0])-1] = '\0';
// some OSes return the hostname with the domain name included.
// We want to return only the host part of the name (see the spec for
// more details
pchDot = strchr(szHostName, '.');
if (NULL != pchDot)
{
*pchDot = '\0'; // remove the domain name info
}
// clip the hostname to MAX_COMPUTERNAME_LENGTH
if (sizeof(szHostName) > MAX_COMPUTERNAME_LENGTH)
{
szHostName[MAX_COMPUTERNAME_LENGTH] = '\0';
}
// copy the hostname (including NULL character)
cwchLen = MultiByteToWideChar(CP_ACP, 0, szHostName, -1, lpBuffer, *nSize);
if (0 == cwchLen)
{
ERROR ("MultiByteToWideChar failed with error %d when trying to convert the hostname "
"%s to wide char\n", pPalThread->GetLastError(), szHostName);
if (ERROR_INSUFFICIENT_BUFFER == pPalThread->GetLastError())
{
// Find the required size (including NULL)
cwchLen = MultiByteToWideChar(CP_ACP, 0, szHostName, -1, NULL, 0);
if (0 == cwchLen)
{
ERROR ("MultiByteToWideChar failed with error %d when trying to find the size of "
"%s in wide chars\n", pPalThread->GetLastError(), szHostName);
pPalThread->SetLastError(ERROR_INTERNAL_ERROR);
}
else
{
// Update the required size
*nSize = cwchLen - 1; // don't include the NULL
pPalThread->SetLastError(ERROR_BUFFER_OVERFLOW);
}
}
goto done;
}
*nSize = cwchLen - 1; // don't include the NULL
fRet = TRUE;
done:
LOGEXIT("GetComputerNameW returning BOOL %d\n", fRet);
PERF_EXIT(GetComputerNameW);
return fRet;
}