00001 #ifndef BCSIGNALS_H
00002 #define BCSIGNALS_H
00003
00004 #include "arraylist.h"
00005 #include "bcsignals.inc"
00006 #include <pthread.h>
00007 #include <signal.h>
00008
00009 #define TRON(x) BC_Signals::new_function(x);
00010 #define TROFF(x) BC_Signals::delete_function(x);
00011
00012
00013
00014 #define ENABLE_TRACE
00015 #define TRACE_LOCKS
00016
00017
00018
00019 #define TRACE_MEMORY
00020
00021
00022
00023
00024
00025
00026 typedef struct
00027 {
00028 void *ptr;
00029 char *title;
00030 char *location;
00031 int is_owner;
00032 int id;
00033 } bc_locktrace_t;
00034
00035 class BC_Signals
00036 {
00037 public:
00038 BC_Signals();
00039 void initialize();
00040 void initialize2();
00041
00042
00043 virtual void signal_handler(int signum);
00044
00045 #ifdef ENABLE_TRACE
00046
00047 #define TRACE(text) BC_Signals::new_trace(text);
00048 #define SET_TRACE BC_Signals::new_trace(__FILE__, __FUNCTION__, __LINE__);
00049 #define PRINT_TRACE { printf("%s: %d\n", __FILE__, __LINE__); fflush(stdout); }
00050
00051 #define UNTRACE BC_Signals::delete_traces();
00052
00053 #else
00054
00055 #define TRACE(text) ;
00056 #define UNTRACE ;
00057 #define PRINT_TRACE ;
00058
00059 #endif
00060
00061
00062 #ifdef TRACE_LOCKS
00063
00064
00065 #define SET_LOCK(ptr, title, location) int table_id = BC_Signals::set_lock(ptr, title, location);
00066
00067 #define SET_LOCK2 BC_Signals::set_lock2(table_id);
00068
00069
00070
00071 #define UNSET_LOCK2 BC_Signals::unset_lock2(table_id);
00072
00073
00074 #define UNSET_LOCK(ptr) BC_Signals::unset_lock(ptr);
00075
00076
00077 #define UNSET_ALL_LOCKS(ptr) BC_Signals::unset_all_locks(ptr);
00078
00079 #else
00080
00081 #define SET_LOCK(ptr, title, location) ;
00082 #define SET_LOCK2 ;
00083 #define SET_LOCK2_CONDITION ;
00084 #define UNSET_LOCK(ptr) ;
00085 #define UNSET_LOCK2 ;
00086 #define UNSET_ALL_LOCKS(ptr) ;
00087
00088 #endif
00089
00090
00091 #ifdef TRACE_MEMORY
00092
00093 #define ENABLE_BUFFER BC_Signals::enable_memory();
00094 #define DISABLE_BUFFER BC_Signals::disable_memory();
00095
00096 #define BUFFER(size, ptr, location) BC_Signals::set_buffer(size, ptr, location);
00097
00098 #define BUFFER2(ptr, location) BC_Signals::set_buffer(0, ptr, location);
00099
00100 #define UNBUFFER(ptr) BC_Signals::unset_buffer(ptr);
00101
00102 #else
00103
00104 #define ENABLE_BUFFER ;
00105 #define DISABLE_BUFFER ;
00106 #define BUFFER(size, ptr, location);
00107 #define UNBUFFER(ptr);
00108
00109 #endif
00110
00111
00112 #define SET_TEMP BC_Signals::set_temp
00113 #define UNSET_TEMP BC_Signals::unset_temp
00114
00115
00116 static void delete_temps();
00117 static void set_temp(char *string);
00118 static void unset_temp(char *string);
00119
00120
00121
00122
00123 static int set_lock(void *ptr, char *title, char *location);
00124 static void set_lock2(int table_id);
00125 static void set_lock2_condition(int table_id);
00126 static void unset_lock2(int table_id);
00127 static void unset_lock(void *ptr);
00128
00129 static void unset_all_locks(void *ptr);
00130
00131 static void new_trace(char *text);
00132 static void new_trace(const char *file, const char *function, int line);
00133 static void delete_traces();
00134
00135 static void enable_memory();
00136 static void disable_memory();
00137 static void set_buffer(int size, void *ptr, char* location);
00138
00139 static int unset_buffer(void *ptr);
00140
00141 static void dump_traces();
00142 static void dump_locks();
00143 static void dump_buffers();
00144
00145
00146 static char* sig_to_str(int number);
00147
00148 static BC_Signals *global_signals;
00149 };
00150
00151
00152 #endif