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
generated by LDoc 1.5.0 Last updated 2024-12-17 12:17:46