1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
#include "wvstreamclone.h"
#include "wvfdstream.h"
#include "wvlog.h"
class SillyStream : public WvFDStream
{
public:
int count;
SillyStream() : WvFDStream(1)
{
count = 0;
}
virtual size_t uwrite(const void *buf, size_t size)
{
++count;
fprintf(stderr, "uwrite #%d (%d bytes)\n", count, size);
if (count == 2)
close(); // pretend we had a socket error
return 0;
}
virtual bool post_select(SelectInfo &si)
{
fprintf(stderr, "post_select(%d,%d)\n",
si.wants.readable, si.wants.writable);
return WvFDStream::post_select(si) || true;
}
virtual void close()
{
fprintf(stderr, "closing.\n");
WvFDStream::close();
}
size_t obu()
{
return outbuf.used();
}
};
int main()
{
WvLog log("closeflushtest");
log("Starting.\n");
{
SillyStream s;
s.delay_output(true);
s.write("Hello world\n");
log("Said hello -- %s\n", s.obu());
s.delay_output(false);
log("Cancelled delay -- %s\n", s.obu());
s.flush_then_close(10000);
log("Scheduled close -- %s\n", s.obu());
log("Select...\n");
s.select(100);
log("Destroying -- %s\n", s.obu());
}
log("Didn't crash.\n");
return 0;
}
|