61 lines
1.6 KiB
C
61 lines
1.6 KiB
C
/*
|
|
* 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 */
|