Ignore:
File:
1 edited

Legend:

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

    r4791e3c r47b7006  
    4141 */
    4242
    43 #include <libc.h>
    4443#include <stdio.h>
    4544#include <unistd.h>
     45#include <stdlib.h>
    4646#include <malloc.h>
    4747#include <tls.h>
    48 #include <thread.h>
    4948#include <fibril.h>
    50 #include <ipc/ipc.h>
    51 #include <async.h>
    52 #include <as.h>
     49#include <task.h>
    5350#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"
    5456
    55 extern int main(int argc, char *argv[]);
    56 
    57 void _exit(int status)
    58 {
    59         thread_exit(status);
    60 }
     57static bool env_setup = false;
    6158
    6259void __main(void *pcb_ptr)
    6360{
    6461        /* Initialize user task run-time environment */
    65         __heap_init();
     62        __malloc_init();
    6663        __async_init();
     64        __async_sess_init();
     65       
    6766        fibril_t *fibril = fibril_setup();
     67        if (fibril == NULL)
     68                abort();
     69       
    6870        __tcb_set(fibril->tcb);
    6971       
     
    7173        __pcb = (pcb_t *) pcb_ptr;
    7274       
     75        /* The basic run-time environment is setup */
     76        env_setup = true;
     77       
    7378        int argc;
    7479        char **argv;
    7580       
    76         /* Get command line arguments and initialize
    77            standard input and output */
     81        /*
     82         * Get command line arguments and initialize
     83         * standard input and output
     84         */
    7885        if (__pcb == NULL) {
    7986                argc = 0;
     
    8794        }
    8895       
    89         /* Run main() and set task return value
    90            according the result */
    91         (void) task_retval(main(argc, argv));
     96        /*
     97         * Run main() and set task return value
     98         * according the result
     99         */
     100        int retval = main(argc, argv);
     101        exit(retval);
    92102}
    93103
    94 void __exit(void)
     104void exit(int status)
    95105{
    96         __stdio_done();
    97         fibril_teardown(__tcb_get()->fibril_data);
    98         _exit(0);
     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
     118void abort(void)
     119{
     120        __SYSCALL1(SYS_TASK_EXIT, true);
     121       
     122        /* Unreachable */
     123        while (1);
    99124}
    100125
Note: See TracChangeset for help on using the changeset viewer.