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 bool WvMagicLoopback::pre_select(SelectInfo &si)
00015 {
00016 loop.drain();
00017
00018 loop.pre_select(si);
00019
00020 if (si.wants.readable)
00021 {
00022 if (circle.used() > 0)
00023 return true;
00024 }
00025
00026 if (si.wants.writable)
00027 {
00028 if (circle.left() > 0)
00029 return true;
00030 }
00031
00032 return false;
00033 }
00034
00035 size_t WvMagicLoopback::uread(void *buf, size_t len)
00036 {
00037 return circle.get(buf, len);
00038 }
00039
00040
00041 size_t WvMagicLoopback::uwrite(const void *buf, size_t len)
00042 {
00043 len = circle.put(buf, len);
00044
00045 if (len > 0)
00046 loop.uwrite("", 1);
00047
00048 return len;
00049 }