158,9 → 158,49 |
|
#ifdef KERNEL |
|
#include <proc/task.h> |
#define IPC_MAX_PHONES 16 |
|
#include <synch/waitq.h> |
|
struct answerbox; |
struct task; |
|
typedef enum { |
IPC_PHONE_FREE = 0, /**< Phone is free and can be allocated */ |
IPC_PHONE_CONNECTING, /**< Phone is connecting somewhere */ |
IPC_PHONE_CONNECTED, /**< Phone is connected */ |
IPC_PHONE_HUNGUP, /**< Phone is hung up, waiting for answers to come */ |
IPC_PHONE_SLAMMED /**< Phone was hungup from server */ |
} ipc_phone_state_t; |
|
/** Structure identifying phone (in TASK structure) */ |
typedef struct { |
SPINLOCK_DECLARE(lock); |
link_t link; |
struct answerbox *callee; |
ipc_phone_state_t state; |
atomic_t active_calls; |
} phone_t; |
|
typedef struct answerbox { |
SPINLOCK_DECLARE(lock); |
|
struct task *task; |
|
waitq_t wq; |
|
link_t connected_phones; /**< Phones connected to this answerbox */ |
link_t calls; /**< Received calls */ |
link_t dispatched_calls; /* Should be hash table in the future */ |
|
link_t answers; /**< Answered calls */ |
|
SPINLOCK_DECLARE(irq_lock); |
link_t irq_notifs; /**< Notifications from IRQ handlers */ |
link_t irq_head; /**< IRQs with notifications to this answerbox. */ |
} answerbox_t; |
|
typedef struct { |
unative_t args[IPC_CALL_LEN]; |
phone_t *phone; |
} ipc_data_t; |
171,7 → 211,7 |
int flags; |
|
/* Identification of the caller */ |
task_t *sender; |
struct task *sender; |
/* The caller box is different from sender->answerbox |
* for synchronous calls |
*/ |