diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/libc/port/atexit.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libc/port/atexit.c')
-rwxr-xr-x | sys/src/libc/port/atexit.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/sys/src/libc/port/atexit.c b/sys/src/libc/port/atexit.c new file mode 100755 index 000000000..e9cb6c297 --- /dev/null +++ b/sys/src/libc/port/atexit.c @@ -0,0 +1,60 @@ +#include <u.h> +#include <libc.h> + +#define NEXIT 33 + +typedef struct Onex Onex; +struct Onex{ + void (*f)(void); + int pid; +}; + +static Lock onexlock; +Onex onex[NEXIT]; + +int +atexit(void (*f)(void)) +{ + int i; + + lock(&onexlock); + for(i=0; i<NEXIT; i++) + if(onex[i].f == 0) { + onex[i].pid = getpid(); + onex[i].f = f; + unlock(&onexlock); + return 1; + } + unlock(&onexlock); + return 0; +} + +void +atexitdont(void (*f)(void)) +{ + int i, pid; + + pid = getpid(); + for(i=0; i<NEXIT; i++) + if(onex[i].f == f && onex[i].pid == pid) + onex[i].f = 0; +} + +#pragma profile off + +void +exits(char *s) +{ + int i, pid; + void (*f)(void); + + pid = getpid(); + for(i = NEXIT-1; i >= 0; i--) + if((f = onex[i].f) && pid == onex[i].pid) { + onex[i].f = 0; + (*f)(); + } + _exits(s); +} + +#pragma profile on |