Subversion Repositories HelenOS

Rev

Rev 2106 | Rev 2494 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2106 Rev 2471
Line 59... Line 59...
59
/** Identify connect_me_to answer */
59
/** Identify connect_me_to answer */
60
#define IPC_CALL_CONN_ME_TO (1 << 4)
60
#define IPC_CALL_CONN_ME_TO (1 << 4)
61
/** Interrupt notification */
61
/** Interrupt notification */
62
#define IPC_CALL_NOTIF      (1 << 5)
62
#define IPC_CALL_NOTIF      (1 << 5)
63
 
63
 
-
 
64
/*
-
 
65
 * Bits used in call hashes.
64
/* Flags of callid (the addresses are aligned at least to 4,
66
 * The addresses are aligned at least to 4 that is why we can use the 2 least
65
 * that is why we can use bottom 2 bits of the call address
67
 * significant bits of the call address.
66
 */
68
 */
67
/** Type of this msg is 'answer' */
69
/** Type of this call is 'answer' */
68
#define IPC_CALLID_ANSWERED 1
70
#define IPC_CALLID_ANSWERED 1
69
/** Type of this msg is 'notification' */
71
/** Type of this call is 'notification' */
70
#define IPC_CALLID_NOTIFICATION 2
72
#define IPC_CALLID_NOTIFICATION 2
71
 
73
 
72
/* Return values from IPC_ASYNC */
74
/* Return values from sys_ipc_call_async(). */
73
#define IPC_CALLRET_FATAL   -1
75
#define IPC_CALLRET_FATAL   -1
74
#define IPC_CALLRET_TEMPORARY   -2
76
#define IPC_CALLRET_TEMPORARY   -2
75
 
77
 
76
 
78
 
77
/* Macros for manipulating calling data */
79
/* Macros for manipulating calling data */
Line 201... Line 203...
201
 
203
 
202
    struct task *task;
204
    struct task *task;
203
 
205
 
204
    waitq_t wq;
206
    waitq_t wq;
205
 
207
 
206
    /** Phones connected to this answerbox */
208
    /** Phones connected to this answerbox. */
207
    link_t connected_phones;
209
    link_t connected_phones;
208
    /** Received calls */
210
    /** Received calls. */
209
    link_t calls;          
211
    link_t calls;          
210
    link_t dispatched_calls;    /* Should be hash table in the future */
212
    link_t dispatched_calls;    /* Should be hash table in the future */
211
 
213
 
212
    /** Answered calls */
214
    /** Answered calls. */
213
    link_t answers;
215
    link_t answers;
214
 
216
 
215
    SPINLOCK_DECLARE(irq_lock);
217
    SPINLOCK_DECLARE(irq_lock);
216
    /** Notifications from IRQ handlers */
218
    /** Notifications from IRQ handlers. */
217
    link_t irq_notifs;
219
    link_t irq_notifs;
218
    /** IRQs with notifications to this answerbox. */
220
    /** IRQs with notifications to this answerbox. */
219
    link_t irq_head;
221
    link_t irq_head;
220
} answerbox_t;
222
} answerbox_t;
221
 
223
 
Line 227... Line 229...
227
typedef struct {
229
typedef struct {
228
    link_t link;
230
    link_t link;
229
 
231
 
230
    int flags;
232
    int flags;
231
 
233
 
232
    /* Identification of the caller */
234
    /** Identification of the caller. */
233
    struct task *sender;
235
    struct task *sender;
234
    /* The caller box is different from sender->answerbox
236
    /** The caller box is different from sender->answerbox for synchronous
235
     * for synchronous calls
237
     *  calls. */
236
     */
-
 
237
    answerbox_t *callerbox;
238
    answerbox_t *callerbox;
238
 
239
 
239
    /** Private data to internal IPC */
240
    /** Private data to internal IPC. */
240
    unative_t priv;
241
    unative_t priv;
241
 
242
 
242
    /** Data passed from/to userspace */
243
    /** Data passed from/to userspace. */
243
    ipc_data_t data;
244
    ipc_data_t data;
244
} call_t;
245
} call_t;
245
 
246
 
246
extern void ipc_init(void);
247
extern void ipc_init(void);
247
extern call_t * ipc_wait_for_call(answerbox_t *box, uint32_t usec, int flags);
248
extern call_t * ipc_wait_for_call(answerbox_t *box, uint32_t usec, int flags);