def cr(func, *args, **kw):
"""Return a function which invokes FUNC(*ARGS, **KW) in a coroutine."""
- def _(*hunoz, **hukairz):
- T.Coroutine(xwrap(func)).switch(*args, **kw)
- return _
+ name = T.funargstr(func, args, kw)
+ return lambda *hunoz, **hukairz: \
+ T.Coroutine(xwrap(func), name = name).switch(*args, **kw)
def incr(func):
"""Decorator: runs its function in a coroutine of its own."""
- return lambda *args, **kw: T.Coroutine(func).switch(*args, **kw)
+ return lambda *args, **kw: \
+ (T.Coroutine(func, name = T.funargstr(func, args, kw))
+ .switch(*args, **kw))
###--------------------------------------------------------------------------
### Random bits of infrastructure.
def update(me, hunoz = None):
"""Update the peer, fetching information about it from the server."""
- addr = conn.addr(me.name)
+ me._setaddr(me, conn.addr(me.name))
+ me.ifname = conn.ifname(me.name)
+ me.__dict__.update(conn.peerinfo(me.name))
+ me.changehook.run()
+
+ def _setaddr(me, addr):
+ """Set the peer's address."""
if addr[0] == 'INET':
ipaddr, port = addr[1:]
try:
me.addr = 'INET %s:%s' % (ipaddr, port)
else:
me.addr = ' '.join(addr)
- me.ifname = conn.ifname(me.name)
- me.__dict__.update(conn.peerinfo(me.name))
+
+ def setaddr(me, addr):
+ """Informs the object of a change to its address to ADDR."""
+ me._setaddr(addr)
me.changehook.run()
def setifname(me, newname):
me.peers[rest[0]].setifname(rest[2])
except KeyError:
pass
+ elif code == 'NEWADDR':
+ try:
+ me.peers[rest[0]].setaddr(rest[1:])
+ except KeyError:
+ pass
elif code == 'SVCCLAIM':
T.aside(me.services.add, rest[0], rest[1])
if rest[0] == 'connect':
def tryupdate(me):
"""Start the updater coroutine, if it's not going already."""
if me.cr is None:
- me.cr = T.Coroutine(me._update)
+ me.cr = T.Coroutine(me._update,
+ name = 'update-peer-window %s' % me.peer.name)
me.cr.switch()
def stopupdate(me, *hunoz, **hukairz):
"""
if me._kidding:
return
- T.Coroutine(me._addautopeer_hack).switch(peer)
+ T.Coroutine(me._addautopeer_hack,
+ name = '_addautopeerhack %s' % peer).switch(peer)
def _addautopeer_hack(me, peer):
"""Make an automated connection to PEER in response to a user click."""