Diagnostic.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CASA_DBUS_DIAGNOSTIC_H_
00029 #define CASA_DBUS_DIAGNOSTIC_H_
00030 #include <string>
00031 #include <stdarg.h>
00032
00033 namespace casa {
00034 namespace dbus {
00035
00036 class Diagnostic {
00037 public:
00038 friend class init_diagnostic_object_t;
00039 void argv( int argc_, const char *argv_[] ) {
00040 kernel_t &k = lock_kernel( );
00041 if ( k.do_log( ) ) k.argv(argc_,argv_);
00042 release_kernel( );
00043 }
00044 void argv( int argc_, char *argv_[] ) {
00045 kernel_t &k = lock_kernel( );
00046 if ( k.do_log( ) ) k.argv(argc_,argv_);
00047 release_kernel( );
00048 }
00049 Diagnostic( ) { }
00050 virtual ~Diagnostic( ) { }
00051
00052 void error(const char *fmt, ...) {
00053 kernel_t &k = lock_kernel( );
00054 if ( k.do_log( ) ) {
00055 va_list argp;
00056 va_start(argp, fmt);
00057 verror(k, fmt, argp);
00058 va_end(argp);
00059 }
00060 }
00061
00062 void info(const char *fmt, ...) {
00063 kernel_t &k = lock_kernel( );
00064 if ( k.do_log( ) ) {
00065 va_list argp;
00066 va_start(argp, fmt);
00067 vinfo(k, fmt, argp);
00068 va_end(argp);
00069 }
00070 }
00071
00072 private:
00073
00074 struct kernel_t {
00075 kernel_t( );
00076 kernel_t( FILE *f );
00077 bool do_log( ) const { return fptr != 0; }
00078 ~kernel_t( ) { if ( fptr ) fclose(fptr); }
00079 void argv( int argc_, const char *argv_[] );
00080 void argv( int argc_, char *argv_[] );
00081 FILE *fptr;
00082 pid_t pid;
00083 std::string name;
00084 };
00085
00086
00087
00088 void verror(kernel_t &, const char *fmt, va_list argp);
00089 void vinfo(kernel_t &, const char *fmt, va_list argp);
00090
00091 kernel_t &lock_kernel( );
00092 void release_kernel( ) { }
00093 void output_prologue( );
00094 void output_epilogue( );
00095 };
00096
00097 Diagnostic diagnostic;
00098
00099 static class init_diagnostic_object_t {
00100 public:
00101 init_diagnostic_object_t( ) { if ( count++ == 0 ) diagnostic.output_prologue( ); }
00102 ~init_diagnostic_object_t( ) { if ( --count == 0 ) { diagnostic.output_epilogue( ); } }
00103 private:
00104 static unsigned long count;
00105 } init_diagnostic_object_;
00106 }
00107 }
00108
00109 #endif