base: simplification of the IPC code

This commit replaces the stateful 'Ipc_client' type with the plain
function 'ipc_call' that takes all the needed state as arguments.
The stateful 'Ipc_server' class is retained but it moved from the public
API to the internal ipc_server.h header. The kernel-specific
implementations were cleaned up and simplified. E.g., the 'wait'
function does no longer exist. The badge and exception code are no
longer carried in the message buffers but are handled in kernel-specific
ways.

Issue #610
Issue #1832
This commit is contained in:
Norman Feske
2016-03-15 20:01:59 +01:00
committed by Christian Helmuth
parent 47878bd3e1
commit cda07b7da0
33 changed files with 1106 additions and 1115 deletions

View File

@ -14,8 +14,12 @@
#ifndef _INCLUDE__BASE__IPC_MSGBUF_H_
#define _INCLUDE__BASE__IPC_MSGBUF_H_
#include <base/stdint.h>
namespace Genode {
class Ipc_marshaller;
/**
* IPC message buffer layout
*/
@ -27,22 +31,28 @@ namespace Genode {
protected:
friend class Ipc_marshaller;
/*
* Capabilities (file descriptors) to be transferred
*/
int _caps[MAX_CAPS_PER_MSG];
Genode::size_t _used_caps;
Genode::size_t _read_cap_index;
Genode::size_t _used_caps = 0;
Genode::size_t _read_cap_index = 0;
/**
* Maximum size of plain-data message payload
*/
Genode::size_t _size;
Genode::size_t const _capacity;
/**
* Actual size of plain-data message payload
*/
Genode::size_t _used_size;
Genode::size_t _data_size = 0;
Msgbuf_base(size_t capacity) : _capacity(capacity) { }
struct Headroom { long space[4]; } _headroom;
char _msg_start[]; /* symbol marks start of message buffer data */
@ -52,19 +62,26 @@ namespace Genode {
public:
char buf[];
Msgbuf_base() { reset_caps(); }
template <typename T>
T &header()
{
static_assert(sizeof(T) <= sizeof(Headroom),
"Header size exceeds message headroom");
return *reinterpret_cast<T *>(_msg_start - sizeof(T));
}
/**
* Return size of message buffer
*/
inline Genode::size_t size() const { return _size; };
Genode::size_t capacity() const { return _capacity; };
/**
* Return pointer of message data payload
*/
inline void *data() { return &_msg_start[0]; };
void *data() { return &_msg_start[0]; };
void const *data() const { return &_msg_start[0]; };
size_t data_size() const { return _data_size; }
void reset_caps() { _used_caps = 0; _read_cap_index = 0; }
@ -104,7 +121,7 @@ namespace Genode {
char buf[BUF_SIZE];
Msgbuf() { _size = BUF_SIZE; }
Msgbuf() : Msgbuf_base(BUF_SIZE) { }
};
}