WvStreams
|
00001 /* 00002 * Worldvisions Weaver Software: 00003 * Copyright (C) 1997-2004 Net Integration Technologies, Inc. 00004 */ 00005 00006 #include "wvmagicloopback.h" 00007 00008 WvMagicLoopback::WvMagicLoopback(size_t size) 00009 : circle(size), loop() 00010 { 00011 } 00012 00013 00014 void WvMagicLoopback::pre_select(SelectInfo &si) 00015 { 00016 loop.drain(); 00017 00018 loop.pre_select(si); 00019 00020 if ((si.wants.readable && circle.used() > 0) || 00021 (si.wants.writable && circle.left() > 0)) 00022 si.msec_timeout = 0; 00023 } 00024 00025 00026 bool WvMagicLoopback::post_select(SelectInfo &si) 00027 { 00028 bool ret = WvStream::post_select(si); 00029 00030 if ((si.wants.readable && circle.used() > 0) || 00031 (si.wants.writable && circle.left() > 0)) 00032 ret = true; 00033 00034 return ret; 00035 } 00036 00037 00038 size_t WvMagicLoopback::uread(void *buf, size_t len) 00039 { 00040 return circle.get(buf, len); 00041 } 00042 00043 00044 size_t WvMagicLoopback::uwrite(const void *buf, size_t len) 00045 { 00046 len = circle.put(buf, len); 00047 00048 if (len > 0) 00049 loop.uwrite("", 1); // Make select wake up 00050 00051 return len; 00052 }