| /* |
| * mbox.h |
| * |
| * Simple thread mailbox interface |
| */ |
| |
| #ifndef _MBOX_H |
| #define _MBOX_H |
| |
| #include "thread.h" |
| |
| /* |
| * If a mailbox is allocated statically (as a struct mailbox), this |
| * is the number of slots it gets. |
| */ |
| #define MAILBOX_STATIC_SIZE 512 |
| |
| struct mailbox { |
| struct semaphore prod_sem; /* Producer semaphore (empty slots) */ |
| struct semaphore cons_sem; /* Consumer semaphore (data slots) */ |
| struct semaphore head_sem; /* Head pointer semaphore */ |
| struct semaphore tail_sem; /* Tail pointer semaphore */ |
| void **wrap; /* Where pointers wrap */ |
| void **head; /* Head pointer */ |
| void **tail; /* Tail pointer */ |
| |
| void *data[MAILBOX_STATIC_SIZE]; /* Data array */ |
| }; |
| |
| /* The number of bytes for an mailbox of size s */ |
| #define MBOX_BYTES(s) (sizeof(struct mailbox) + \ |
| ((s)-MAILBOX_STATIC_SIZE)*sizeof(void *)) |
| |
| void mbox_init(struct mailbox *mbox, size_t size); |
| int mbox_post(struct mailbox *mbox, void *msg, mstime_t timeout); |
| mstime_t mbox_fetch(struct mailbox *mbox, void **msg, mstime_t timeout); |
| |
| /* |
| * This marks a mailbox object as unusable; it will remain unusable |
| * until sem_init() is called on it again. This DOES NOT clear the |
| * list of blocked processes on this mailbox! |
| * |
| * It is also possible to mark the mailbox invalid by zeroing its |
| * memory structure. |
| */ |
| static inline void mbox_set_invalid(struct mailbox *mbox) |
| { |
| if (!!mbox) |
| sem_set_invalid(&mbox->prod_sem); |
| } |
| |
| /* |
| * Ask if a mailbox object has been initialized. |
| */ |
| static inline bool mbox_is_valid(struct mailbox *mbox) |
| { |
| return ((!!mbox) && sem_is_valid(&mbox->prod_sem)); |
| } |
| |
| #endif /* _MBOX_H */ |