Changeset ad7a6c9 in mainline for uspace/lib/c/generic/libc.c


Ignore:
Timestamp:
2011-03-30T13:10:24Z (14 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
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.
Message:

Merge mainline changes

File:
1 edited

Legend:

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

    r6e50466 rad7a6c9  
    4242
    4343#include <libc.h>
    44 #include <stdio.h>
    45 #include <unistd.h>
    46 #include <malloc.h>
     44#include <stdlib.h>
    4745#include <tls.h>
    48 #include <thread.h>
    4946#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>
    5448#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"
    5554
    56 extern int main(int argc, char *argv[]);
    57 
    58 void _exit(int status)
    59 {
    60         thread_exit(status);
    61 }
     55static bool env_setup = false;
    6256
    6357void __main(void *pcb_ptr)
    6458{
    6559        /* Initialize user task run-time environment */
    66         __heap_init();
     60        __malloc_init();
    6761        __async_init();
    68         (void) async_rel_init();
     62        __async_sess_init();
     63       
    6964        fibril_t *fibril = fibril_setup();
     65        if (fibril == NULL)
     66                abort();
     67       
    7068        __tcb_set(fibril->tcb);
    7169       
     
    7371        __pcb = (pcb_t *) pcb_ptr;
    7472       
     73        /* The basic run-time environment is setup */
     74        env_setup = true;
     75       
    7576        int argc;
    7677        char **argv;
    7778       
    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         */
    8083        if (__pcb == NULL) {
    8184                argc = 0;
     
    8992        }
    9093       
    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);
    94100}
    95101
    96 void __exit(void)
     102void exit(int status)
    97103{
    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
     116void abort(void)
     117{
     118        __SYSCALL1(SYS_TASK_EXIT, true);
     119       
     120        /* Unreachable */
     121        while (1);
    101122}
    102123
Note: See TracChangeset for help on using the changeset viewer.