diff options
Diffstat (limited to 'common/compat.c')
| -rw-r--r-- | common/compat.c | 51 | 
1 files changed, 51 insertions, 0 deletions
| diff --git a/common/compat.c b/common/compat.c index 9d2f53f..0c6c833 100644 --- a/common/compat.c +++ b/common/compat.c @@ -179,3 +179,54 @@ strlcat(char* dst, const char* src, size_t siz)  }  #endif /* HAVE_STRLCAT */ + +#ifndef HAVE_ATEXITV + +typedef void (*voidfunc)(void*); +typedef struct _exit_stack +{ +    voidfunc func; +    void* data; + +    /* We have a list of these beauties */ +    struct _exit_stack* next; +} +exit_stack; + +/* Our exit stack */ +static exit_stack* atexits = NULL; +static int atexit_registered = 0; + +static void +atexit_do_stack(void) +{ +    exit_stack* next; +    for(; atexits; atexits = next) +    { +        next = atexits->next; +        (atexits->func)(atexits->data); +        free(atexits); +    } +} + +void +atexitv(voidfunc func, void* data) +{ +    exit_stack* ae; + +    ASSERT(func); + +    ae = (exit_stack*)calloc(1, sizeof(exit_stack)); +    if(ae) +    { +        ae->func = func; +        ae->data = data; +        ae->next = atexits; +        atexits = ae; + +        if(!atexit_registered) +            atexit(atexit_do_stack); +    } +} + +#endif /* HAVE_ATEXITV */ | 
