be0fe1725727fcae092c072574751f16ae49fca5
[akaros.git] / user / parlib / src / parlibmain.c
1 // Called from entry.S to get us going.
2
3 #include <parlib.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <debug.h>
7 #include <hart.h>
8
9 // call static destructors.
10 void parlib_dtors()
11 {
12         typedef void (*dtor)(void);
13         extern dtor __DTOR_LIST__[], __DTOR_END__[];
14
15         // make sure only one thread actually runs the dtors
16         static size_t already_done = 0;
17         if(hart_swap(&already_done,1) == 1)
18                 return;
19
20         for(int i = 0; i < __DTOR_END__ - __DTOR_LIST__; i++)
21                 __DTOR_LIST__[i]();
22 }
23
24 // call static constructors.
25 void parlib_ctors()
26 {
27         typedef void (*ctor)(void);
28         extern ctor __CTOR_LIST__[],__CTOR_END__[];
29
30         for(int i = -1; i >= __CTOR_LIST__-__CTOR_END__; i--)
31                 __CTOR_END__[i]();
32 }
33
34 void parlibmain()
35 {
36         // call static destructors
37         parlib_ctors();
38
39         // call static destructors on exit
40         atexit(&parlib_dtors);
41
42         // call user main routine
43         extern int main(int argc, char * NTS * COUNT(argc) NT argv);
44         int r = main(procinfo.argc, procinfo.argv);
45
46         // exit gracefully
47         exit(r);
48 }