L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
event_buffer
1// vi:set ft=cpp: -*- Mode: C++ -*-
2/*
3 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
4 * Alexander Warg <warg@os.inf.tu-dresden.de>
5 * economic rights: Technische Universität Dresden (Germany)
6 *
7 * This file is part of TUD:OS and distributed under the terms of the
8 * GNU General Public License 2.
9 * Please see the COPYING-GPL-2 file for details.
10 *
11 * As a special exception, you may use this file as part of a free software
12 * library without restriction. Specifically, if other files instantiate
13 * templates or use macros or inline functions from this file, or you compile
14 * this file and link it with other files to produce an executable, this
15 * file does not by itself cause the resulting executable to be covered by
16 * the GNU General Public License. This exception does not however
17 * invalidate any other reasons why the executable file might be covered by
18 * the GNU General Public License.
19 */
20
21#pragma once
22
23#include <l4/re/event>
24#include <l4/re/event-sys.h>
25#include <l4/re/rm>
26
27#include <cstring>
28
29namespace L4Re { namespace Util {
30
35template< typename PAYLOAD >
36class Event_buffer_t : public L4Re::Event_buffer_t<PAYLOAD>
37{
38private:
39 void *_buf;
40public:
46 void *buf() const noexcept { return _buf; }
47
57 {
58 l4_addr_t sz = ds->size();
59 _buf = 0;
60
61 long r = rm->attach(&_buf, sz,
64 if (r < 0)
65 return r;
66
67 *static_cast<L4Re::Event_buffer_t<PAYLOAD> *>(this)
69 return 0;
70 }
71
79 long detach(L4::Cap<L4Re::Rm> rm) noexcept
80 {
82 if (_buf)
83 return rm->detach(_buf, &ds);
84 return 0;
85 }
86
87};
88
93template< typename PAYLOAD >
95{
96public:
97
104 template< typename CB, typename D >
105 void foreach_available_event(CB const &cb, D data = D())
106 {
108 while ((e = Event_buffer_t<PAYLOAD>::next()))
109 {
110 cb(e, data);
111 e->free();
112 }
113 }
114
125 template< typename CB, typename D >
127 L4::Cap<L4::Thread> thread,
128 CB const &cb, D data = D())
129 {
130
131 if (l4_error(irq->bind_thread(thread, 0)))
132 return;
133
134 while (1)
135 {
136 long r;
138 l4_utcb());
139 if (r)
140 continue;
141
142 foreach_available_event(cb, data);
143 }
144 }
145};
146
147typedef Event_buffer_t<Default_event_payload> Event_buffer;
148typedef Event_buffer_consumer_t<Default_event_payload> Event_buffer_consumer;
149
150}}
Event buffer class.
Definition event:257
An event buffer consumer.
Definition event_buffer:95
void process(L4::Cap< L4::Irq > irq, L4::Cap< L4::Thread > thread, CB const &cb, D data=D())
Continuously wait for events and process them.
Definition event_buffer:126
void foreach_available_event(CB const &cb, D data=D())
Call function on every available event.
Definition event_buffer:105
Event_buffer utility class.
Definition event_buffer:37
long detach(L4::Cap< L4Re::Rm > rm) noexcept
Detach event buffer from address space.
Definition event_buffer:79
long attach(L4::Cap< L4Re::Dataspace > ds, L4::Cap< L4Re::Rm > rm) noexcept
Attach event buffer from address space.
Definition event_buffer:56
void * buf() const noexcept
Return the buffer.
Definition event_buffer:46
l4_cap_idx_t cap() const noexcept
Return capability selector.
Definition capability.h:49
C++ interface for capabilities.
Definition capability.h:219
unsigned long l4_addr_t
Address type.
Definition l4int.h:45
long l4_error(l4_msgtag_t tag) L4_NOTHROW
Get IPC error code if any or message tag label otherwise for an IPC call.
Definition ipc.h:657
l4_umword_t l4_ipc_error(l4_msgtag_t tag, l4_utcb_t *utcb) L4_NOTHROW
Get the IPC error code for an IPC operation.
Definition ipc.h:640
l4_msgtag_t l4_irq_receive(l4_cap_idx_t irq, l4_timeout_t to) L4_NOTHROW
Unmask and wait for specified IRQ.
Definition irq.h:311
#define L4_IPC_NEVER
never timeout
Definition __timeout.h:84
l4_utcb_t * l4_utcb(void) L4_NOTHROW L4_PURE
Get the UTCB address.
Definition utcb.h:340
L4Re C++ Interfaces.
Definition l4re.dox:17
Cap< T > make_cap_rw(L4::Cap< T > cap) noexcept
Make an L4::Ipc::Cap<T> for the given capability with L4_CAP_FPAGE_RW rights.
Definition ipc_types:659
Region mapper interface.
Event structure used in buffer.
Definition event:264
void free() noexcept
Free the entry.
Definition event:271
@ RW
Readable and writable region.
Definition rm:150
@ Search_addr
Search for a suitable address range.
Definition rm:125