| 
根据官方文档:http://ruby-doc.org/core-2.2.0/Fiber.html
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  使用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 
 
 
 |