1 #include "nith.main.0.h"
2 struct nitni_global_ref_list_t
*nitni_global_ref_list
;
3 void initialize_nitni_global_refs() {
4 nitni_global_ref_list
= (struct nitni_global_ref_list_t
*)nit_alloc(sizeof(struct nitni_global_ref_list_t
));
5 nitni_global_ref_list
->head
= NULL
;
6 nitni_global_ref_list
->tail
= NULL
;
9 void nitni_global_ref_add( struct nitni_ref
*ref
) {
10 if ( nitni_global_ref_list
->head
== NULL
) {
11 nitni_global_ref_list
->head
= ref
;
14 nitni_global_ref_list
->tail
->next
= ref
;
15 ref
->prev
= nitni_global_ref_list
->tail
;
17 nitni_global_ref_list
->tail
= ref
;
22 void nitni_global_ref_remove( struct nitni_ref
*ref
) {
23 if ( ref
->prev
== NULL
) {
24 nitni_global_ref_list
->head
= ref
->next
;
26 ref
->prev
->next
= ref
->next
;
29 if ( ref
->next
== NULL
) {
30 nitni_global_ref_list
->tail
= ref
->prev
;
32 ref
->next
->prev
= ref
->prev
;
36 extern void nitni_global_ref_incr( struct nitni_ref
*ref
) {
37 if ( ref
->count
== 0 ) /* not registered */
40 nitni_global_ref_add( ref
);
46 extern void nitni_global_ref_decr( struct nitni_ref
*ref
) {
47 if ( ref
->count
== 1 ) /* was last reference */
49 /* remove from list */
50 nitni_global_ref_remove( ref
);
57 #define UNW_LOCAL_ONLY
58 #include <libunwind.h>
59 #include "c_functions_hash.h"
63 void sig_handler(int signo
){
64 PRINT_ERROR("Caught signal : %s\n", strsignal(signo
));
65 show_backtrace(signo
);
67 void show_backtrace (int signo
) {
68 char* opt
= getenv("NIT_NO_STACK");
73 char* procname
= malloc(sizeof(char) * 100);
75 unw_init_local(&cursor
, &uc
);
76 PRINT_ERROR("-------------------------------------------------\n");
77 PRINT_ERROR("-- Stack Trace ------------------------------\n");
78 PRINT_ERROR("-------------------------------------------------\n");
79 while (unw_step(&cursor
) > 0) {
80 unw_get_proc_name(&cursor
, procname
, 100, &ip
);
81 const char* recv
= get_nit_name(procname
, strlen(procname
));
83 PRINT_ERROR("` %s\n", recv
);
85 PRINT_ERROR("` %s\n", procname
);
88 PRINT_ERROR("-------------------------------------------------\n");
93 int main(int argc
, char** argv
) {
95 signal(SIGABRT
, sig_handler
);
96 signal(SIGFPE
, sig_handler
);
97 signal(SIGILL
, sig_handler
);
98 signal(SIGINT
, sig_handler
);
99 signal(SIGTERM
, sig_handler
);
100 signal(SIGSEGV
, sig_handler
);
101 signal(SIGPIPE
, sig_handler
);
102 glob_argc
= argc
; glob_argv
= argv
;
103 initialize_gc_option();
104 initialize_nitni_global_refs();
105 var
= NEW_kernel__Sys(&type_kernel__Sys
);
108 ((void (*)(val
*))(var
->class->vft
[COLOR_kernel__Object__init
]))(var
) /* init on <var:Sys>*/;
111 ((void (*)(val
*))(var
->class->vft
[COLOR_kernel__Sys__run
]))(var
) /* run on <var:Sys>*/;
115 void gc_finalize (void *obj
, void *client_data
) {
116 val
* var
/* : Finalizable */;
119 ((void (*)(val
*))(var
->class->vft
[COLOR_gc__Finalizable__finalize
]))(var
) /* finalize on <var:Finalizable>*/;