Some tweaks I made while importing back into svn
This commit is contained in:
@@ -299,7 +299,7 @@ def get_default_hub():
|
||||
pass
|
||||
|
||||
import select
|
||||
if 0:#hasattr(select, 'poll'):
|
||||
if hasattr(select, 'poll'):
|
||||
import eventlet.hubs.poll
|
||||
return eventlet.hubs.poll
|
||||
else:
|
||||
|
@@ -500,7 +500,6 @@ class HttpSuite(object):
|
||||
raise klass(params)
|
||||
|
||||
def _get_response_body(self, params, connection):
|
||||
print "CONENCTO", connection
|
||||
if connection is None:
|
||||
connection = connect(params.url, params.use_proxy)
|
||||
connection.request(params.method, params.path, params.body,
|
||||
|
@@ -1,227 +0,0 @@
|
||||
"""\
|
||||
@file runloop.py
|
||||
@author Bob Ippolito
|
||||
|
||||
Defines the core eventlet runloop. The runloop keeps track of scheduled
|
||||
events and observers which watch for specific portions of the runloop to
|
||||
be executed.
|
||||
|
||||
Copyright (c) 2005-2006, Bob Ippolito
|
||||
Copyright (c) 2007, Linden Research, Inc.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
"""
|
||||
|
||||
import time
|
||||
import bisect
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
import greenlet
|
||||
|
||||
from eventlet.timer import Timer
|
||||
|
||||
|
||||
class RunLoop(object):
|
||||
SYSTEM_EXCEPTIONS = (KeyboardInterrupt, SystemExit)
|
||||
|
||||
def __init__(self, wait=None, clock=None):
|
||||
if clock is None:
|
||||
clock = self.default_clock()
|
||||
self.clock = clock
|
||||
if wait is None:
|
||||
wait = self.default_wait
|
||||
self.wait = wait
|
||||
self.stopping = False
|
||||
self.running = False
|
||||
self.timers = []
|
||||
self.timers_by_greenlet = {}
|
||||
self.next_timers = []
|
||||
self.observers = {}
|
||||
self.observer_modes = {
|
||||
'entry': [],
|
||||
'before_timers': [],
|
||||
'before_waiting': [],
|
||||
'after_waiting': [],
|
||||
'exit': [],
|
||||
}
|
||||
|
||||
def default_wait(self, time):
|
||||
return None
|
||||
|
||||
def default_clock(self):
|
||||
return time.time
|
||||
|
||||
def default_sleep(self):
|
||||
return 60.0
|
||||
|
||||
def sleep_until(self):
|
||||
t = self.timers
|
||||
if not t:
|
||||
return None
|
||||
return t[0][0]
|
||||
|
||||
def run(self):
|
||||
"""Run the runloop until abort is called.
|
||||
"""
|
||||
if self.running:
|
||||
raise RuntimeError("Already running!")
|
||||
try:
|
||||
self.running = True
|
||||
self.stopping = False
|
||||
self.fire_observers('entry')
|
||||
while not self.stopping:
|
||||
self.prepare_timers()
|
||||
self.fire_observers('before_timers')
|
||||
self.fire_timers(self.clock())
|
||||
self.prepare_timers()
|
||||
wakeup_when = self.sleep_until()
|
||||
if wakeup_when is None:
|
||||
sleep_time = self.default_sleep()
|
||||
else:
|
||||
sleep_time = wakeup_when - self.clock()
|
||||
if sleep_time > 0:
|
||||
self.fire_observers('before_waiting')
|
||||
self.wait(sleep_time)
|
||||
self.fire_observers('after_waiting')
|
||||
else:
|
||||
self.wait(0)
|
||||
else:
|
||||
del self.timers[:]
|
||||
del self.next_timers[:]
|
||||
self.fire_observers('exit')
|
||||
finally:
|
||||
self.running = False
|
||||
self.stopping = False
|
||||
|
||||
def abort(self):
|
||||
"""Stop the runloop. If run is executing, it will exit after completing
|
||||
the next runloop iteration.
|
||||
"""
|
||||
if self.running:
|
||||
self.stopping = True
|
||||
|
||||
def add_observer(self, observer, *modes):
|
||||
"""Add an event observer to this runloop with the given modes.
|
||||
Valid modes are:
|
||||
entry: The runloop is being entered.
|
||||
before_timers: Before the expired timers for this iteration are executed.
|
||||
before_waiting: Before waiting for the calculated wait_time
|
||||
where nothing will happen.
|
||||
after_waiting: After waiting, immediately before starting the top of the
|
||||
runloop again.
|
||||
exit: The runloop is exiting.
|
||||
|
||||
If no mode is passed or mode is all, the observer will be fired for every
|
||||
event type.
|
||||
"""
|
||||
if not modes or modes == ('all',):
|
||||
modes = tuple(self.observer_modes)
|
||||
self.observers[observer] = modes
|
||||
for mode in modes:
|
||||
self.observer_modes[mode].append(observer)
|
||||
|
||||
def remove_observer(self, observer):
|
||||
"""Remove a previously registered observer from all event types.
|
||||
"""
|
||||
for mode in self.observers.pop(observer, ()):
|
||||
self.observer_modes[mode].remove(observer)
|
||||
|
||||
def squelch_observer_exception(self, observer, exc_info):
|
||||
traceback.print_exception(*exc_info)
|
||||
print >>sys.stderr, "Removing observer: %r" % (observer,)
|
||||
self.remove_observer(observer)
|
||||
|
||||
def fire_observers(self, activity):
|
||||
for observer in self.observer_modes[activity]:
|
||||
try:
|
||||
observer(self, activity)
|
||||
except self.SYSTEM_EXCEPTIONS:
|
||||
raise
|
||||
except:
|
||||
self.squelch_observer_exception(observer, sys.exc_info())
|
||||
|
||||
def squelch_timer_exception(self, timer, exc_info):
|
||||
traceback.print_exception(*exc_info)
|
||||
print >>sys.stderr, "Timer raised: %r" % (timer,)
|
||||
|
||||
def _add_absolute_timer(self, when, info):
|
||||
# the 0 placeholder makes it easy to bisect_right using (now, 1)
|
||||
self.next_timers.append((when, 0, info))
|
||||
|
||||
def add_timer(self, timer):
|
||||
scheduled_time = self.clock() + timer.seconds
|
||||
self._add_absolute_timer(scheduled_time, timer)
|
||||
current_greenlet = greenlet.getcurrent()
|
||||
if current_greenlet not in self.timers_by_greenlet:
|
||||
self.timers_by_greenlet[current_greenlet] = {}
|
||||
self.timers_by_greenlet[current_greenlet][timer] = True
|
||||
timer.greenlet = current_greenlet
|
||||
return scheduled_time
|
||||
|
||||
def prepare_timers(self):
|
||||
ins = bisect.insort_right
|
||||
t = self.timers
|
||||
for item in self.next_timers:
|
||||
ins(t, item)
|
||||
del self.next_timers[:]
|
||||
|
||||
def schedule_call(self, seconds, cb, *args, **kw):
|
||||
"""Schedule a callable to be called after 'seconds' seconds have
|
||||
elapsed.
|
||||
seconds: The number of seconds to wait.
|
||||
cb: The callable to call after the given time.
|
||||
*args: Arguments to pass to the callable when called.
|
||||
**kw: Keyword arguments to pass to the callable when called.
|
||||
"""
|
||||
t = Timer(seconds, cb, *args, **kw)
|
||||
self.add_timer(t)
|
||||
return t
|
||||
|
||||
def fire_timers(self, when):
|
||||
t = self.timers
|
||||
last = bisect.bisect_right(t, (when, 1))
|
||||
i = 0
|
||||
for i in xrange(last):
|
||||
timer = t[i][2]
|
||||
try:
|
||||
try:
|
||||
timer()
|
||||
except self.SYSTEM_EXCEPTIONS:
|
||||
raise
|
||||
except:
|
||||
self.squelch_timer_exception(timer, sys.exc_info())
|
||||
finally:
|
||||
try:
|
||||
del self.timers_by_greenlet[timer.greenlet][timer]
|
||||
except KeyError:
|
||||
pass
|
||||
del t[:last]
|
||||
|
||||
def cancel_timers(self, greenlet):
|
||||
if greenlet not in self.timers_by_greenlet:
|
||||
return
|
||||
for timer in self.timers_by_greenlet[greenlet]:
|
||||
if not timer.cancelled and timer.seconds:
|
||||
## If timer.seconds is 0, this isn't a timer, it's
|
||||
## actually eventlet's silly way of specifying whether
|
||||
## a coroutine is "ready to run" or not.
|
||||
timer.cancel()
|
||||
print 'Runloop cancelling left-over timer %s' % timer
|
||||
del self.timers_by_greenlet[greenlet]
|
||||
|
@@ -1,157 +0,0 @@
|
||||
"""\
|
||||
@file runloop_test.py
|
||||
@author Donovan Preston
|
||||
|
||||
Copyright (c) 2006-2007, Linden Research, Inc.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import time
|
||||
import StringIO
|
||||
import unittest
|
||||
|
||||
from eventlet import runloop
|
||||
|
||||
|
||||
class TestRunloop(unittest.TestCase):
|
||||
mode = 'static'
|
||||
def test_empty(self):
|
||||
r = runloop.RunLoop()
|
||||
r.schedule_call(0, r.abort)
|
||||
r.run()
|
||||
assert not r.running
|
||||
|
||||
|
||||
def test_timer(self):
|
||||
r = runloop.RunLoop()
|
||||
r.schedule_call(0.125, r.abort)
|
||||
start_time = time.time()
|
||||
r.run()
|
||||
assert time.time() - start_time >= 0.125
|
||||
assert not r.running
|
||||
|
||||
def test_observer(self):
|
||||
observed = []
|
||||
r = runloop.RunLoop()
|
||||
r.add_observer(lambda runloop, activity: observed.append(activity))
|
||||
r.schedule_call(0, r.abort)
|
||||
r.run()
|
||||
assert observed == ['entry', 'before_timers', 'before_waiting', 'after_waiting', 'exit']
|
||||
assert not r.running
|
||||
|
||||
|
||||
def test_remove_observer(self):
|
||||
r = runloop.RunLoop()
|
||||
|
||||
observed = []
|
||||
def observe(runloop, mode):
|
||||
observed.append(mode)
|
||||
r.remove_observer(observe)
|
||||
|
||||
looped = []
|
||||
def run_loop_twice(runloop, mode):
|
||||
if looped:
|
||||
r.abort()
|
||||
else:
|
||||
looped.append(True)
|
||||
|
||||
r.add_observer(observe, 'before_timers')
|
||||
r.add_observer(run_loop_twice, 'after_waiting')
|
||||
r.run()
|
||||
assert len(observed) == 1
|
||||
assert not r.running
|
||||
|
||||
def test_observer_exception(self):
|
||||
r = runloop.RunLoop()
|
||||
|
||||
observed = []
|
||||
def observe(runloop, mode):
|
||||
observed.append(mode)
|
||||
raise Exception("Squelch me please")
|
||||
|
||||
looped = []
|
||||
def run_loop_twice(runloop, mode):
|
||||
if looped:
|
||||
r.abort()
|
||||
else:
|
||||
looped.append(True)
|
||||
|
||||
saved = sys.stderr
|
||||
sys.stderr = err = StringIO.StringIO()
|
||||
|
||||
r.add_observer(observe, 'before_timers')
|
||||
r.add_observer(run_loop_twice, 'after_waiting')
|
||||
r.run()
|
||||
|
||||
err.seek(0)
|
||||
sys.stderr = saved
|
||||
|
||||
assert len(observed) == 1
|
||||
assert err.read()
|
||||
assert not r.running
|
||||
|
||||
def test_timer_exception(self):
|
||||
r = runloop.RunLoop()
|
||||
|
||||
observed = []
|
||||
def timer():
|
||||
observed.append(True)
|
||||
raise Exception("Squelch me please")
|
||||
|
||||
looped = []
|
||||
def run_loop_twice(runloop, mode):
|
||||
if looped:
|
||||
r.abort()
|
||||
else:
|
||||
looped.append(True)
|
||||
|
||||
saved = sys.stderr
|
||||
sys.stderr = err = StringIO.StringIO()
|
||||
|
||||
r.schedule_call(0, timer)
|
||||
r.add_observer(run_loop_twice, 'after_waiting')
|
||||
r.run()
|
||||
|
||||
err.seek(0)
|
||||
sys.stderr = saved
|
||||
|
||||
assert len(observed) == 1
|
||||
assert err.read()
|
||||
assert not r.running
|
||||
|
||||
def test_timer_system_exception(self):
|
||||
r = runloop.RunLoop()
|
||||
def timer():
|
||||
raise SystemExit
|
||||
|
||||
r.schedule_call(0, timer)
|
||||
|
||||
caught = []
|
||||
try:
|
||||
r.run()
|
||||
except SystemExit:
|
||||
caught.append(True)
|
||||
|
||||
assert caught
|
||||
assert not r.running
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
9
setup.py
9
setup.py
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
|
||||
from setuptools import Extension, find_packages, setup
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
|
||||
setup(
|
||||
@@ -27,10 +27,3 @@ setup(
|
||||
"Intended Audience :: Developers",
|
||||
"Development Status :: 4 - Beta"]
|
||||
)
|
||||
|
||||
|
||||
|
||||
setup(name="sendmsg",
|
||||
version="1.0",
|
||||
ext_modules=[Extension("sendmsg", ["src/sendmsg.c"])])
|
||||
|
||||
|
Reference in New Issue
Block a user