wvstreamsdaemon.cc

00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Tunnel Vision Software:
00003  *   Copyright (C) 1997-2005 Net Integration Technologies, Inc.
00004  *
00005  * High-level abstraction for creating daemon processes that do
00006  * nothing but listen on a list of WvStreams and add connections
00007  * to the global list.
00008  */
00009 
00010 #include "wvstreamsdaemon.h"
00011 
00012 #ifndef _WIN32
00013 #include <signal.h>
00014 #endif
00015 
00016 WvStreamsDaemon::WvStreamsDaemon(WvStringParm name, WvStringParm version,
00017         WvStreamsDaemonCallback cb, void *ud)
00018     : WvDaemon(name, version,
00019                 WvDaemonCallback(this, &WvStreamsDaemon::start_cb),
00020                 WvDaemonCallback(this, &WvStreamsDaemon::run_cb),
00021                 WvDaemonCallback(this, &WvStreamsDaemon::stop_cb))
00022 {
00023     setcallback(cb, ud);
00024 #ifndef _WIN32
00025     signal(SIGPIPE, SIG_IGN);
00026 #endif
00027 }
00028 
00029 void WvStreamsDaemon::start_cb(WvDaemon &daemon, void *)
00030 {
00031     callback(*this, userdata);
00032 }
00033 
00034 void WvStreamsDaemon::run_cb(WvDaemon &daemon, void *)
00035 {
00036     if (streams.isempty())
00037     {
00038         log(WvLog::Error, "No streams; exiting\n");
00039         die();
00040     }
00041 
00042     while (daemon.should_run())
00043         WvIStreamList::globallist.runonce();
00044 }
00045 
00046 void WvStreamsDaemon::stop_cb(WvDaemon &daemon, void *)
00047 {
00048     WvIStreamList::Iter stream(streams);
00049     for (stream.rewind(); stream.next(); )
00050         WvIStreamList::globallist.unlink(stream.ptr());
00051     streams.zap();
00052     if (want_to_die())
00053         WvIStreamList::globallist.zap();
00054 }
00055 
00056 void WvStreamsDaemon::stop_full_close_cb(WvDaemon &daemon, void *ud)
00057 {
00058     stop_cb(daemon, ud);
00059     WvIStreamList::globallist.zap();
00060 }
00061 
00062 void WvStreamsDaemon::add_stream(IWvStream *istream,
00063         bool autofree, const char *id)
00064 {
00065     streams.append(istream, false);
00066     // FIXME: we should pass in "id" here, but things are not happy in
00067     // const-correctness-land.
00068     WvIStreamList::globallist.append(istream, autofree);
00069 }
00070 
00071 void WvStreamsDaemon::add_restart_stream(IWvStream *istream,
00072         bool autofree, const char *id)
00073 {
00074     add_stream(istream, autofree, id);
00075     
00076     istream->setclosecallback(
00077         WvBoundCallback<IWvStreamCallback, const char*>(this, &WvStreamsDaemon::restart_close_cb, id));
00078 }
00079 
00080 void WvStreamsDaemon::add_die_stream(IWvStream *istream,
00081         bool autofree, const char *id)
00082 {
00083     add_stream(istream, autofree, id);
00084     
00085     istream->setclosecallback(
00086         WvBoundCallback<IWvStreamCallback, const char*>(this, &WvStreamsDaemon::die_close_cb, id));
00087 }
00088 
00089 void WvStreamsDaemon::close_existing_connections_on_restart()
00090 {
00091     stop_callback =
00092         WvDaemonCallback(this, &WvStreamsDaemon::stop_full_close_cb);
00093 }
00094 
00095 void WvStreamsDaemon::restart_close_cb(const char *id, WvStream &)
00096 {
00097     if (should_run())
00098     {
00099         log(WvLog::Error, "%s is stale; restarting\n",
00100                 id ? id : "Stream");
00101         restart();
00102     }
00103 }
00104 
00105 void WvStreamsDaemon::die_close_cb(const char *id, WvStream &)
00106 {
00107     if (should_run())
00108     {
00109         log(WvLog::Error, "%s is stale; dying\n",
00110                 id ? id : "Stream");
00111         die();
00112     }
00113 }
00114 
00115 void WvStreamsDaemon::setcallback(WvStreamsDaemonCallback cb, void *ud)
00116 {
00117     callback = cb;
00118     userdata = ud;
00119 }
00120 

Generated on Thu May 25 21:51:04 2006 for WvStreams by  doxygen 1.4.6