#ifndef SHM_MQ_H
#define SHM_MQ_H
#include "postmaster/bgworker.h"
#include "storage/dsm.h"
#include "storage/proc.h"
struct shm_mq;
typedef struct shm_mq shm_mq;
struct shm_mq_handle;
typedef struct shm_mq_handle shm_mq_handle;
typedef struct
{
const char *data;
Size len;
} shm_mq_iovec;
typedef enum
{
SHM_MQ_SUCCESS,
SHM_MQ_WOULD_BLOCK,
SHM_MQ_DETACHED
} shm_mq_result;
extern shm_mq *shm_mq_create(void *address, Size size);
extern void shm_mq_set_receiver(shm_mq *mq, PGPROC *);
extern void shm_mq_set_sender(shm_mq *mq, PGPROC *);
extern PGPROC *shm_mq_get_receiver(shm_mq *);
extern PGPROC *shm_mq_get_sender(shm_mq *);
extern shm_mq_handle *shm_mq_attach(shm_mq *mq, dsm_segment *seg,
BackgroundWorkerHandle *handle);
extern void shm_mq_set_handle(shm_mq_handle *, BackgroundWorkerHandle *);
extern void shm_mq_detach(shm_mq_handle *mqh);
extern shm_mq *shm_mq_get_queue(shm_mq_handle *mqh);
extern shm_mq_result shm_mq_send(shm_mq_handle *mqh,
Size nbytes, const void *data, bool nowait);
extern shm_mq_result shm_mq_sendv(shm_mq_handle *mqh,
shm_mq_iovec *iov, int iovcnt, bool nowait);
extern shm_mq_result shm_mq_receive(shm_mq_handle *mqh,
Size *nbytesp, void **datap, bool nowait);
extern shm_mq_result shm_mq_wait_for_attach(shm_mq_handle *mqh);
extern PGDLLIMPORT const Size shm_mq_minimum_size;
#endif