def wakeup_sleeper(handle): ec = core.get_ec() task = ec.uv_sleepers.pop(rffi.cast_ptr_to_adr(handle)) ec.enqueue(task) uv.timer_stop(handle) uv.close(rffi.cast(uv.handle_ptr, handle), uv.free)
def sleep_callback(duration, func): ec = core.get_ec() uv_sleeper = uv.malloc_bytes(uv.timer_ptr, uv.handle_size(uv.TIMER)) ec.uv_sleepers[rffi.cast_ptr_to_adr(uv_sleeper)] = core.to_greenlet([func]) uv.timer_init(ec.uv_loop, uv_sleeper) uv.timer_start(uv_sleeper, wakeup_sleeper, int(duration.number * 1000), 0) return space.null
def sleep_greenlet(duration): ec = core.get_ec() if ec.current == ec.eventloop: raise space.OldError(u"bad context for greenlet sleep") assert ec.current.is_exhausted() == False uv_sleeper = uv.malloc_bytes(uv.timer_ptr, uv.handle_size(uv.TIMER)) ec.uv_sleepers[rffi.cast_ptr_to_adr(uv_sleeper)] = ec.current uv.timer_init(ec.uv_loop, uv_sleeper) uv.timer_start(uv_sleeper, wakeup_sleeper, int(duration.number * 1000), 0) return core.switch([ec.eventloop])
def push_handle(table, handle, response): adr = rffi.cast_ptr_to_adr(handle) if adr in table: raise unwind(LError(u"libuv handle/request busy")) table[adr] = response
def pop_handle(table, handle): return table.pop(rffi.cast_ptr_to_adr(handle))
def push(table, self): adr = rffi.cast_ptr_to_adr(self.handle) if adr in table: raise unwind(LError(u"libuv handle/request busy")) table[adr] = self
def peek(table, handle): try: return table[rffi.cast_ptr_to_adr(handle)] except KeyError as e: raise unwind(LError(u"peek unable to find a handle"))
def drop(table, handle): try: return table.pop(rffi.cast_ptr_to_adr(handle)) except KeyError as e: raise unwind(LError(u"handle already dropped"))
def pop(self, handle): return self.table.pop(rffi.cast_ptr_to_adr(handle))
def push(self, handle, value): self.table[rffi.cast_ptr_to_adr(handle)] = value
def peek(self, handle): return self.table[rffi.cast_ptr_to_adr(handle)]