diff --git a/condition.vp b/condition.vp index 96b7d9e..03f6848 100644 --- a/condition.vp +++ b/condition.vp @@ -3,6 +3,7 @@ from stdint import * from w32.win32base import * from w32.win32sync import ( CRITICAL_SECTION, + CONDITION_VARIABLE, InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection, DeleteCriticalSection, InitializeConditionVariable, SleepConditionVariableCS, WakeConditionVariable, WakeAllConditionVariable @@ -19,7 +20,7 @@ class Condition: cond.wait() cond.notify() """ - cond_var: VOIDPTR + cond_var: CONDITION_VARIABLE cs: CRITICAL_SECTION def __init__(self): diff --git a/rwlock.vp b/rwlock.vp index c7b99ec..5e11a75 100644 --- a/rwlock.vp +++ b/rwlock.vp @@ -2,6 +2,7 @@ import t, c from stdint import * from w32.win32base import * from w32.win32sync import ( + SRWLOCK, InitializeSRWLock, AcquireSRWLockExclusive, ReleaseSRWLockExclusive, AcquireSRWLockShared, ReleaseSRWLockShared @@ -20,7 +21,7 @@ class RWLock: # ... modify shared data rwlock.release_write() """ - lock: VOIDPTR + lock: SRWLOCK def __init__(self): InitializeSRWLock(c.Addr(self.lock)) diff --git a/w32/win32sync.vp b/w32/win32sync.vp index cb440a7..3eb3b5d 100644 --- a/w32/win32sync.vp +++ b/w32/win32sync.vp @@ -39,20 +39,30 @@ extern def WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: ULONG) -> ULONG extern def WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: ULONG, bAlertable: BOOL) -> ULONG extern def WaitForMultipleObjects(nCount: ULONG, lpHandles: VOIDPTR, bWaitAll: BOOL, dwMilliseconds: ULONG) -> ULONG extern def WaitForMultipleObjectsEx(nCount: ULONG, lpHandles: VOIDPTR, bWaitAll: BOOL, dwMilliseconds: ULONG, bAlertable: BOOL) -> ULONG -extern def InitializeSRWLock(SRWLock: VOIDPTR) -> VOID -extern def AcquireSRWLockExclusive(SRWLock: VOIDPTR) -> VOID -extern def AcquireSRWLockShared(SRWLock: VOIDPTR) -> VOID -extern def ReleaseSRWLockExclusive(SRWLock: VOIDPTR) -> VOID -extern def ReleaseSRWLockShared(SRWLock: VOIDPTR) -> VOID +# SRWLOCK / CONDITION_VARIABLE 在 Windows 头文件里都是"单个 PVOID 的不透明结构" +# (sizeof == 8),API 收的是**存储地址**(PSRWLOCK / PCONDITION_VARIABLE)。 +# 故必须建模成结构体:若声明成 VOIDPTR,`c.Addr(self.lock)` 会得到 i8**(多一层), +# 与形参 i8* 层数不符(指针隐式转换收紧后直接报 CastError)。 +class SRWLOCK: + Ptr: VOIDPTR + +class CONDITION_VARIABLE: + Ptr: VOIDPTR + +extern def InitializeSRWLock(SRWLock: SRWLOCK*) -> VOID +extern def AcquireSRWLockExclusive(SRWLock: SRWLOCK*) -> VOID +extern def AcquireSRWLockShared(SRWLock: SRWLOCK*) -> VOID +extern def ReleaseSRWLockExclusive(SRWLock: SRWLOCK*) -> VOID +extern def ReleaseSRWLockShared(SRWLock: SRWLOCK*) -> VOID # 条件变量 (Condition Variables) - Vista+ CONDITION_VARIABLE_LOCKMODE_SHARED: t.CDefine = 0x1 -extern def InitializeConditionVariable(ConditionVariable: VOIDPTR) -> VOID -extern def SleepConditionVariableCS(ConditionVariable: VOIDPTR, CriticalSection: CRITICAL_SECTION*, dwMilliseconds: ULONG) -> BOOL -extern def SleepConditionVariableSRW(ConditionVariable: VOIDPTR, SRWLock: VOIDPTR, dwMilliseconds: ULONG, Flags: ULONG) -> BOOL -extern def WakeConditionVariable(ConditionVariable: VOIDPTR) -> VOID -extern def WakeAllConditionVariable(ConditionVariable: VOIDPTR) -> VOID +extern def InitializeConditionVariable(ConditionVariable: CONDITION_VARIABLE*) -> VOID +extern def SleepConditionVariableCS(ConditionVariable: CONDITION_VARIABLE*, CriticalSection: CRITICAL_SECTION*, dwMilliseconds: ULONG) -> BOOL +extern def SleepConditionVariableSRW(ConditionVariable: CONDITION_VARIABLE*, SRWLock: SRWLOCK*, dwMilliseconds: ULONG, Flags: ULONG) -> BOOL +extern def WakeConditionVariable(ConditionVariable: CONDITION_VARIABLE*) -> VOID +extern def WakeAllConditionVariable(ConditionVariable: CONDITION_VARIABLE*) -> VOID # 一次性初始化 (One-Time Initialization) - Vista+ define INIT_ONCE_STATIC_INIT = 0x00000001