00001
00002
00003
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);
00050
00051 return len;
00052 }