| /* Copyright (c) 2011, The Linux Foundation. All rights reserved. | 
 |  * | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions are | 
 |  * met: | 
 |  *     * Redistributions of source code must retain the above copyright | 
 |  *       notice, this list of conditions and the following disclaimer. | 
 |  *     * Redistributions in binary form must reproduce the above | 
 |  *       copyright notice, this list of conditions and the following | 
 |  *       disclaimer in the documentation and/or other materials provided | 
 |  *       with the distribution. | 
 |  *     * Neither the name of The Linux Foundation nor the names of its | 
 |  *       contributors may be used to endorse or promote products derived | 
 |  *       from this software without specific prior written permission. | 
 |  * | 
 |  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED | 
 |  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | 
 |  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT | 
 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS | 
 |  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
 |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
 |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | 
 |  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 
 |  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | 
 |  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | 
 |  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
 |  */ | 
 |  | 
 | #ifndef __MSG_Q_H__ | 
 | #define __MSG_Q_H__ | 
 |  | 
 | #ifdef __cplusplus | 
 | extern "C" { | 
 | #endif /* __cplusplus */ | 
 |  | 
 | #include <stdlib.h> | 
 |  | 
 | /** Linked List Return Codes */ | 
 | typedef enum | 
 | { | 
 |   eMSG_Q_SUCCESS                             = 0, | 
 |      /**< Request was successful. */ | 
 |   eMSG_Q_FAILURE_GENERAL                     = -1, | 
 |      /**< Failed because of a general failure. */ | 
 |   eMSG_Q_INVALID_PARAMETER                   = -2, | 
 |      /**< Failed because the request contained invalid parameters. */ | 
 |   eMSG_Q_INVALID_HANDLE                      = -3, | 
 |      /**< Failed because an invalid handle was specified. */ | 
 |   eMSG_Q_UNAVAILABLE_RESOURCE                = -4, | 
 |      /**< Failed because an there were not enough resources. */ | 
 |   eMSG_Q_INSUFFICIENT_BUFFER                 = -5, | 
 |      /**< Failed because an the supplied buffer was too small. */ | 
 | }msq_q_err_type; | 
 |  | 
 | /*=========================================================================== | 
 | FUNCTION    msg_q_init | 
 |  | 
 | DESCRIPTION | 
 |    Initializes internal structures for message queue. | 
 |  | 
 |    msg_q_data: pointer to an opaque Q handle to be returned; NULL if fails | 
 |  | 
 | DEPENDENCIES | 
 |    N/A | 
 |  | 
 | RETURN VALUE | 
 |    Look at error codes above. | 
 |  | 
 | SIDE EFFECTS | 
 |    N/A | 
 |  | 
 | ===========================================================================*/ | 
 | msq_q_err_type msg_q_init(void** msg_q_data); | 
 |  | 
 | /*=========================================================================== | 
 | FUNCTION    msg_q_init2 | 
 |  | 
 | DESCRIPTION | 
 |    Initializes internal structures for message queue. | 
 |  | 
 | DEPENDENCIES | 
 |    N/A | 
 |  | 
 | RETURN VALUE | 
 |    opaque handle to the Q created; NULL if create fails | 
 |  | 
 | SIDE EFFECTS | 
 |    N/A | 
 |  | 
 | ===========================================================================*/ | 
 | const void* msg_q_init2(); | 
 |  | 
 | /*=========================================================================== | 
 | FUNCTION    msg_q_destroy | 
 |  | 
 | DESCRIPTION | 
 |    Releases internal structures for message queue. | 
 |  | 
 |    msg_q_data: State of message queue to be released. | 
 |  | 
 | DEPENDENCIES | 
 |    N/A | 
 |  | 
 | RETURN VALUE | 
 |    Look at error codes above. | 
 |  | 
 | SIDE EFFECTS | 
 |    N/A | 
 |  | 
 | ===========================================================================*/ | 
 | msq_q_err_type msg_q_destroy(void** msg_q_data); | 
 |  | 
 | /*=========================================================================== | 
 | FUNCTION    msg_q_snd | 
 |  | 
 | DESCRIPTION | 
 |    Sends data to the message queue. The passed in data pointer | 
 |    is not modified or freed. Passed in msg_obj is expected to live throughout | 
 |    the use of the msg_q (i.e. data is not allocated internally) | 
 |  | 
 |    msg_q_data: Message Queue to add the element to. | 
 |    msgp:       Pointer to data to add into message queue. | 
 |    dealloc:    Function used to deallocate memory for this element. Pass NULL | 
 |                if you do not want data deallocated during a flush operation | 
 |  | 
 | DEPENDENCIES | 
 |    N/A | 
 |  | 
 | RETURN VALUE | 
 |    Look at error codes above. | 
 |  | 
 | SIDE EFFECTS | 
 |    N/A | 
 |  | 
 | ===========================================================================*/ | 
 | msq_q_err_type msg_q_snd(void* msg_q_data, void* msg_obj, void (*dealloc)(void*)); | 
 |  | 
 | /*=========================================================================== | 
 | FUNCTION    msg_q_rcv | 
 |  | 
 | DESCRIPTION | 
 |    Retrieves data from the message queue. msg_obj is the oldest message received | 
 |    and pointer is simply removed from message queue. | 
 |  | 
 |    msg_q_data: Message Queue to copy data from into msgp. | 
 |    msg_obj:    Pointer to space to copy msg_q contents to. | 
 |  | 
 | DEPENDENCIES | 
 |    N/A | 
 |  | 
 | RETURN VALUE | 
 |    Look at error codes above. | 
 |  | 
 | SIDE EFFECTS | 
 |    N/A | 
 |  | 
 | ===========================================================================*/ | 
 | msq_q_err_type msg_q_rcv(void* msg_q_data, void** msg_obj); | 
 |  | 
 | /*=========================================================================== | 
 | FUNCTION    msg_q_flush | 
 |  | 
 | DESCRIPTION | 
 |    Function removes all elements from the message queue. | 
 |  | 
 |    msg_q_data: Message Queue to remove elements from. | 
 |  | 
 | DEPENDENCIES | 
 |    N/A | 
 |  | 
 | RETURN VALUE | 
 |    Look at error codes above. | 
 |  | 
 | SIDE EFFECTS | 
 |    N/A | 
 |  | 
 | ===========================================================================*/ | 
 | msq_q_err_type msg_q_flush(void* msg_q_data); | 
 |  | 
 | /*=========================================================================== | 
 | FUNCTION    msg_q_unblock | 
 |  | 
 | DESCRIPTION | 
 |    This function will stop use of the message queue. All waiters will wake up | 
 |    and likely receive nothing from the queue resulting in a negative return | 
 |    value. The message queue can no longer be used until it is destroyed | 
 |    and initialized again after calling this function. | 
 |  | 
 |    msg_q_data: Message queue to unblock. | 
 |  | 
 | DEPENDENCIES | 
 |    N/A | 
 |  | 
 | RETURN VALUE | 
 |    Look at error codes above. | 
 |  | 
 | SIDE EFFECTS | 
 |    N/A | 
 |  | 
 | ===========================================================================*/ | 
 | msq_q_err_type msg_q_unblock(void* msg_q_data); | 
 |  | 
 | #ifdef __cplusplus | 
 | } | 
 | #endif /* __cplusplus */ | 
 |  | 
 | #endif /* __MSG_Q_H__ */ |