Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/libc.c

    r47b7006 r4791e3c  
    4141 */
    4242
     43#include <libc.h>
    4344#include <stdio.h>
    4445#include <unistd.h>
    45 #include <stdlib.h>
    4646#include <malloc.h>
    4747#include <tls.h>
     48#include <thread.h>
    4849#include <fibril.h>
    49 #include <task.h>
     50#include <ipc/ipc.h>
     51#include <async.h>
     52#include <as.h>
    5053#include <loader/pcb.h>
    51 #include "private/libc.h"
    52 #include "private/async.h"
    53 #include "private/async_sess.h"
    54 #include "private/malloc.h"
    55 #include "private/io.h"
    5654
    57 static bool env_setup = false;
     55extern int main(int argc, char *argv[]);
     56
     57void _exit(int status)
     58{
     59        thread_exit(status);
     60}
    5861
    5962void __main(void *pcb_ptr)
    6063{
    6164        /* Initialize user task run-time environment */
    62         __malloc_init();
     65        __heap_init();
    6366        __async_init();
    64         __async_sess_init();
    65        
    6667        fibril_t *fibril = fibril_setup();
    67         if (fibril == NULL)
    68                 abort();
    69        
    7068        __tcb_set(fibril->tcb);
    7169       
     
    7371        __pcb = (pcb_t *) pcb_ptr;
    7472       
    75         /* The basic run-time environment is setup */
    76         env_setup = true;
    77        
    7873        int argc;
    7974        char **argv;
    8075       
    81         /*
    82          * Get command line arguments and initialize
    83          * standard input and output
    84          */
     76        /* Get command line arguments and initialize
     77           standard input and output */
    8578        if (__pcb == NULL) {
    8679                argc = 0;
     
    9487        }
    9588       
    96         /*
    97          * Run main() and set task return value
    98          * according the result
    99          */
    100         int retval = main(argc, argv);
    101         exit(retval);
     89        /* Run main() and set task return value
     90           according the result */
     91        (void) task_retval(main(argc, argv));
    10292}
    10393
    104 void exit(int status)
     94void __exit(void)
    10595{
    106         if (env_setup) {
    107                 __stdio_done();
    108                 task_retval(status);
    109                 fibril_teardown(__tcb_get()->fibril_data);
    110         }
    111        
    112         __SYSCALL1(SYS_TASK_EXIT, false);
    113        
    114         /* Unreachable */
    115         while (1);
    116 }
    117 
    118 void abort(void)
    119 {
    120         __SYSCALL1(SYS_TASK_EXIT, true);
    121        
    122         /* Unreachable */
    123         while (1);
     96        __stdio_done();
     97        fibril_teardown(__tcb_get()->fibril_data);
     98        _exit(0);
    12499}
    125100
Note: See TracChangeset for help on using the changeset viewer.