wvdaemon.h

00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2005 Net Integration Technologies, Inc.
00004  *
00005  * High-level abstraction for creating daemon processes.  Handles
00006  * command-line argument processing, forking into the background,
00007  * and signal handling.
00008  */
00009 #ifndef __WVDAEMON_H
00010 #define __WVDAEMON_H
00011 
00012 #include "wvstring.h"
00013 #include "wvargs.h"
00014 #include "wvlog.h"
00015 
00016 class WvDaemon;
00017 
00018 typedef WvCallback<void, WvDaemon &, void *> WvDaemonCallback;
00019 
00020 #ifdef WEAVER_CODENAME
00021 #ifdef WEAVER_VER_STRING
00022 #define WVDAEMON_DEFAULT_VERSION WEAVER_CODENAME ": " WEAVER_VER_STRING
00023 #else
00024 #define WVDAEMON_DEFAULT_VERSION WEAVER_CODENAME
00025 #endif
00026 #else
00027 #ifdef WEAVER_VER_STRING
00028 #define WVDAEMON_DEFAULT_VERSION WEAVER_VER_STRING
00029 #else
00030 #define WVDAEMON_DEFAULT_VERSION "(unknown version)"
00031 #endif
00032 #endif
00033         
00099 class WvDaemon
00100 {
00101     
00102         static WvDaemon *singleton;
00103 
00104     public:
00105 
00107         WvString name;
00108         WvString version;
00111         WvString pid_file;
00114         bool daemonize;
00115 
00118         WvArgs args;
00120         WvLog log;
00121         WvLog::LogLevel log_level;
00122         bool syslog;
00123     
00124     public:
00125 
00127         WvDaemonCallback load_callback;
00128         WvDaemonCallback start_callback;
00129         WvDaemonCallback run_callback;
00130         WvDaemonCallback stop_callback;
00131         WvDaemonCallback unload_callback;
00132         
00133     protected:
00134 
00135         virtual void do_load();
00136         virtual void do_start();
00137         virtual void do_run();
00138         virtual void do_stop();
00139         virtual void do_unload();
00140 
00141     private:
00142 
00143         void *ud;
00144 
00145         volatile bool _want_to_die;
00146         volatile bool _want_to_restart;
00147         volatile int _exit_status;
00148 
00149         void init(WvStringParm _name,
00150                 WvStringParm _version,
00151                 WvDaemonCallback _start_callback,
00152                 WvDaemonCallback _run_callback,
00153                 WvDaemonCallback _stop_callback,
00154                 void *_ud);
00155 
00156         int _run(const char *argv0);
00157 
00158         bool set_daemonize(void *);
00159 
00160     protected:
00161     
00162         bool dec_log_level(void *)
00163         {
00164             if ((int)log_level > (int)WvLog::Critical)
00165                 log_level = (WvLog::LogLevel)((int)log_level - 1);
00166             return true;
00167         }
00168 
00169         bool inc_log_level(void *)
00170         {
00171             if ((int)log_level < (int)WvLog::Debug5)
00172                 log_level = (WvLog::LogLevel)((int)log_level + 1);
00173             return true;
00174         }
00175 
00176         WvStringList _extra_args;
00177 
00178     public:
00179 
00182         WvDaemon(WvStringParm _name, WvStringParm _version,
00183                 WvDaemonCallback _start_callback,
00184                 WvDaemonCallback _run_callback,
00185                 WvDaemonCallback _stop_callback,
00186                 void *_ud = NULL) :
00187             log(_name, WvLog::Debug)
00188         {
00189             init(_name, _version, _start_callback, _run_callback, _stop_callback, _ud);
00190         }
00193         WvDaemon(WvStringParm _name,
00194                 WvDaemonCallback _start_callback,
00195                 WvDaemonCallback _run_callback,
00196                 WvDaemonCallback _stop_callback,
00197                 void *_ud = NULL) :
00198             log(_name, WvLog::Debug)
00199         {
00200             init(_name, WVDAEMON_DEFAULT_VERSION, _start_callback, _run_callback, _stop_callback, _ud);
00201         }
00202         virtual ~WvDaemon();
00203         
00205         int run(const char *argv0);
00207         int run(int argc, char **argv);
00208 
00210         void restart()
00211         {
00212             _want_to_restart = true;
00213         }
00215         void die(int status = 0)
00216         {
00217             _want_to_die = true;
00218             _exit_status = status;
00219         }
00220 
00222         bool want_to_restart() const
00223         {
00224             return _want_to_restart;
00225         }
00227         bool want_to_die() const
00228         {
00229             return _want_to_die;
00230         }
00231 
00233         bool should_run() const
00234         {
00235             return !_want_to_die && !_want_to_restart;
00236         }
00237 
00239         const WvStringList &extra_args() const
00240         {
00241             return _extra_args;
00242         }
00243         
00244         static WvDaemon *me()
00245         {
00246             return singleton;
00247         }
00248 
00249     public:
00250         const char *wstype() const { return "WvDaemon"; }
00251 };
00252 
00253 #endif // __WVDAEMON_H

Generated on Thu Jan 24 16:50:56 2008 for WvStreams by  doxygen 1.5.4