为防止某些关键过程操作线程被删除或重启,SylixOS提供线程安全模式相关接口。线程进入安全模式后, 任何对本线程的删除或重启操作都会推迟到线程退出安全模式时进行。
接口ULONG API_ThreadSafe (VOID)
ULONG API_ThreadUnsafe (VOID)
BOOL API_ThreadIsSafe (LW_OBJECT_HANDLE ulId)示例
ssize_t _TyWrite (TY_DEV_ID ptyDev,
PCHAR pcBuffer,
size_t stNBytes)
{
INTREG iregInterLevel;
REGISTER INT iBytesput;
REGISTER ssize_t sstNbStart = stNBytes;
REGISTER ULONG ulError;
if (pcBuffer == LW_NULL) {
_ErrorHandle(EINVAL);
return (PX_ERROR);
}
if (stNBytes == 0) {
return (0);
}
LW_THREAD_SAFE();
while (stNBytes > 0) {
ulError = API_SemaphoreBPend(ptyDev->TYDEV_hWrtSyncSemB, ptyDev->TYDEV_ulWTimeout);
if (ulError) {
LW_THREAD_UNSAFE();
_ErrorHandle(ERROR_IO_DEVICE_TIMEOUT);
return (sstNbStart - stNBytes);
}
TYDEV_LOCK(ptyDev, LW_THREAD_UNSAFE(); return (PX_ERROR));
if (ptyDev->TYDEV_iAbortFlag & OPT_WABORT) {
ptyDev->TYDEV_iAbortFlag &= ~OPT_WABORT;
TYDEV_UNLOCK(ptyDev);
LW_THREAD_UNSAFE();
_ErrorHandle(ERROR_IO_ABORT);
return (sstNbStart - stNBytes);
}
if (ptyDev->TYDEV_tydevwrstat.TYDEVWRSTAT_bCanceled) {
ptyDev->TYDEV_tydevwrstat.TYDEVWRSTAT_bCanceled = LW_FALSE;
TYDEV_UNLOCK(ptyDev);
LW_THREAD_UNSAFE();
_ErrorHandle(ERROR_IO_CANCELLED);
return (sstNbStart - stNBytes);
}
LW_SPIN_LOCK_QUICK(&ptyDev->TYDEV_slLock, &iregInterLevel);
iBytesput = rngBufPut(ptyDev->TYDEV_vxringidWrBuf,
pcBuffer,
(INT)stNBytes);
LW_SPIN_UNLOCK_QUICK(&ptyDev->TYDEV_slLock, iregInterLevel);
_TyTxStartup(ptyDev);
stNBytes -= (size_t)iBytesput;
pcBuffer += iBytesput;
LW_SPIN_LOCK_QUICK(&ptyDev->TYDEV_slLock, &iregInterLevel);
if (rngFreeBytes(ptyDev->TYDEV_vxringidWrBuf) > 0) {
LW_SPIN_UNLOCK_QUICK(&ptyDev->TYDEV_slLock, iregInterLevel);
API_SemaphoreBPost(ptyDev->TYDEV_hWrtSyncSemB);
} else {
LW_SPIN_UNLOCK_QUICK(&ptyDev->TYDEV_slLock, iregInterLevel);
}
TYDEV_UNLOCK(ptyDev);
}
LW_THREAD_UNSAFE();
return (sstNbStart);
}



