source: mainline/uspace/lib/c/include/fibril.h@ 0a0dff8

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0a0dff8 was 3b1cc8d, checked in by GitHub <noreply@…>, 7 years ago

Add notification queue to the async framework. (#40)

Instead of running notification handlers in the same fibril that received it,
forcing us to allocate a new fibril when the handler blocks, we instead queue
the notifications, and allow an arbitrary but fixed number of dedicated fibrils
handle them.

Although a service can increase the number of handler fibrils to reduce latency,
there are now no dynamic allocations due to received notifications.
When the same notification is received again while the older instance is still
in queue, the new notification overwrites the old and increments a counter
of received notifications.

The counter is currently unused, because passing it to the handler would
require extensive changes to user code, but it should be straightforward
to make use of it should the need arise.

  • Property mode set to 100644
File size: 2.9 KB
Line 
1/*
2 * Copyright (c) 2006 Ondrej Palkovsky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libc
30 * @{
31 */
32/** @file
33 */
34
35#ifndef LIBC_FIBRIL_H_
36#define LIBC_FIBRIL_H_
37
38#include <context.h>
39#include <types/common.h>
40#include <adt/list.h>
41#include <libarch/tls.h>
42
43#define FIBRIL_WRITER 1
44
45struct fibril;
46
47typedef struct {
48 struct fibril *owned_by;
49} fibril_owner_info_t;
50
51typedef enum {
52 FIBRIL_PREEMPT,
53 FIBRIL_TO_MANAGER,
54 FIBRIL_FROM_MANAGER,
55 FIBRIL_FROM_DEAD
56} fibril_switch_type_t;
57
58typedef sysarg_t fid_t;
59
60typedef 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;
75
76/** Fibril-local variable specifier */
77#define fibril_local __thread
78
79#define FIBRIL_DFLT_STK_SIZE 0
80
81extern fid_t fibril_create_generic(errno_t (*func)(void *), void *arg, size_t);
82extern void fibril_destroy(fid_t fid);
83extern fibril_t *fibril_setup(void);
84extern void fibril_teardown(fibril_t *f, bool locked);
85extern int fibril_switch(fibril_switch_type_t stype);
86extern void fibril_add_ready(fid_t fid);
87extern void fibril_add_manager(fid_t fid);
88extern void fibril_remove_manager(void);
89extern fid_t fibril_get_id(void);
90
91static inline fid_t fibril_create(errno_t (*func)(void *), void *arg)
92{
93 return fibril_create_generic(func, arg, FIBRIL_DFLT_STK_SIZE);
94}
95
96static inline int fibril_yield(void)
97{
98 return fibril_switch(FIBRIL_PREEMPT);
99}
100
101#endif
102
103/** @}
104 */
Note: See TracBrowser for help on using the repository browser.