typedef void (GC_CALLBACK * GC_exit_func)(int /* status */);
GC_API void GC_CALL GC_set_exit_func(GC_exit_func);
+GC_API GC_exit_func GC_CALL GC_get_exit_func(void);
-typedef void (GC_CALLBACK * GC_abort_func)(char * /* msg */);
+typedef void (GC_CALLBACK * GC_abort_func)(const char * /* msg */);
GC_API void GC_CALL GC_set_abort_func(GC_abort_func);
+GC_API GC_abort_func GC_CALL GC_get_abort_func(void);
#ifdef __cplusplus
} /* end of extern "C" */
GC_API void GC_CALL GC_set_abort_func(GC_abort_func fn)
{
- abort_fn = fn;
+ GC_ASSERT(fn != 0);
+ DCL_LOCK_STATE;
+ LOCK();
+ abort_fn = fn;
+ UNLOCK();
+}
+
+GC_API GC_abort_func GC_CALL GC_get_abort_func(void)
+{
+ GC_abort_func fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = abort_fn;
+ UNLOCK();
+ return fn;
}
#if !defined(PCR) && !defined(SMALL_CONFIG)
- /* Print (or display) a message before abort. msg must not be NULL. */
+ /* Call abort callback with msg as argument, */
+ /* and then print (or display) a message before abort. */
+ /* msg must not be NULL. */
void GC_on_abort(const char *msg)
{
if (abort_fn) abort_fn(msg);
STATIC GC_exit_func exit_fn = NULL;
-void GC_exit(int status)
+GC_API_PRIV void GC_exit(int status)
{
if (exit_fn) exit_fn(status);
(void) exit(status);
GC_API void GC_CALL GC_set_exit_func(GC_exit_func fn)
{
- exit_fn = fn;
+ GC_ASSERT(fn != 0);
+ DCL_LOCK_STATE;
+ LOCK();
+ exit_fn = fn;
+ UNLOCK();
+}
+
+GC_API GC_exit_func GC_CALL GC_get_exit_func(void)
+{
+ GC_exit_func fn;
+ DCL_LOCK_STATE;
+ LOCK();
+ fn = exit_fn;
+ UNLOCK();
+ return fn;
}