Ignore:
File:
1 edited

Legend:

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

    r8a1fb09 rdf908b3  
    4242
    4343#include <libc.h>
    44 #include <stdlib.h>
     44#include <stdio.h>
     45#include <unistd.h>
     46#include <malloc.h>
    4547#include <tls.h>
     48#include <thread.h>
    4649#include <fibril.h>
    47 #include <task.h>
     50#include <ipc/ipc.h>
     51#include <async.h>
     52#include <async_rel.h>
     53#include <as.h>
    4854#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"
    5455
    55 #ifdef CONFIG_RTLD
    56 #include <rtld/rtld.h>
    57 #endif
     56extern int main(int argc, char *argv[]);
    5857
    59 static bool env_setup = false;
     58void _exit(int status)
     59{
     60        thread_exit(status);
     61}
    6062
    6163void __main(void *pcb_ptr)
    6264{
    6365        /* Initialize user task run-time environment */
    64         __malloc_init();
     66        __heap_init();
    6567        __async_init();
    66         __async_sess_init();
    67        
     68        (void) async_rel_init();
    6869        fibril_t *fibril = fibril_setup();
    69         if (fibril == NULL)
    70                 abort();
    71        
    7270        __tcb_set(fibril->tcb);
    7371       
     
    7573        __pcb = (pcb_t *) pcb_ptr;
    7674       
    77         /* The basic run-time environment is setup */
    78         env_setup = true;
    79        
    8075        int argc;
    8176        char **argv;
    8277       
    83 #ifdef __IN_SHARED_LIBC__
    84         if (__pcb != NULL && __pcb->rtld_runtime != NULL) {
    85                 runtime_env = (runtime_env_t *) __pcb->rtld_runtime;
    86         }
    87 #endif
    88         /*
    89          * Get command line arguments and initialize
    90          * standard input and output
    91          */
     78        /* Get command line arguments and initialize
     79           standard input and output */
    9280        if (__pcb == NULL) {
    9381                argc = 0;
     
    10189        }
    10290       
    103         /*
    104          * Run main() and set task return value
    105          * according the result
    106          */
    107         int retval = main(argc, argv);
    108         exit(retval);
     91        /* Run main() and set task return value
     92           according the result */
     93        (void) task_retval(main(argc, argv));
    10994}
    11095
    111 void exit(int status)
     96void __exit(void)
    11297{
    113         if (env_setup) {
    114                 __stdio_done();
    115                 task_retval(status);
    116                 fibril_teardown(__tcb_get()->fibril_data);
    117         }
    118        
    119         __SYSCALL1(SYS_TASK_EXIT, false);
    120        
    121         /* Unreachable */
    122         while (1);
    123 }
    124 
    125 void abort(void)
    126 {
    127         __SYSCALL1(SYS_TASK_EXIT, true);
    128        
    129         /* Unreachable */
    130         while (1);
     98        __stdio_done();
     99        fibril_teardown(__tcb_get()->fibril_data);
     100        _exit(0);
    131101}
    132102
Note: See TracChangeset for help on using the changeset viewer.