Ignore:
File:
1 edited

Legend:

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

    r32d19f7 rc1b979a  
    3737#include <fibril.h>
    3838#include <thread.h>
     39#include <stack.h>
    3940#include <tls.h>
    4041#include <malloc.h>
     42#include <abi/mm/as.h>
     43#include <as.h>
    4144#include <unistd.h>
    4245#include <stdio.h>
     
    4750#include <async.h>
    4851
    49 #ifndef FIBRIL_INITIAL_STACK_PAGES_NO
    50         #define FIBRIL_INITIAL_STACK_PAGES_NO  1
    51 #endif
    52 
    5352/**
    5453 * This futex serializes access to ready_list,
     
    6059static LIST_INITIALIZE(serialized_list);
    6160static LIST_INITIALIZE(manager_list);
     61static LIST_INITIALIZE(fibril_list);
    6262
    6363/** Number of threads that are executing a manager fibril. */
     
    9696fibril_t *fibril_setup(void)
    9797{
    98         tcb_t *tcb = __make_tls();
     98        tcb_t *tcb = tls_make();
    9999        if (!tcb)
    100100                return NULL;
     
    102102        fibril_t *fibril = malloc(sizeof(fibril_t));
    103103        if (!fibril) {
    104                 __free_tls(tcb);
     104                tls_free(tcb);
    105105                return NULL;
    106106        }
     
    117117       
    118118        fibril->waits_for = NULL;
     119        list_append(&fibril->all_link, &fibril_list);
    119120       
    120121        return fibril;
     
    123124void fibril_teardown(fibril_t *fibril)
    124125{
    125         __free_tls(fibril->tcb);
     126        list_remove(&fibril->all_link);
     127        tls_free(fibril->tcb);
    126128        free(fibril);
    127129}
     
    195197                                         * stack member filled.
    196198                                         */
    197                                         free(stack);
     199                                        as_area_destroy(stack);
    198200                                }
    199201                                fibril_teardown(srcf->clean_after_me);
     
    257259 * @param func Implementing function of the new fibril.
    258260 * @param arg Argument to pass to func.
     261 * @param stksz Stack size in bytes.
    259262 *
    260263 * @return 0 on failure or TLS of the new fibril.
    261264 *
    262265 */
    263 fid_t fibril_create(int (*func)(void *), void *arg)
     266fid_t fibril_create_generic(int (*func)(void *), void *arg, size_t stksz)
    264267{
    265268        fibril_t *fibril;
     
    269272                return 0;
    270273       
    271         fibril->stack =
    272             (char *) malloc(FIBRIL_INITIAL_STACK_PAGES_NO * getpagesize());
    273         if (!fibril->stack) {
     274        size_t stack_size = (stksz == FIBRIL_DFLT_STK_SIZE) ?
     275            stack_size_get() : stksz;
     276        fibril->stack = as_area_create((void *) -1, stack_size,
     277            AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD |
     278            AS_AREA_LATE_RESERVE);
     279        if (fibril->stack == (void *) -1) {
    274280                fibril_teardown(fibril);
    275281                return 0;
     
    281287        context_save(&fibril->ctx);
    282288        context_set(&fibril->ctx, FADDR(fibril_main), fibril->stack,
    283             FIBRIL_INITIAL_STACK_PAGES_NO * getpagesize(), fibril->tcb);
     289            stack_size, fibril->tcb);
    284290
    285291        return (fid_t) fibril;
     
    298304        fibril_t *fibril = (fibril_t *) fid;
    299305       
    300         free(fibril->stack);
     306        as_area_destroy(fibril->stack);
    301307        fibril_teardown(fibril);
    302308}
Note: See TracChangeset for help on using the changeset viewer.