Subversion Repositories HelenOS-historic

Rev

Rev 1086 | Rev 1090 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1086 Rev 1088
Line 35... Line 35...
35
 
35
 
36
/** Maximum active async calls per thread */
36
/** Maximum active async calls per thread */
37
#define IPC_MAX_ASYNC_CALLS  4
37
#define IPC_MAX_ASYNC_CALLS  4
38
 
38
 
39
/* Flags for calls */
39
/* Flags for calls */
40
#define IPC_CALL_ANSWERED     (1<<0) /**< This is answer to a call */
40
#define IPC_CALL_ANSWERED       (1<<0) /**< This is answer to a call */
41
#define IPC_CALL_STATIC_ALLOC (1<<1) /**< This call will not be freed on error */
41
#define IPC_CALL_STATIC_ALLOC   (1<<1) /**< This call will not be freed on error */
42
#define IPC_CALL_DISPATCHED   (1<<2) /**< Call is in dispatch queue */
42
#define IPC_CALL_DISPATCHED     (1<<2) /**< Call is in dispatch queue */
43
#define IPC_CALL_DISCARD_ANSWER (1<<3) /**< Answer will not be passed to
43
#define IPC_CALL_DISCARD_ANSWER (1<<3) /**< Answer will not be passed to
44
                    * userspace, will be discarded */
44
                    * userspace, will be discarded */
-
 
45
#define IPC_CALL_FORWARDED      (1<<4) /* Call was forwarded */
45
 
46
 
46
/* Flags for ipc_wait_for_call */
47
/* Flags for ipc_wait_for_call */
47
#define IPC_WAIT_NONBLOCKING   1
48
#define IPC_WAIT_NONBLOCKING   1
48
 
49
 
49
/* Flags of callid (the addresses are aligned at least to 4,
50
/* Flags of callid (the addresses are aligned at least to 4,
Line 153... Line 154...
153
    link_t dispatched_calls; /* Should be hash table in the future */
154
    link_t dispatched_calls; /* Should be hash table in the future */
154
 
155
 
155
    link_t answers;          /**< Answered calls */
156
    link_t answers;          /**< Answered calls */
156
};
157
};
157
 
158
 
-
 
159
typedef enum {
-
 
160
    IPC_BUSY_FREE = 0,
-
 
161
    IPC_BUSY_CONNECTING,
-
 
162
    IPC_BUSY_CONNECTED
-
 
163
} ipc_busy_t;
-
 
164
 
158
struct phone_s {
165
struct phone_s {
159
    SPINLOCK_DECLARE(lock);
166
    SPINLOCK_DECLARE(lock);
160
    link_t list;
167
    link_t list;
161
    answerbox_t *callee;
168
    answerbox_t *callee;
162
    int busy;
169
    ipc_busy_t busy;
163
    atomic_t active_calls;
170
    atomic_t active_calls;
164
};
171
};
165
 
172
 
166
typedef struct {
173
typedef struct {
167
    link_t list;
174
    link_t list;
Line 179... Line 186...
179
}call_t;
186
}call_t;
180
 
187
 
181
extern void ipc_init(void);
188
extern void ipc_init(void);
182
extern call_t * ipc_wait_for_call(answerbox_t *box, int flags);
189
extern call_t * ipc_wait_for_call(answerbox_t *box, int flags);
183
extern void ipc_answer(answerbox_t *box, call_t *request);
190
extern void ipc_answer(answerbox_t *box, call_t *request);
184
extern void ipc_call(phone_t *phone, call_t *request);
191
extern int ipc_call(phone_t *phone, call_t *call);
185
extern void ipc_call_sync(phone_t *phone, call_t *request);
192
extern void ipc_call_sync(phone_t *phone, call_t *request);
186
extern void ipc_phone_init(phone_t *phone);
193
extern void ipc_phone_init(phone_t *phone);
187
extern void ipc_phone_connect(phone_t *phone, answerbox_t *box);
194
extern void ipc_phone_connect(phone_t *phone, answerbox_t *box);
188
extern void ipc_call_free(call_t *call);
195
extern void ipc_call_free(call_t *call);
189
extern call_t * ipc_call_alloc(void);
196
extern call_t * ipc_call_alloc(void);
190
extern void ipc_answerbox_init(answerbox_t *box);
197
extern void ipc_answerbox_init(answerbox_t *box);
191
extern void ipc_call_static_init(call_t *call);
198
extern void ipc_call_static_init(call_t *call);
192
extern void task_print_list(void);
199
extern void task_print_list(void);
193
extern void ipc_forward(call_t *call, phone_t *newphone, answerbox_t *oldbox);
200
extern int ipc_forward(call_t *call, phone_t *newphone, answerbox_t *oldbox);
194
 
201
 
195
extern answerbox_t *ipc_phone_0;
202
extern answerbox_t *ipc_phone_0;
196
extern void ipc_cleanup(task_t *task);
203
extern void ipc_cleanup(task_t *task);
197
extern int ipc_phone_hangup(phone_t *phone);
204
extern int ipc_phone_hangup(phone_t *phone);
198
 
205