blob: 69f2ea71667871e152bb7e89abdabec3b2c1e6e4 [file] [log] [blame]
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#include <process.h>
#include <stdlib.h>
#define _EXIT_LOCK1 8
void __cdecl _lock (int _File);
void __cdecl _unlock (int _File);
int __cdecl _initialize_onexit_table(_onexit_table_t *table)
{
if (!table) return -1;
table->_first = table->_last = table->_end = NULL;
return 0;
}
int __cdecl _register_onexit_function(_onexit_table_t *table, _onexit_t func)
{
if (!table) return -1;
_lock(_EXIT_LOCK1);
if (!table->_first) {
table->_first = calloc(32, sizeof(void*));
if (!table->_first) {
_unlock(_EXIT_LOCK1);
return -1;
}
table->_last = table->_first;
table->_end = table->_first + 32;
}
if (table->_last == table->_end) {
size_t len = table->_end - table->_first;
_PVFV *new_buf = realloc(table->_first, len * sizeof(void*) * 2);
if (!new_buf) {
_unlock(_EXIT_LOCK1);
return -1;
}
table->_first = new_buf;
table->_last = new_buf + len;
table->_end = new_buf + len * 2;
}
*table->_last++ = (_PVFV)func;
_unlock(_EXIT_LOCK1);
return 0;
}
int __cdecl _execute_onexit_table(_onexit_table_t *table)
{
_PVFV *first, *last;
_lock(_EXIT_LOCK1);
first = table->_first;
last = table->_last;
_initialize_onexit_table(table);
_unlock(_EXIT_LOCK1);
if (!first) return 0;
while (--last >= first)
if (*last)
(**last)();
free(first);
return 0;
}
typeof(_initialize_onexit_table) *__MINGW_IMP_SYMBOL(_initialize_onexit_table) = _initialize_onexit_table;
typeof(_register_onexit_function) *__MINGW_IMP_SYMBOL(_register_onexit_function) = _register_onexit_function;
typeof(_execute_onexit_table) *__MINGW_IMP_SYMBOL(_execute_onexit_table) = _execute_onexit_table;