summaryrefslogtreecommitdiffstats
path: root/sysif.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-05-18 06:37:37 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-05-18 06:37:37 -0700
commit8a3c85c8028efe135c2eef7c5db204ae30c60ba2 (patch)
tree4223d626529937701574c828541a1d808dc9d311 /sysif.c
parent97fce155c0b92429b9deabfca31e35dbb5fe0d8f (diff)
downloadtxr-8a3c85c8028efe135c2eef7c5db204ae30c60ba2.tar.gz
txr-8a3c85c8028efe135c2eef7c5db204ae30c60ba2.tar.bz2
txr-8a3c85c8028efe135c2eef7c5db204ae30c60ba2.zip
New functions: at-exit-call and at-exit-do-not-call.
* sysif.c (at_exit_list): New static variable. (at_exit_call, at_exit_do_not_call): New functions. (at_exit_handler): New static function. (sysif_init): GC-protect at_exit_list. Register at_exit_handler with C atexit function. Register intrinsic functions at-exit-call and at-exit-do-not-call. * sysif.h (at_exit_call, at_exit_do_not_call): Registered. * txr.1: Documented.
Diffstat (limited to 'sysif.c')
-rw-r--r--sysif.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/sysif.c b/sysif.c
index 141b2908..78327b0c 100644
--- a/sysif.c
+++ b/sysif.c
@@ -98,6 +98,8 @@ val passwd_s, gecos_s, dir_s, shell_s;
val group_s, mem_s;
#endif
+static val at_exit_list;
+
static val errno_wrap(val newval)
{
val oldval = num(errno);
@@ -130,6 +132,27 @@ static val exit_wrap(val status)
return nil;
}
+val at_exit_call(val func)
+{
+ push(func, &at_exit_list);
+ return func;
+}
+
+val at_exit_do_not_call(val func)
+{
+ val old = at_exit_list;
+ at_exit_list = remq(func, old);
+ return tnil(old == at_exit_list);
+}
+
+static void at_exit_handler(void)
+{
+ val iter;
+
+ for (iter = at_exit_list; iter; iter = cdr(iter))
+ funcall(car(iter));
+}
+
static val abort_wrap(void)
{
abort();
@@ -1389,6 +1412,10 @@ static val fnmatch_wrap(val pattern, val string, val flags)
void sysif_init(void)
{
+ prot1(&at_exit_list);
+
+ atexit(at_exit_handler);
+
stat_s = intern(lit("stat"), user_package);
dev_k = intern(lit("dev"), keyword_package);
ino_k = intern(lit("ino"), keyword_package);
@@ -1444,6 +1471,8 @@ void sysif_init(void)
reg_fun(intern(lit("errno"), user_package), func_n1o(errno_wrap, 0));
reg_fun(intern(lit("exit"), user_package), func_n1(exit_wrap));
+ reg_fun(intern(lit("at-exit-call"), user_package), func_n1(at_exit_call));
+ reg_fun(intern(lit("at-exit-do-not-call"), user_package), func_n1(at_exit_do_not_call));
reg_fun(intern(lit("abort"), user_package), func_n0(abort_wrap));
reg_fun(intern(lit("usleep"), user_package), func_n1(usleep_wrap));
#if HAVE_UNISTD_H