00001 #ifndef LOCKED_LOGGER_IMPLEMENTATION_FILE 00002 #define LOCKED_LOGGER_IMPLEMENTATION_FILE 00003 00004 /*****************************************************************************\ 00005 * * 00006 * Name : locked_logger * 00007 * Author : Chris Koeritz * 00008 * * 00009 ******************************************************************************* 00010 * Copyright (c) 2002-$now By Author. This program is free software; you can * 00011 * redistribute it and/or modify it under the terms of the GNU General Public * 00012 * License as published by the Free Software Foundation; either version 2 of * 00013 * the License or (at your option) any later version. This is online at: * 00014 * http://www.fsf.org/copyleft/gpl.html * 00015 * Please send any updates to: fred@gruntose.com * 00016 \*****************************************************************************/ 00017 00018 #ifndef OMIT_PROGRAM_WIDE_LOGGER 00019 00020 #include "locked_logger.h" 00021 00022 #include <basis/istring.h> 00023 #include <basis/set.cpp> 00024 00025 locked_logger::locked_logger(log_base *the_logger) 00026 : log_base(), 00027 locked_object<log_base>(the_logger) 00028 { 00029 #ifdef NOISY_LOCKED_LOGGER 00030 // debugging code. 00031 write_to_critical_events((istring("app ") + portable::application_name() 00032 + isprintf(" pid %d creating locked logger.", process_id())).s()); 00033 #endif 00034 } 00035 00036 locked_logger::~locked_logger() 00037 { 00038 log_base *old_log = swap(NIL); 00039 WHACK(old_log); 00040 } 00041 00042 #define LOCK_LOGGER(retval) \ 00043 log_base *real_guy = lock_object(); \ 00044 if (!real_guy) { \ 00045 unlock_object(real_guy); \ 00046 return retval; \ 00047 } 00048 00049 #define UNLOCK_LOGGER \ 00050 unlock_object(real_guy) 00051 00052 bool locked_logger::established() 00053 { 00054 LOCK_LOGGER(false); 00055 UNLOCK_LOGGER; 00056 return true; 00057 } 00058 00059 void locked_logger::add_filter(int new_filter) 00060 { 00061 LOCK_LOGGER(); 00062 real_guy->add_filter(new_filter); 00063 UNLOCK_LOGGER; 00064 } 00065 00066 void locked_logger::remove_filter(int old_filter) 00067 { 00068 LOCK_LOGGER(); 00069 real_guy->remove_filter(old_filter); 00070 UNLOCK_LOGGER; 00071 } 00072 00073 bool locked_logger::member(int filter_to_check) 00074 { 00075 LOCK_LOGGER(false); 00076 bool to_return = real_guy->member(filter_to_check); 00077 UNLOCK_LOGGER; 00078 return to_return; 00079 } 00080 00081 void locked_logger::clear_filters() 00082 { 00083 LOCK_LOGGER(); 00084 real_guy->clear_filters(); 00085 UNLOCK_LOGGER; 00086 } 00087 00088 int_set locked_logger::filter_set() 00089 { 00090 LOCK_LOGGER(int_set()); 00091 int_set to_return = real_guy->filter_set(); 00092 UNLOCK_LOGGER; 00093 return to_return; 00094 } 00095 00096 log_base::line_ending locked_logger::eol() 00097 { 00098 LOCK_LOGGER(LF_AT_END); 00099 log_base::line_ending to_return = real_guy->eol(); 00100 UNLOCK_LOGGER; 00101 return to_return; 00102 } 00103 00104 void locked_logger::eol(line_ending to_set) 00105 { 00106 LOCK_LOGGER(); 00107 real_guy->eol(to_set); 00108 UNLOCK_LOGGER; 00109 } 00110 00111 istring locked_logger::get_ending() 00112 { 00113 LOCK_LOGGER(istring::empty_string()); 00114 istring to_return = real_guy->get_ending(); 00115 UNLOCK_LOGGER; 00116 return to_return; 00117 } 00118 00119 void locked_logger::get_ending(istring &to_end) 00120 { 00121 LOCK_LOGGER(); 00122 real_guy->get_ending(to_end); 00123 UNLOCK_LOGGER; 00124 } 00125 00126 outcome locked_logger::log(const istring &info, int filter) 00127 { 00128 LOCK_LOGGER(common::BAD_INPUT); 00129 outcome to_return = real_guy->log(info, filter); 00130 UNLOCK_LOGGER; 00131 return to_return; 00132 } 00133 00134 #endif 00135 00136 00137 #endif //LOCKED_LOGGER_IMPLEMENTATION_FILE 00138
1.5.1