diff --git a/lib/modules/Protocols.pmod/LysKOM.pmod/Raw.pike b/lib/modules/Protocols.pmod/LysKOM.pmod/Raw.pike index ce776491c946e043fe432a04f7875c46967a7326..acc1932591d500bc9d5e7b0e916f3910b73ef7da 100644 --- a/lib/modules/Protocols.pmod/LysKOM.pmod/Raw.pike +++ b/lib/modules/Protocols.pmod/LysKOM.pmod/Raw.pike @@ -94,6 +94,7 @@ void flush_queue() } } +#if ! constant(thread_create) mixed send_sync(string request) { return sync_do(++ref,request); @@ -154,6 +155,7 @@ mixed sync_do(int ref,string|void request) return res; } +#endif void|array|object recv(mixed x,string what,void|int syn) { @@ -178,9 +180,11 @@ void|array|object recv(mixed x,string what,void|int syn) if (res) { buf=buf[len+1..]; +#if ! constant(thread_create) if (ref) call_out(got_async_message,0,res); else +#endif got_async_message(res); break; } @@ -197,9 +201,11 @@ void|array|object recv(mixed x,string what,void|int syn) out_req--; break; } +#if ! constant(thread_create) if (ref) call_out(got_reply,0,(int)res[0],res[1..]); else +#endif got_reply((int)res[0],res[1..]); out_req--; flush_queue(); @@ -218,9 +224,11 @@ void|array|object recv(mixed x,string what,void|int syn) out_req--; break; } +#if ! constant(thread_create) if (ref) call_out(got_reply,0,ref,lyskom_error(no,status)); else +#endif got_reply(ref,lyskom_error(no,status)); out_req--; flush_queue(); @@ -240,6 +248,31 @@ void|array|object recv(mixed x,string what,void|int syn) return ires; } +void read_thread() +{ + string s; + while ((s=con->read(8192,1))) + { + if (s=="") + { + connection_lost(); + return; + } + recv(0,s); + } +} + +#if constant(thread_create) +Thread.Fifo call_fifo=Thread.Fifo(); + +void call_thread() +{ + array a; + while ( (a=call_fifo->read()) ) + a[0](a[1]); +} +#endif + void connection_lost() { werror("CONNECTION LOST\n"); @@ -247,9 +280,15 @@ void connection_lost() con=0; // send error to all outstanding requests foreach (values(async),function f) +#if constant(thread_create) + if (f) call_fifo->write( ({f,lyskom_error(CONNECTION_CLOSED)}) ); + call_fifo->write(0); +#else if (f) f(lyskom_error(CONNECTION_CLOSED)); +#endif } + void create(string server,void|int port,void|string whoami) { mixed err; @@ -299,7 +338,12 @@ void create(string server,void|int port,void|string whoami) con=0; return; } +#if constant(thread_create) + thread_create(read_thread); + thread_create(call_thread); +#else con->set_nonblocking(recv,0,0); +#endif return; } @@ -444,7 +488,11 @@ void got_reply(int ref,object|array what) return; } m_delete(async,ref); +#if constant(thread_create) + call_fifo->write( ({call,what}) ); +#else call_out(call,0,what); +#endif } void delete_async(int ref) diff --git a/lib/modules/Protocols.pmod/LysKOM.pmod/Request.pmod b/lib/modules/Protocols.pmod/LysKOM.pmod/Request.pmod index 66df35c90f80c3ff307f84b73c1d92d42d4577d4..4a258bc59387c18e99ad798d2b8012d8c9b5c158 100644 --- a/lib/modules/Protocols.pmod/LysKOM.pmod/Request.pmod +++ b/lib/modules/Protocols.pmod/LysKOM.pmod/Request.pmod @@ -1,4 +1,4 @@ -// $Id: Request.pmod,v 1.1 1999/06/12 23:01:50 mirar Exp $ +// $Id: Request.pmod,v 1.2 1999/06/14 19:23:14 mirar Exp $ //! module Protocols //! submodule LysKOM //! submodule Request @@ -66,8 +66,13 @@ class _Request mixed _sync(int call,mixed ... data) { +#if constant(thread_create) + _async(call,@data); + return `()(); +#else mixed res=raw->send_sync(encode(call,@data),_reply); return _reply(res); +#endif } mixed _reply(object|array what)