summaryrefslogtreecommitdiff
path: root/src/Runtime/global_destructor_chain.c
blob: 7c24b76a2a3fbb76a498c4a5ca1a6ab56da907be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "NMWException.h"



DestructorChain* __global_destructor_chain;

extern void* __register_global_object(void* object, void* destructor, void* regmem) {
  ((DestructorChain*)regmem)->next = __global_destructor_chain;
  ((DestructorChain*)regmem)->destructor = destructor;
  ((DestructorChain*)regmem)->object = object;
  __global_destructor_chain = (DestructorChain*)regmem;

  return object;
}

void __destroy_global_chain(void) {
  DestructorChain* iter;

  while ((iter=__global_destructor_chain) !=  0) {
    __global_destructor_chain = iter->next;
    DTORCALL_COMPLETE(iter->destructor, iter->object);
  } 
}

__declspec(section
           ".dtors") static void* const __destroy_global_chain_reference = __destroy_global_chain;