6 BC_Signals* BC_Signals::global_signals = 0;
7 static int signal_done = 0;
10 static char* signal_titles[] =
30 static void signal_entry(int signum)
43 printf("signal_entry: got %s execution table:\n",
44 signal_titles[signum],
45 BC_Signals::global_signals->execution_table.total);
46 if(BC_Signals::global_signals->execution_table.total)
48 for(int i = 0; i < BC_Signals::global_signals->execution_table.total; i++)
49 printf(" %s\n", BC_Signals::global_signals->execution_table.values[i]);
53 printf("signal_entry: lock table\n",
54 BC_Signals::global_signals->lock_table.total);
55 for(int i = 0; i < BC_Signals::global_signals->lock_table.total; i++)
57 BC_LockTrace *table = BC_Signals::global_signals->lock_table.values[i];
60 BC_Signals::global_signals->lock_table.values[i]->ptr,
61 BC_Signals::global_signals->lock_table.values[i]->title,
62 BC_Signals::global_signals->lock_table.values[i]->location);
65 BC_Signals::global_signals->signal_handler(signum);
66 signal(signum, SIG_DFL);
72 BC_Signals::BC_Signals()
76 void BC_Signals::initialize()
78 BC_Signals::global_signals = this;
79 lock = new pthread_mutex_t;
80 pthread_mutex_init(lock, 0);
81 execution_table.set_array_delete();
83 signal(SIGHUP, signal_entry);
84 signal(SIGINT, signal_entry);
85 signal(SIGQUIT, signal_entry);
86 signal(SIGKILL, signal_entry);
87 signal(SIGSEGV, signal_entry);
88 signal(SIGTERM, signal_entry);
89 signal(SIGFPE, signal_entry);
93 void BC_Signals::signal_handler(int signum)
98 char* BC_Signals::sig_to_str(int number)
100 return signal_titles[number];
103 void BC_Signals::new_trace(char *text)
105 if(!global_signals) return;
106 pthread_mutex_lock(global_signals->lock);
107 global_signals->execution_table.append(text);
108 pthread_mutex_unlock(global_signals->lock);
111 void BC_Signals::delete_traces()
113 if(!global_signals) return;
114 pthread_mutex_lock(global_signals->lock);
115 global_signals->execution_table.remove_all();
116 pthread_mutex_unlock(global_signals->lock);
119 void BC_Signals::set_lock(void *ptr, char *title, char *location)
121 if(!global_signals) return;
122 pthread_mutex_lock(global_signals->lock);
123 // Take off previous unlock entry. Without this, our table explodes.
125 for(int i = 0; i < global_signals->lock_table.total; i++)
127 BC_LockTrace *table = global_signals->lock_table.values[i];
128 if(table->ptr == ptr && !table->is_lock)
130 global_signals->lock_table.remove_object_number(i);
136 // Put new lock entry
139 BC_LockTrace *table = new BC_LockTrace(ptr, title, location, 1);
140 global_signals->lock_table.append(table);
142 pthread_mutex_unlock(global_signals->lock);
145 void BC_Signals::unset_lock(void *ptr)
147 if(!global_signals) return;
148 pthread_mutex_lock(global_signals->lock);
149 // Take off previous lock entry
151 for(int i = 0; i < global_signals->lock_table.total; i++)
153 BC_LockTrace *table = global_signals->lock_table.values[i];
154 if(table->ptr == ptr && table->is_lock)
156 global_signals->lock_table.remove_object_number(i);
160 // Put new unlock entry
163 BC_LockTrace *table = new BC_LockTrace(ptr, 0, 0, 0);
164 global_signals->lock_table.append(table);
166 pthread_mutex_unlock(global_signals->lock);
169 void BC_Signals::unset_all_locks(void *ptr)
171 if(!global_signals) return;
172 pthread_mutex_lock(global_signals->lock);
173 // Take off previous lock entry
175 for(int i = 0; i < global_signals->lock_table.total; i++)
177 BC_LockTrace *table = global_signals->lock_table.values[i];
178 if(table->ptr == ptr)
180 global_signals->lock_table.remove_object_number(i);
183 pthread_mutex_unlock(global_signals->lock);
186 BC_LockTrace::BC_LockTrace(void *ptr, char *title, char *location, int is_lock)
190 this->location = location;
191 this->is_lock = is_lock;
194 BC_LockTrace::~BC_LockTrace()