added API and hooks to override the queue implementation

git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@865 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
Moises Silva 2009-11-16 15:21:08 +00:00
parent 34307d8e52
commit 9750bbed52
4 changed files with 71 additions and 17 deletions

View File

@ -29,6 +29,11 @@
* 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.
*
* Contributors:
*
* Moises Silva <moy@sangoma.com>
*
*/
#ifndef OPENZAP_H
@ -610,22 +615,39 @@ struct zap_io_interface {
struct zap_queue;
#define zap_queue_t struct zap_queue
typedef zap_status_t (*zap_queue_create_func_t)(zap_queue_t **queue, zap_size_t);
typedef zap_status_t (*zap_queue_enqueue_func_t)(zap_queue_t *queue, void *obj);
typedef void *(*zap_queue_dequeue_func_t)(zap_queue_t *queue);
typedef zap_status_t (*zap_queue_wait_func_t)(zap_queue_t *queue, int ms);
typedef zap_status_t (*zap_queue_destroy_func_t)(zap_queue_t **queue);
typedef struct zap_queue_handler {
zap_queue_create_func_t create;
zap_queue_enqueue_func_t enqueue;
zap_queue_dequeue_func_t dequeue;
zap_queue_wait_func_t wait;
zap_queue_destroy_func_t destroy;
} zap_queue_handler_t;
OZ_DECLARE_DATA extern zap_queue_handler_t g_zap_queue_handler;
/*! brief create a new queue */
OZ_DECLARE(zap_status_t) zap_queue_create(zap_queue_t **queue, zap_size_t size);
#define zap_queue_create(queue, size) g_zap_queue_handler.create(queue, size)
/*! Enqueue an object */
OZ_DECLARE(zap_status_t) zap_queue_enqueue(zap_queue_t *queue, void *obj);
#define zap_queue_enqueue(queue, obj) g_zap_queue_handler.enqueue(queue, obj)
/*! dequeue an object from the queue */
OZ_DECLARE(void *) zap_queue_dequeue(zap_queue_t *queue);
#define zap_queue_dequeue(queue) g_zap_queue_handler.dequeue(queue)
/*! wait ms milliseconds for a queue to have available objects, -1 to wait forever */
OZ_DECLARE(zap_status_t) zap_queue_wait(zap_queue_t *queue, int ms);
#define zap_queue_wait(queue, ms) g_zap_queue_handler.wait(queue, ms)
/*! destroy the queue */
OZ_DECLARE(zap_status_t) zap_queue_destroy(zap_queue_t **queue);
#define zap_queue_destroy(queue) g_zap_queue_handler.destroy(queue)
/* Duplicate string */
/*! \brief Override the default queue handler */
OZ_DECLARE(zap_status_t) zap_global_set_queue_handler(zap_queue_handler_t *handler);
/*! \brief Duplicate string */
OZ_DECLARE(char *) zap_strdup(const char *str);
OZ_DECLARE(zap_size_t) zap_fsk_modulator_generate_bit(zap_fsk_modulator_t *fsk_trans, int8_t bit, int16_t *buf, zap_size_t buflen);

View File

@ -29,6 +29,11 @@
* 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.
*
* Contributors:
*
* Moises Silva <moy@sangoma.com>
*
*/
#define _GNU_SOURCE

View File

@ -32,13 +32,9 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ZAP_QUEUE_H
#define ZAP_QUEUE_H
#include "openzap.h"
#undef zap_queue_t
#define ZAP_QUEUE_SIZE
typedef struct zap_queue {
zap_mutex_t *mutex;
zap_condition_t *condition;
@ -48,7 +44,36 @@ typedef struct zap_queue {
void **elements;
} zap_queue_t;
OZ_DECLARE(zap_status_t) zap_queue_create(zap_queue_t **outqueue, zap_size_t size)
static zap_status_t zap_std_queue_create(zap_queue_t **outqueue, zap_size_t size);
static zap_status_t zap_std_queue_enqueue(zap_queue_t *queue, void *obj);
static void *zap_std_queue_dequeue(zap_queue_t *queue);
static zap_status_t zap_std_queue_wait(zap_queue_t *queue, int ms);
static zap_status_t zap_std_queue_destroy(zap_queue_t **inqueue);
OZ_DECLARE_DATA zap_queue_handler_t g_zap_queue_handler =
{
.create = zap_std_queue_create,
.enqueue = zap_std_queue_enqueue,
.dequeue = zap_std_queue_dequeue,
.wait = zap_std_queue_wait,
.destroy = zap_std_queue_destroy
};
OZ_DECLARE(zap_status_t) zap_global_set_queue_handler(zap_queue_handler_t *handler)
{
if (!handler ||
!handler->create ||
!handler->enqueue ||
!handler->dequeue ||
!handler->wait ||
!handler->destroy) {
return ZAP_FAIL;
}
memcpy(&g_zap_queue_handler, handler, sizeof(*handler));
return ZAP_SUCCESS;
}
static zap_status_t zap_std_queue_create(zap_queue_t **outqueue, zap_size_t size)
{
zap_assert(outqueue, ZAP_FAIL, "Queue double pointer is null\n");
zap_assert(size > 0, ZAP_FAIL, "Queue size is not bigger than 0\n");
@ -90,7 +115,7 @@ failed:
return ZAP_FAIL;
}
OZ_DECLARE(zap_status_t) zap_queue_enqueue(zap_queue_t *queue, void *obj)
static zap_status_t zap_std_queue_enqueue(zap_queue_t *queue, void *obj)
{
zap_status_t status = ZAP_FAIL;
@ -120,7 +145,7 @@ done:
return status;
}
OZ_DECLARE(void *) zap_queue_dequeue(zap_queue_t *queue)
static void *zap_std_queue_dequeue(zap_queue_t *queue)
{
void *obj = NULL;
@ -143,7 +168,7 @@ done:
return obj;
}
OZ_DECLARE(zap_status_t) zap_queue_wait(zap_queue_t *queue, int ms)
static zap_status_t zap_std_queue_wait(zap_queue_t *queue, int ms)
{
zap_assert(queue != NULL, ZAP_FAIL, "Queue is null!");
@ -164,7 +189,7 @@ OZ_DECLARE(zap_status_t) zap_queue_wait(zap_queue_t *queue, int ms)
return ZAP_SUCCESS;
}
OZ_DECLARE(zap_status_t) zap_queue_destroy(zap_queue_t **inqueue)
static zap_status_t zap_std_queue_destroy(zap_queue_t **inqueue)
{
zap_queue_t *queue = NULL;
zap_assert(inqueue != NULL, ZAP_FAIL, "Queue is null!");
@ -179,8 +204,6 @@ OZ_DECLARE(zap_status_t) zap_queue_destroy(zap_queue_t **inqueue)
return ZAP_SUCCESS;
}
#endif
/* For Emacs:
* Local Variables:
* mode:c

View File

@ -15,6 +15,10 @@
* constitutes an essential part of this license. No use of any covered code is authorized hereunder
* except under this disclaimer.
*
* Contributors:
*
* Moises Silva <moy@sangoma.com>
*
*/
#ifdef WIN32