Class sqlksp
XWLUA类:顺序锁对象强指针
顺序锁对象强指针是Lua语言中的一种 userdata
,用于 强引用 XWLUA的顺序锁对象。
强引用 表示会增加XWLUA的顺序锁对象的 引用计数 。
MetaMethods
sqlksp:metatable.__copy (sqlksp, vm) | 元方法:__copy |
sqlksp:metatable.__gc (sqlksp) | 元方法:__gc |
sqlksp:metatable.__close (sqlksp) | 元方法:__close |
sqlksp:metatable.__tostring (sqlksp) | 元方法:__tostring |
Methods
sqlksp:rd_begin (sqlksp) | 开启读临界区 |
sqlksp:rd_retry (sqlksp, seq) | 测试顺序值是否改变 |
sqlksp:get_seq (sqlksp) | 获取顺序锁的顺序值 |
sqlksp:wr_lock (sqlksp) | 开启写临界区 |
sqlksp:wr_trylock (sqlksp) | 尝试开启写临界区 |
sqlksp:rdex_lock (sqlksp) | 开启独占读临界区 |
sqlksp:rdex_trylock (sqlksp) | 尝试开启独占读临界区 |
sqlksp:unlock (sqlksp) | 解锁顺序锁 |
sqlksp:get_lkst (sqlksp) | 获取顺序锁状态 |
MetaMethods
- sqlksp:metatable.__copy (sqlksp, vm)
-
元方法:__copy
将顺序锁对象强指针拷贝到全局导出表 xwxt 中。
此元方法意味着顺序锁对象的强引用多了一个, 引用计数 加 1 。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
- vm userdata (in) 目标虚拟机
Usage:
sqlksp = ... -- 创建顺序锁的代码(省略) xwxt.somesqlk = sqlksp -- 顺序锁对象的引用计数加1 sqlksp2 = xwxt.somesqlk -- 顺序锁对象的引用计数加1 xwxt.somesqlk = nil -- 顺序锁对象的引用计数减1
- sqlksp:metatable.__gc (sqlksp)
-
元方法:__gc
顺序锁对象强指针的垃圾回收方法。
此元方法意味着顺序锁对象的强引用少了一个, 引用计数 减 1 。
如果顺序锁对象被销毁时还处于 上锁状态 ,将自动被解锁。 上锁状态 是指处于 独占写 与 独占读 临界区,而 非独占读 临界区不属于 上锁状态 。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Usage:
sqlksp = nil -- 删除引用 collectgarbage() -- 强制垃圾回收,将调用__gc()函数
- sqlksp:metatable.__close (sqlksp)
-
元方法:__close
顺序锁对象强指针具有 to-be-close 特性。当顺序锁对象强指针离开其作用域时,若关联的顺序锁还处于 上锁状态 ,将自动解锁。 上锁状态 是指处于 独占写 与 独占读 临界区,而 非独占读 临界区不属于 上锁状态 。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Usage:
mysqlk = xwos.sqlk.new() function test() local scopelock<close> = mysqlk scopelock:lock("wr") -- 临界区 end -- 自动解锁顺序锁
- sqlksp:metatable.__tostring (sqlksp)
-
元方法:__tostring
将顺序锁对象强指针格式化成字符串,可用于终端打印调试。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Usage:
print(sqlksp)
Methods
- sqlksp:rd_begin (sqlksp)
-
开启读临界区
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Returns:
-
number
锁当前的顺序值
Usage:
lock = xwos.sqlk.new() repeat seq = lock:rd_begin() -- 读临界区 retry = lock:rd_retry(seq) until (not retry)
- sqlksp:rd_retry (sqlksp, seq)
-
测试顺序值是否改变
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
- seq number (in) 顺序锁非独占读临界区开启时的顺序值
Returns:
-
boolean
是否需要重试
Usage:
lock = xwos.sqlk.new() repeat seq = lock:rd_begin() -- 读临界区 retry = lock:rd_retry(seq) until (not retry)
- sqlksp:get_seq (sqlksp)
-
获取顺序锁的顺序值
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Returns:
-
userdata
锁的顺序值
Usage:
seq = lock:get_seq()
- sqlksp:wr_lock (sqlksp)
-
开启写临界区
若顺序锁无法上锁,就自旋等待。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EINVAL 参数错误Usage:
lock = xwos.sqlk.new() lock:wr_lock() -- 独占写临界区 lock:unlock()
- sqlksp:wr_trylock (sqlksp)
-
尝试开启写临界区
若顺序锁无法上锁,不会自旋等待。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EINVAL 参数错误
● -EAGAIN 尝试上锁失败Usage:
lock = xwos.sqlk.new() rc = lock:wr_trylock() if (rc == 0) then -- 独占写临界区 lock:unlock() end
- sqlksp:rdex_lock (sqlksp)
-
开启独占读临界区
若顺序锁无法上锁,就自旋等待。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EINVAL 参数错误Usage:
lock = xwos.sqlk.new() lock:rdex_lock() -- 独占读临界区 lock:unlock()
- sqlksp:rdex_trylock (sqlksp)
-
尝试开启独占读临界区
若顺序锁无法上锁,不会自旋等待。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EINVAL 参数错误
● -EAGAIN 尝试上锁失败Usage:
lock = xwos.sqlk.new() rc = lock:rdex_trylock() if (rc == 0) then -- 独占读临界区 lock:unlock() end
- sqlksp:unlock (sqlksp)
-
解锁顺序锁
此方法会根据顺序锁上锁的类型(独占写或独占读),自动选择解锁方式。
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Usage:
lock = xwos.sqlk.new() lock:wr_lock() -- 独占写临界区 lock:unlock()
lock = xwos.sqlk.new() rc = lock:rdex_trylock() if (rc == 0) then -- 独占读临界区 lock:unlock() end
- sqlksp:get_lkst (sqlksp)
-
获取顺序锁状态
Parameters:
- sqlksp userdata (in) 顺序锁对象强指针
Returns:
-
number
锁状态
● 0 未锁定
● 1 独占读锁
● 2 写锁Usage:
lock = xwos.sqlk.new() rc = lock:lock() if (rc == 0) then -- 临界区 lkst = lock:get_lkst() lock:unlock() end