Mercurial > bzapi
view channels.py @ 34:b4fab248d1eb
Added a bunch of files from http://hg.toolness.com/cosocket
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Thu, 24 Dec 2009 15:40:39 -0800 |
parents | |
children |
line wrap: on
line source
import cosocket _channels = {} class until_message_sent(cosocket.CoroutineInstruction): def do_execute(self, channel_name, message): if channel_name in _channels: receivers = _channels[channel_name].values() del _channels[channel_name] for receiver in receivers: receiver.trampoline.continue_from_yield(message) self.dispatcher.trampoline.continue_from_yield() class _until_message_received(cosocket.CoroutineInstruction): def do_execute(self, channel_name, timeout = cosocket.DEFAULT_TIMEOUT): if channel_name not in _channels: _channels[channel_name] = {} fd = self.dispatcher.socket.fileno() _channels[channel_name][fd] = self.dispatcher self.dispatcher.set_timeout(timeout) self.channel_name = channel_name self._fd = fd def finalize(self): if (self.channel_name in _channels and self._fd in _channels[self.channel_name]): del _channels[self.channel_name][self._fd] if not _channels[self.channel_name]: del _channels[self.channel_name] def until_message_received(channel_name): instruction = _until_message_received(channel_name) try: message = yield instruction yield cosocket.return_value(message) finally: instruction.finalize()