34 lines
538 B
C
34 lines
538 B
C
|
#include <stdlib.h>
|
||
|
#include "libc.h"
|
||
|
#include "lock.h"
|
||
|
#include "fork_impl.h"
|
||
|
|
||
|
#define COUNT 32
|
||
|
|
||
|
static void (*funcs[COUNT])(void);
|
||
|
static int count;
|
||
|
static volatile int lock[1];
|
||
|
volatile int *const __at_quick_exit_lockptr = lock;
|
||
|
|
||
|
void __funcs_on_quick_exit()
|
||
|
{
|
||
|
void (*func)(void);
|
||
|
LOCK(lock);
|
||
|
while (count > 0) {
|
||
|
func = funcs[--count];
|
||
|
UNLOCK(lock);
|
||
|
func();
|
||
|
LOCK(lock);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int at_quick_exit(void (*func)(void))
|
||
|
{
|
||
|
int r = 0;
|
||
|
LOCK(lock);
|
||
|
if (count == 32) r = -1;
|
||
|
else funcs[count++] = func;
|
||
|
UNLOCK(lock);
|
||
|
return r;
|
||
|
}
|