00001
00002
00003
00004
00005
00006
00007
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
00067
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