import t, c
from stdint import *
from w32.win32base import *
from w32.win32sync import (
    InitializeSRWLock,
    AcquireSRWLockExclusive, ReleaseSRWLockExclusive,
    AcquireSRWLockShared, ReleaseSRWLockShared
)


@t.Object
class RWLock:
    """基于 SRWLock 的读写锁，支持多读单写，不支持递归。

    用法:
        rwlock: RWLock = RWLock()
        rwlock.acquire_read()
        # ... 读取共享数据
        rwlock.release_read()
        rwlock.acquire_write()
        # ... 修改共享数据
        rwlock.release_write()
    """
    lock: VOIDPTR

    def __init__(self):
        InitializeSRWLock(c.Addr(self.lock))

    def acquire_read(self):
        AcquireSRWLockShared(c.Addr(self.lock))

    def release_read(self):
        ReleaseSRWLockShared(c.Addr(self.lock))

    def acquire_write(self):
        AcquireSRWLockExclusive(c.Addr(self.lock))

    def release_write(self):
        ReleaseSRWLockExclusive(c.Addr(self.lock))

    def __enter__(self) -> 'RWLock' | t.CPtr:
        self.acquire_write()
        return self

    def __exit__(self):
        self.release_write()
