freeswitch/libs/sipcc/cpr/include/cpr_ipc.h

166 lines
6.0 KiB
C

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef _CPR_IPC_H_
#define _CPR_IPC_H_
#include "cpr_types.h"
__BEGIN_DECLS
/**
* Define handle for message queues
*/
typedef void* cprMsgQueue_t;
/*
* A timeout value of -1 means wait forever when
* attempting to get a message. Just #define something
* so the application code is easier to read.
*/
#define WAIT_FOREVER -1
#if defined SIP_OS_LINUX
#include "../linux/cpr_linux_ipc.h"
#elif defined SIP_OS_WINDOWS
#include "../win32/cpr_win_ipc.h"
#elif defined SIP_OS_OSX
#include "../darwin/cpr_darwin_ipc.h"
#endif
/* Function prototypes */
/**
* Creates a message queue
*
* @brief The cprCreateMessageQueue function is called to allow the OS to
* perform whatever work is needed to create a message queue.
* If the name is present, CPR should assign this name to the message queue to assist in
* debugging. The message queue depth is the second input parameter and is for
* setting the desired queue depth. This parameter may not be supported by all OS.
* Its primary intention is to set queue depth beyond the default queue depth
* limitation.
* On any OS where there is no limit on the message queue depth or
* its queue depth is sufficiently large then this parameter is ignored on that
* OS.
*
* @param[in] name - name of the message queue (optional)
* @param[in] depth - the message queue depth, optional field which should
* default if set to zero(0)
*
* @return Msg queue handle or NULL if init failed, errno should be provided
*
* @note the actual message queue depth will be bounded by the
* standard system message queue depth and CPR_MAX_MSG_Q_DEPTH.
* If 'depth' is outside of the bounds, the value will be
* reset automatically.
*/
cprMsgQueue_t
cprCreateMessageQueue(const char *name, uint16_t depth);
/**
* cprDestroyMessageQueue
* @brief Removes all messages from the queue and then destroy the message queue
*
* The cprDestroyMessageQueue function is called to destroy a message queue. The
* function drains any messages from the queue and the frees the
* message queue. Any messages on the queue are to be deleted, and not sent to the intended
* recipient. It is the application's responsibility to ensure that no threads are
* blocked on a message queue when it is destroyed.
*
* @param[in] msgQueue - message queue to destroy
*
* @return CPR_SUCCESS or CPR_FAILURE, errno should be provided in this case
*/
cprRC_t
cprDestroyMessageQueue(cprMsgQueue_t msgQueue);
#ifdef CPR_USE_SET_MESSAGE_QUEUE_THREAD
/**
* cprSetMessageQueueThread
* @brief Associate a thread with the message queue
*
* This method is used by pSIPCC to associate a thread and a message queue.
* @param[in] msgQueue - msg queue to set
* @param[in] thread - CPR thread to associate with queue
*
* @return CPR_SUCCESS or CPR_FAILURE
*
* @note Nothing is done to prevent overwriting the thread ID
* when the value has already been set.
*/
cprRC_t
cprSetMessageQueueThread(cprMsgQueue_t msgQueue, cprThread_t thread);
#endif
/**
* cprGetMessage
* @brief Retrieve a message from a particular message queue
*
* The cprGetMessage function retrieves the first message from the message queue
* specified and returns a void pointer to that message.
*
* @param[in] msgQueue - msg queue from which to retrieve the message. This
* is the handle returned from cprCreateMessageQueue.
* @param[in] waitForever - boolean to either wait forever (TRUE) or not
* wait at all (FALSE) if the msg queue is empty.
* @param[out] ppUserData - pointer to a pointer to user defined data. This
* will be NULL if no user data was present.
*
* @return Retrieved message buffer or NULL if failure occurred or
* the waitForever flag was set to false and no messages were
* on the queue.
*
* @note If ppUserData is defined, the value will be initialized to NULL
*/
void *
cprGetMessage(cprMsgQueue_t msgQueue,
boolean waitForever,
void** usrPtr);
/**
* cprSendMessage
* @brief Place a message on a particular queue. Note that caller may
* block (see comments below)
*
* @param[in] msgQueue - msg queue on which to place the message
* @param[in] msg - pointer to the msg to place on the queue
* @param[in] ppUserData - pointer to a pointer to user defined data
*
* @return CPR_SUCCESS or CPR_FAILURE, errno should be provided
*
* @note 1. Messages queues are set to be non-blocking, those cases
* where the system call fails with a would-block error code
* (EAGAIN) the function will attempt other mechanisms described
* below.
* @note 2. If enabled with an extended message queue, either via a
* call to cprCreateMessageQueue with depth value or a call to
* cprSetExtendMessageQueueDepth() (when unit testing), the message
* will be added to the extended message queue and the call will
* return successfully. When room becomes available on the
* system's message queue, those messages will be added.
* @note 3. If the message queue becomes full and no space is availabe
* on the extended message queue, then the function will attempt
* to resend the message up to CPR_ATTEMPTS_TO_SEND and the
* calling thread will *BLOCK* CPR_SND_TIMEOUT_WAIT_INTERVAL
* milliseconds after each failed attempt. If unsuccessful
* after all attempts then EGAIN error code is returned.
* @note 4. This applies to all CPR threads, including the timer thread.
* So it is possible that the timer thread would be forced to
* sleep which would have the effect of delaying all active
* timers. The work to fix this rare situation is not considered
* worth the effort to fix....so just leaving as is.
*/
cprRC_t
cprSendMessage(cprMsgQueue_t msgQueue,
void* msg,
void** usrPtr);
__END_DECLS
#endif