Changeset ad7a6c9 in mainline for uspace/lib/c/generic/libc.c
- Timestamp:
- 2011-03-30T13:10:24Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4ae90f9
- Parents:
- 6e50466 (diff), d6b81941 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/libc.c
r6e50466 rad7a6c9 42 42 43 43 #include <libc.h> 44 #include <stdio.h> 45 #include <unistd.h> 46 #include <malloc.h> 44 #include <stdlib.h> 47 45 #include <tls.h> 48 #include <thread.h>49 46 #include <fibril.h> 50 #include <ipc/ipc.h> 51 #include <async.h> 52 #include <async_rel.h> 53 #include <as.h> 47 #include <task.h> 54 48 #include <loader/pcb.h> 49 #include "private/libc.h" 50 #include "private/async.h" 51 #include "private/async_sess.h" 52 #include "private/malloc.h" 53 #include "private/io.h" 55 54 56 extern int main(int argc, char *argv[]); 57 58 void _exit(int status) 59 { 60 thread_exit(status); 61 } 55 static bool env_setup = false; 62 56 63 57 void __main(void *pcb_ptr) 64 58 { 65 59 /* Initialize user task run-time environment */ 66 __ heap_init();60 __malloc_init(); 67 61 __async_init(); 68 (void) async_rel_init(); 62 __async_sess_init(); 63 69 64 fibril_t *fibril = fibril_setup(); 65 if (fibril == NULL) 66 abort(); 67 70 68 __tcb_set(fibril->tcb); 71 69 … … 73 71 __pcb = (pcb_t *) pcb_ptr; 74 72 73 /* The basic run-time environment is setup */ 74 env_setup = true; 75 75 76 int argc; 76 77 char **argv; 77 78 78 /* Get command line arguments and initialize 79 standard input and output */ 79 /* 80 * Get command line arguments and initialize 81 * standard input and output 82 */ 80 83 if (__pcb == NULL) { 81 84 argc = 0; … … 89 92 } 90 93 91 /* Run main() and set task return value 92 according the result */ 93 (void) task_retval(main(argc, argv)); 94 /* 95 * Run main() and set task return value 96 * according the result 97 */ 98 int retval = main(argc, argv); 99 exit(retval); 94 100 } 95 101 96 void __exit(void)102 void exit(int status) 97 103 { 98 __stdio_done(); 99 fibril_teardown(__tcb_get()->fibril_data); 100 _exit(0); 104 if (env_setup) { 105 __stdio_done(); 106 task_retval(status); 107 fibril_teardown(__tcb_get()->fibril_data); 108 } 109 110 __SYSCALL1(SYS_TASK_EXIT, false); 111 112 /* Unreachable */ 113 while (1); 114 } 115 116 void abort(void) 117 { 118 __SYSCALL1(SYS_TASK_EXIT, true); 119 120 /* Unreachable */ 121 while (1); 101 122 } 102 123
Note:
See TracChangeset
for help on using the changeset viewer.