加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
根据官方文档:http://ruby-doc.org/core-2.2.0/Fiber.html
使用fiber实例的alive?方法需要
You need to require 'fiber' before using this method.
有时候VA里也需要这么个操作,所以就出现了下面的玩意儿
思路也很简单,因为在resume一个status为TERMINATED的fiber时,会抛出dead fiber异常,
也就是说本身Fiber就存在判定自身状态的方法。通过这个提示的位置逆向出储存状态编号的地址,接着根据官方提供的源码逻辑,来定义alive?方法
class Fiber Memcopy = Win32API.new('kernel32','RtlMoveMemory','pll','l') CREATING = 0 RUNNING = 1 TERMINATED = 2 def status buf = "\0"*4 Memcopy.call(buf,self.object_id*2+16,4) objPtr = buf.unpack("L").first return 0 if objPtr == 0 Memcopy.call(buf,objPtr+480,4) return buf.unpack("L").first end def alive? return self.status != TERMINATE end end
class Fiber
Memcopy = Win32API.new('kernel32','RtlMoveMemory','pll','l')
CREATING = 0
RUNNING = 1
TERMINATED = 2
def status
buf = "\0"*4
Memcopy.call(buf,self.object_id*2+16,4)
objPtr = buf.unpack("L").first
return 0 if objPtr == 0
Memcopy.call(buf,objPtr+480,4)
return buf.unpack("L").first
end
def alive?
return self.status != TERMINATE
end
end
|