libc: move exits to its own translation unit (another good idea from 9front)
This commit is contained in:
parent
2a4b3f26d6
commit
9f8050aa4a
|
@ -139,6 +139,7 @@
|
||||||
"port/ctype.c",
|
"port/ctype.c",
|
||||||
"port/encodefmt.c",
|
"port/encodefmt.c",
|
||||||
"port/execl.c",
|
"port/execl.c",
|
||||||
|
"port/exits.c",
|
||||||
"port/exp.c",
|
"port/exp.c",
|
||||||
"port/fabs.c",
|
"port/fabs.c",
|
||||||
"port/floor.c",
|
"port/floor.c",
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include <u.h>
|
#include <u.h>
|
||||||
#include <libc.h>
|
#include <libc.h>
|
||||||
|
|
||||||
|
extern void (*_jehanne_onexit)(void);
|
||||||
|
|
||||||
#define NEXIT 33
|
#define NEXIT 33
|
||||||
|
|
||||||
typedef struct Onex Onex;
|
typedef struct Onex Onex;
|
||||||
|
@ -21,11 +23,26 @@ struct Onex{
|
||||||
static Lock onexlock;
|
static Lock onexlock;
|
||||||
Onex onex[NEXIT];
|
Onex onex[NEXIT];
|
||||||
|
|
||||||
|
static void
|
||||||
|
onexit(void)
|
||||||
|
{
|
||||||
|
int i, pid;
|
||||||
|
void (*f)(void);
|
||||||
|
|
||||||
|
pid = jehanne_getpid();
|
||||||
|
for(i = nelem(onex)-1; i >= 0; i--)
|
||||||
|
if((f = onex[i].f) != nil && onex[i].pid == pid) {
|
||||||
|
onex[i].f = nil;
|
||||||
|
(*f)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
jehanne_atexit(void (*f)(void))
|
jehanne_atexit(void (*f)(void))
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
_jehanne_onexit = onexit;
|
||||||
jehanne_lock(&onexlock);
|
jehanne_lock(&onexlock);
|
||||||
for(i=0; i<NEXIT; i++)
|
for(i=0; i<NEXIT; i++)
|
||||||
if(onex[i].f == 0) {
|
if(onex[i].f == 0) {
|
||||||
|
@ -48,25 +65,3 @@ jehanne_atexitdont(void (*f)(void))
|
||||||
if(onex[i].f == f && onex[i].pid == pid)
|
if(onex[i].f == f && onex[i].pid == pid)
|
||||||
onex[i].f = 0;
|
onex[i].f = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma profile off
|
|
||||||
|
|
||||||
void
|
|
||||||
jehanne_exits(const char *s)
|
|
||||||
{
|
|
||||||
void _fini(void);
|
|
||||||
int i, pid;
|
|
||||||
void (*f)(void);
|
|
||||||
|
|
||||||
pid = jehanne_getpid();
|
|
||||||
for(i = NEXIT-1; i >= 0; i--)
|
|
||||||
if((f = onex[i].f) && pid == onex[i].pid) {
|
|
||||||
onex[i].f = 0;
|
|
||||||
(*f)();
|
|
||||||
}
|
|
||||||
_fini();
|
|
||||||
_exits(s);
|
|
||||||
__builtin_unreachable();
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma profile on
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the UCB release of Plan 9. It is subject to the license
|
||||||
|
* terms in the LICENSE file found in the top-level directory of this
|
||||||
|
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
|
||||||
|
* part of the UCB release of Plan 9, including this file, may be copied,
|
||||||
|
* modified, propagated, or distributed except according to the terms contained
|
||||||
|
* in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
|
||||||
|
void (*_jehanne_onexit)(void);
|
||||||
|
|
||||||
|
void
|
||||||
|
jehanne_exits(const char *s)
|
||||||
|
{
|
||||||
|
void _fini(void);
|
||||||
|
|
||||||
|
if(_jehanne_onexit != nil)
|
||||||
|
(*_jehanne_onexit)();
|
||||||
|
_fini();
|
||||||
|
_exits(s);
|
||||||
|
__builtin_unreachable();
|
||||||
|
}
|
Loading…
Reference in New Issue