aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpzread <netfirewall@gmail.com>2013-05-09 00:34:28 +0800
committerpzread <netfirewall@gmail.com>2013-05-09 00:34:28 +0800
commitd6bb4b221306f3b549f6fb41e85a1093ca659132 (patch)
treec03b623928526cb2d5321de47f0b77022bc24510
parent026f1974af083ddc46f3b0438cdb553923a289c6 (diff)
downloadtaiwan-online-judge-d6bb4b221306f3b549f6fb41e85a1093ca659132.tar
taiwan-online-judge-d6bb4b221306f3b549f6fb41e85a1093ca659132.tar.gz
taiwan-online-judge-d6bb4b221306f3b549f6fb41e85a1093ca659132.tar.bz2
taiwan-online-judge-d6bb4b221306f3b549f6fb41e85a1093ca659132.tar.lz
taiwan-online-judge-d6bb4b221306f3b549f6fb41e85a1093ca659132.tar.xz
taiwan-online-judge-d6bb4b221306f3b549f6fb41e85a1093ca659132.tar.zst
taiwan-online-judge-d6bb4b221306f3b549f6fb41e85a1093ca659132.zip
Done remote call and ret
-rw-r--r--src/py/imc/nonblock.py4
-rwxr-xr-xsrc/py/imc/proxy.py66
2 files changed, 44 insertions, 26 deletions
diff --git a/src/py/imc/nonblock.py b/src/py/imc/nonblock.py
index 8726c49..c2741c0 100644
--- a/src/py/imc/nonblock.py
+++ b/src/py/imc/nonblock.py
@@ -26,7 +26,7 @@ def func(f):
try:
next(gen)
- return (False,None)
+ return (False,gen_current_id)
except StopIteration as ret:
del gen_waitmap[gen_current_id]
return (True,ret)
@@ -44,7 +44,7 @@ def retcall(genid,value):
gen = gen_waitmap[gen_current_id]
gen.send(value)
- return (False,None)
+ return (False,gen_current_id)
except StopIteration as ret:
del gen_waitmap[gen_current_id]
return (True,ret)
diff --git a/src/py/imc/proxy.py b/src/py/imc/proxy.py
index 371285f..e10a843 100755
--- a/src/py/imc/proxy.py
+++ b/src/py/imc/proxy.py
@@ -30,6 +30,7 @@ class Proxy:
self._conn_linkidmap = {}
self._caller_genidmap = {self._linkid:{}}
+ self._retcall_genidmap = {}
self._call_pathmap = {}
self.MSGTYPE_CALL = 'call'
@@ -62,22 +63,41 @@ class Proxy:
return self._conn_linkidmap[linkid]
+ def register_call(self,path,func_name,func):
+ self._call_pathmap[''.join([path,'/',func_name])] = func
+
def call(self,genid,timeout,iden,dst,func_name,param):
def _call_cb(genid,err,retvalue):
print('Opps')
try:
- stat,retvalue = self._route_call(genid,iden,dst,func_name,param)
+ stat,linkid,retvalue = self._route_call(genid,iden,dst,func_name,param)
if stat == True:
- self._ioloop.add_callback(nonblock.retcall,genid,retvalue)
+ self._ioloop.add_callback(self.retcall,genid,retvalue)
else:
- self._add_waitcaller(self._linkid,genid,timeout,_call_cb)
+ if retvalue != None:
+ self._retcall_genidmap[retvalue] = {
+ 'genid':genid,
+ 'callback':tornado.stack_context.wrap(self._retcall)
+ }
+
+ self._add_waitcaller(linkid,genid,timeout,_call_cb)
except Exception as err:
+ print(err)
_call_cb(genid,err,None)
- def register_call(self,path,func_name,func):
- self._call_pathmap[''.join([path,'/',func_name])] = func
+ def retcall(self,genid,retvalue):
+ stat,retvalue = nonblock.retcall(genid,retvalue)
+ if stat == True:
+ try:
+ data = self._retcall_genidmap.pop(genid)
+ data['callback'](data['genid'],retvalue)
+
+ except KeyError:
+ pass
+ else:
+ pass
def _route_call(self,genid,iden,dst,func_name,param):
dst_part = dst.split('/')[1:]
@@ -85,11 +105,15 @@ class Proxy:
path = ''.join(dst_part[2:])
if linkid == self._linkid:
- stat,retvalue = self._handle_call(genid,iden,path,func_name,param)
- if stat == True:
- ret = (True,retvalue)
- else:
- ret = (False,self._linkid)
+ try:
+ stat,retvalue = self._call_pathmap[''.join([path,'/',func_name])](param)
+ if stat == True:
+ ret = (True,None,retvalue)
+ else:
+ ret = (False,linkid,retvalue)
+
+ except KeyError:
+ raise Exception('notexist')
else:
conn = self.get_conn(linkid)
@@ -97,16 +121,10 @@ class Proxy:
pass
self._send_msg_call(conn,genid,iden,dst,func_name,param)
- ret = (False,conn.linkid)
+ ret = (False,conn.linkid,None)
return ret
- def _handle_call(self,genid,iden,path,func_name,param):
- try:
- return self._call_pathmap[''.join([path,'/',func_name])](param)
- except KeyError:
- raise Exception('notexist')
-
def _recvloop_dispatch(self,conn,data):
msg = json.loads(data.decode('utf-8'))
msg_type = msg['type']
@@ -119,7 +137,7 @@ class Proxy:
self.del_conn(conn)
print('connection close')
- def _add_waitcaller(linkid,genid,timeout,callback):
+ def _add_waitcaller(self,linkid,genid,timeout,callback):
wait = {
'timeout':timeout,
'callback':tornado.stack_context.wrap(callback)
@@ -164,7 +182,7 @@ class Proxy:
print('Opps')
try:
- stat,retvalue = self._route_call(genid,iden,dst,func_name,param)
+ stat,linkid,retvalue = self._route_call(genid,iden,dst,func_name,param)
if stat == True:
self._send_msg_ret(conn,genid,retvalue)
@@ -174,8 +192,6 @@ class Proxy:
except Exception as err:
_call_cb(genid,err,None)
- #self._send_msg_ret(conn,genid,'Hello')
-
def _send_msg_ret(self,conn,genid,retvalue):
msg = {
'type':self.MSGTYPE_RET,
@@ -188,10 +204,12 @@ class Proxy:
genid = msg['genid']
retvalue = msg['retvalue']
- print(self._caller_genidmap)
- self._caller_genidmap[conn.linkid].pop(genid)
+ try:
+ del self._caller_genidmap[conn.linkid][genid]
+ self.retcall(genid,retvalue)
- print(retvalue)
+ except KeyError:
+ pass
@nonblock.call
def imc_call(iden,dst,func_name,param,_genid):