Class semsp
XWLUA类:信号量对象强指针
信号量对象强指针是Lua语言中的一种 userdata
,用于 强引用 XWOS的信号量对象。
强引用 表示会增加XWOS的信号量对象的 引用计数 。
MetaMethods
semsp:metatable.__copy (semsp, vm) | 元方法:__copy |
semsp:metatable.__gc (semsp) | 元方法:__gc |
semsp:metatable.__tostring (semsp) | 元方法:__tostring |
Methods
semsp:bind (semsp, sel, pos) | 绑定信号量对象到信号选择器 |
semsp:unbind (semsp, sel) | 从信号选择器上解绑信号量对象 |
semsp:freeze (semsp) | 冻结信号量 |
semsp:thaw (semsp) | 解冻信号量 |
semsp:post (semsp) | 发布信号量 |
semsp:wait (semsp) | 等待并获取信号 |
semsp:trywait (semsp) | 检查信号量对象 |
semsp:wait_to (semsp, to) | 限时等待并获取信号量 |
semsp:get_value (semsp) | 获取信号量的值 |
MetaMethods
- semsp:metatable.__copy (semsp, vm)
-
元方法:__copy
将信号量对象强指针拷贝到全局导出表 xwxt 中。
此元方法意味着信号量对象的强引用多了一个, 引用计数 加 1 。
Parameters:
- semsp userdata (in) 信号量对象强指针
- vm userdata (in) 目标虚拟机
Usage:
semsp = ... -- 创建信号量(代码省略) xwxt.somesem = semsp -- 信号量对象的引用计数加1 semsp2 = xwxt.somesem -- 信号量对象的引用计数加1 xwxt.somesem = nil -- 信号量对象的引用计数减1
- semsp:metatable.__gc (semsp)
-
元方法:__gc
信号量对象强指针的垃圾回收方法。
此元方法意味着信号量对象的强引用少了一个, 引用计数 减 1 。
Parameters:
- semsp userdata (in) 信号量对象强指针
Usage:
semsp = nil -- 删除引用 collectgarbage() -- 强制垃圾回收,将调用__gc()函数
- semsp:metatable.__tostring (semsp)
-
元方法:__tostring
将信号量对象强指针格式化成字符串,可用于终端打印调试。
Parameters:
- semsp userdata (in) 信号量对象强指针
Usage:
print(semsp)
Methods
- semsp:bind (semsp, sel, pos)
-
绑定信号量对象到信号选择器
Parameters:
- semsp userdata (in) 信号量对象强指针
- sel userdata (in) 信号选择器对象的强指针
- pos number (in) 信号量对象映射到信号选择器位图中的位置,位置从 0 开始编号
Returns:
-
number
错误码
● 0 没有错误
● -ECHRNG 位置超出范围
● -EALREADY 同步对象已经绑定到事件对象
● -EBUSY 通道已经被其他同步对象独占Usage:
sem = xwos.sem.new(0, 100) -- ...省略... rc = sem:bind(sel, 3) -- 绑定到信号选择器的位置3 if (rc == 0) then -- 绑定成功 else -- 绑定失败 end
- semsp:unbind (semsp, sel)
-
从信号选择器上解绑信号量对象
Parameters:
- semsp userdata (in) 信号量对象强指针
- sel userdata (in) 信号选择器对象的强指针
Returns:
-
number
错误码
● 0 没有错误
● -ENOTCONN 同步对象没有绑定到事件对象上Usage:
sem:unbind(sel)
- semsp:freeze (semsp)
-
冻结信号量
Parameters:
- semsp userdata (in) 信号量对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EALREADY 信号量对象已被冻结Usage:
sem:freeze()
- semsp:thaw (semsp)
-
解冻信号量
Parameters:
- semsp userdata (in) 信号量对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EALREADY 信号量对象已被冻结Usage:
sem:thaw()
- semsp:post (semsp)
-
发布信号量
Parameters:
- semsp userdata (in) 信号量对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -ENEGATIVE 信号量对象已被冻结
● -ERANGE 信号量对象的值已经最大Usage:
sem:post()
- semsp:wait (semsp)
-
等待并获取信号
Parameters:
- semsp userdata (in) 信号量对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EINVAL 参数错误
● -EINTR 等待被中断
● -ENOTTHDCTX 不在线程上下文中Usage:
sem = xwos.sem.new(0, 0) rc = sem:wait() if (rc == 0) then -- 获取到一个信号 else -- 错误发生 end
- semsp:trywait (semsp)
-
检查信号量对象
若没有检测到信号,立即返回,不会阻塞调用线程。
Parameters:
- semsp userdata (in) 信号量对象强指针
Returns:
-
number
错误码
● 0 没有错误
● -EINVAL 参数错误
● -EINTR 等待被中断
● -ENOTTHDCTX 不在线程上下文中
● -ENODATA 尝试失败Usage:
sem = xwos.sem.new(0, 0) rc = sem:trywait() -- 最多等待1s if (rc == 0) then -- 获取到一个信号 elseif (rc == -61) then -- 没有检测到信号 else -- 错误发生 end
- semsp:wait_to (semsp, to)
-
限时等待并获取信号量
Parameters:
- semsp userdata (in) 信号量对象强指针
- to number (in) 期望的阻塞等待时间
Returns:
-
number
错误码
● 0 没有错误
● -EINVAL 参数错误
● -EINTR 等待被中断
● -ENOTTHDCTX 不在线程上下文中
● -ETIMEDOUT 超时Usage:
sem = xwos.sem.new(0, 0) rc = sem:wait(xwtm.ft(xwtm.s(1))) -- 最多等待1s if (rc == 0) then -- 获取到一个信号 elseif (rc == -116) then -- 超时 else -- 错误发生 end
- semsp:get_value (semsp)
-
获取信号量的值
Parameters:
- semsp userdata (in) 自旋锁对象强指针
Returns:
-
number
信号量的值
Usage:
sem = xwos.sem.new(1, 0) value = sem:get_value()