/trunk/kernel/generic/include/proc/task.h |
---|
36,6 → 36,7 |
#define KERN_TASK_H_ |
#include <cpu.h> |
#include <ipc/ipc.h> |
#include <synch/spinlock.h> |
#include <synch/mutex.h> |
#include <synch/rwlock.h> |
51,47 → 52,8 |
#include <mm/tlb.h> |
#include <proc/scheduler.h> |
#define IPC_MAX_PHONES 16 |
struct answerbox; |
struct task; |
struct thread; |
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; |
/** Task structure. */ |
typedef struct task { |
/** Task lock. |
/trunk/kernel/generic/include/ipc/ipc.h |
---|
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 |
*/ |