Changeset d73d992 in mainline


Ignore:
Timestamp:
2018-06-25T20:10:06Z (6 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3679f51a
Parents:
0a0dff8
git-author:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-06-25 18:56:55)
git-committer:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-06-25 20:10:06)
Message:

Hide libc-internal details of the fibril implementation.

Location:
uspace
Files:
1 added
14 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/nic/nic.c

    r0a0dff8 rd73d992  
    3434 */
    3535
     36#include <assert.h>
    3637#include <errno.h>
    3738#include <loc.h>
  • uspace/app/taskdump/fibrildump.c

    r0a0dff8 rd73d992  
    3333 */
    3434
     35#include <adt/list.h>
     36#include <context.h>
    3537#include <errno.h>
    3638#include <fibril.h>
     
    4244#include <taskdump.h>
    4345#include <udebug.h>
     46
     47struct fibril {
     48        link_t all_link;
     49        context_t ctx;
     50        uint8_t __opaque[];
     51};
    4452
    4553static errno_t fibrildump_read_uintptr(void *, uintptr_t, uintptr_t *);
  • uspace/lib/c/generic/async/client.c

    r0a0dff8 rd73d992  
    121121#include <abi/mm/as.h>
    122122#include "../private/libc.h"
     123#include "../private/fibril.h"
    123124
    124125/** Naming service session */
  • uspace/lib/c/generic/async/server.c

    r0a0dff8 rd73d992  
    120120#include <abi/mm/as.h>
    121121#include "../private/libc.h"
     122#include "../private/fibril.h"
    122123
    123124/** Async framework global futex */
     
    18841885}
    18851886
     1887_Noreturn void async_manager(void)
     1888{
     1889        futex_down(&async_futex);
     1890        fibril_switch(FIBRIL_FROM_DEAD);
     1891        __builtin_unreachable();
     1892}
     1893
    18861894/** @}
    18871895 */
  • uspace/lib/c/generic/fibril.c

    r0a0dff8 rd73d992  
    4949#include <async.h>
    5050
     51#include "private/fibril.h"
     52
    5153#ifdef FUTEX_UPGRADABLE
    5254#include <rcu.h>
     
    7577        futex_unlock(&fibril_futex);
    7678
    77         fibril_t *fibril = __tcb_get()->fibril_data;
     79        fibril_t *fibril = fibril_self();
    7880
    7981#ifdef FUTEX_UPGRADABLE
     
    98100                return NULL;
    99101
    100         fibril_t *fibril = malloc(sizeof(fibril_t));
     102        fibril_t *fibril = calloc(1, sizeof(fibril_t));
    101103        if (!fibril) {
    102104                tls_free(tcb);
     
    106108        tcb->fibril_data = fibril;
    107109        fibril->tcb = tcb;
    108 
    109         fibril->func = NULL;
    110         fibril->arg = NULL;
    111         fibril->stack = NULL;
    112         fibril->clean_after_me = NULL;
    113         fibril->retval = 0;
    114         fibril->flags = 0;
    115 
    116         fibril->waits_for = NULL;
    117110
    118111        /*
     
    156149        futex_lock(&fibril_futex);
    157150
    158         fibril_t *srcf = __tcb_get()->fibril_data;
     151        fibril_t *srcf = fibril_self();
    159152        fibril_t *dstf = NULL;
    160153
     
    345338}
    346339
     340fibril_t *fibril_self(void)
     341{
     342        return __tcb_get()->fibril_data;
     343}
     344
    347345/** Return fibril id of the currently running fibril.
    348346 *
     
    352350fid_t fibril_get_id(void)
    353351{
    354         return (fid_t) __tcb_get()->fibril_data;
     352        return (fid_t) fibril_self();
     353}
     354
     355void fibril_yield(void)
     356{
     357        fibril_switch(FIBRIL_PREEMPT);
    355358}
    356359
  • uspace/lib/c/generic/fibril_synch.c

    r0a0dff8 rd73d992  
    4545#include <stdio.h>
    4646#include "private/async.h"
     47#include "private/fibril.h"
    4748
    4849static void optimize_execution_power(void)
     
    201202                wdata.fid = (fid_t) f;
    202203                wdata.wu_event.inlist = true;
    203                 f->flags &= ~FIBRIL_WRITER;
     204                f->is_writer = false;
    204205                list_append(&wdata.wu_event.link, &frw->waiters);
    205206                check_for_deadlock(&frw->oi);
     
    225226                wdata.fid = (fid_t) f;
    226227                wdata.wu_event.inlist = true;
    227                 f->flags |= FIBRIL_WRITER;
     228                f->is_writer = true;
    228229                list_append(&wdata.wu_event.link, &frw->waiters);
    229230                check_for_deadlock(&frw->oi);
     
    276277                f->waits_for = NULL;
    277278
    278                 if (f->flags & FIBRIL_WRITER) {
     279                if (f->is_writer) {
    279280                        if (frw->readers)
    280281                                break;
  • uspace/lib/c/generic/inet/host.c

    r0a0dff8 rd73d992  
    3535 */
    3636
     37#include <assert.h>
    3738#include <errno.h>
    3839#include <inet/addr.h>
  • uspace/lib/c/generic/inet/hostport.c

    r0a0dff8 rd73d992  
    3636 */
    3737
     38#include <assert.h>
    3839#include <errno.h>
    3940#include <inet/addr.h>
  • uspace/lib/c/generic/libc.c

    r0a0dff8 rd73d992  
    5555#include "private/malloc.h"
    5656#include "private/io.h"
     57#include "private/fibril.h"
    5758
    5859#ifdef FUTEX_UPGRADABLE
  • uspace/lib/c/generic/rcu.c

    r0a0dff8 rd73d992  
    8282#include <thread.h>
    8383
     84#include "private/fibril.h"
     85
    8486
    8587/** RCU sleeps for RCU_SLEEP_MS before polling an active RCU reader again. */
  • uspace/lib/c/generic/thread.c

    r0a0dff8 rd73d992  
    4646#include <as.h>
    4747#include "private/thread.h"
     48#include "private/fibril.h"
    4849
    4950#ifdef FUTEX_UPGRADABLE
  • uspace/lib/c/include/async.h

    r0a0dff8 rd73d992  
    108108typedef struct async_exch async_exch_t;
    109109
    110 #define async_manager() \
    111         do { \
    112                 futex_down(&async_futex); \
    113                 fibril_switch(FIBRIL_FROM_DEAD); \
    114         } while (0)
     110extern _Noreturn void async_manager(void);
    115111
    116112#define async_get_call(data) \
  • uspace/lib/c/include/fibril.h

    r0a0dff8 rd73d992  
    3636#define LIBC_FIBRIL_H_
    3737
    38 #include <context.h>
    3938#include <types/common.h>
    40 #include <adt/list.h>
    41 #include <libarch/tls.h>
    4239
    43 #define FIBRIL_WRITER   1
    44 
    45 struct fibril;
     40typedef struct fibril fibril_t;
    4641
    4742typedef struct {
    48         struct fibril *owned_by;
     43        fibril_t *owned_by;
    4944} fibril_owner_info_t;
    5045
    51 typedef enum {
    52         FIBRIL_PREEMPT,
    53         FIBRIL_TO_MANAGER,
    54         FIBRIL_FROM_MANAGER,
    55         FIBRIL_FROM_DEAD
    56 } fibril_switch_type_t;
    57 
    5846typedef sysarg_t fid_t;
    59 
    60 typedef struct fibril {
    61         link_t link;
    62         link_t all_link;
    63         context_t ctx;
    64         void *stack;
    65         void *arg;
    66         errno_t (*func)(void *);
    67         tcb_t *tcb;
    68 
    69         struct fibril *clean_after_me;
    70         errno_t retval;
    71         int flags;
    72 
    73         fibril_owner_info_t *waits_for;
    74 } fibril_t;
    7547
    7648/** Fibril-local variable specifier */
     
    8153extern fid_t fibril_create_generic(errno_t (*func)(void *), void *arg, size_t);
    8254extern void fibril_destroy(fid_t fid);
    83 extern fibril_t *fibril_setup(void);
    84 extern void fibril_teardown(fibril_t *f, bool locked);
    85 extern int fibril_switch(fibril_switch_type_t stype);
    8655extern void fibril_add_ready(fid_t fid);
    87 extern void fibril_add_manager(fid_t fid);
    88 extern void fibril_remove_manager(void);
    8956extern fid_t fibril_get_id(void);
     57extern void fibril_yield(void);
    9058
    9159static inline fid_t fibril_create(errno_t (*func)(void *), void *arg)
     
    9462}
    9563
    96 static inline int fibril_yield(void)
    97 {
    98         return fibril_switch(FIBRIL_PREEMPT);
    99 }
    100 
    10164#endif
    10265
  • uspace/srv/volsrv/types/part.h

    r0a0dff8 rd73d992  
    3838#define TYPES_PART_H_
    3939
     40#include <adt/list.h>
    4041#include <types/label.h>
    4142
Note: See TracChangeset for help on using the changeset viewer.