The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
struct _message_queue;
typedef struct _message_queue message_queue;

typedef struct {
	void (*enqueue)(pTHX_ message_queue* queue, const message* message, perl_mutex* lock);
	const message* (*dequeue)(pTHX_ message_queue* queue, perl_mutex* lock);
	const message* (*dequeue_nb)(pTHX_ message_queue* queue, perl_mutex* lock);
	void (*destroy)(pTHX_ message_queue*);
} message_queue_vtable;

struct _message_queue {
	const message_queue_vtable* table;
};

message_queue* S_queue_simple_alloc(pTHX);
#define queue_simple_alloc() S_queue_simple_alloc(aTHX)
#define queue_enqueue(queue, message, lock) ((queue)->table->enqueue)(aTHX_ queue, message, lock)
#define queue_dequeue(queue, lock) ((queue)->table->dequeue)(aTHX_ queue, lock)
#define queue_dequeue_nb(queue, lock) ((queue)->table->dequeue_nb)(aTHX_ queue, lock)
#define queue_destroy(queue) ((queue)->table->destroy)(aTHX_ queue)