WvStreams
wvmagicloopback.cc
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 }