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 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Contributors:
*
* Moises Silva <moy@sangoma.com>
*
*/ */
#ifndef OPENZAP_H #ifndef OPENZAP_H
@ -610,22 +615,39 @@ struct zap_io_interface {
struct zap_queue; struct zap_queue;
#define zap_queue_t 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 */ /*! 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 */ /*! 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 */ /*! 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 */ /*! 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 */ /*! 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(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); 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 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Contributors:
*
* Moises Silva <moy@sangoma.com>
*
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE

View File

@ -32,13 +32,9 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef ZAP_QUEUE_H
#define ZAP_QUEUE_H
#include "openzap.h" #include "openzap.h"
#undef zap_queue_t #undef zap_queue_t
#define ZAP_QUEUE_SIZE
typedef struct zap_queue { typedef struct zap_queue {
zap_mutex_t *mutex; zap_mutex_t *mutex;
zap_condition_t *condition; zap_condition_t *condition;
@ -48,7 +44,36 @@ typedef struct zap_queue {
void **elements; void **elements;
} zap_queue_t; } 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(outqueue, ZAP_FAIL, "Queue double pointer is null\n");
zap_assert(size > 0, ZAP_FAIL, "Queue size is not bigger than 0\n"); zap_assert(size > 0, ZAP_FAIL, "Queue size is not bigger than 0\n");
@ -90,7 +115,7 @@ failed:
return ZAP_FAIL; 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; zap_status_t status = ZAP_FAIL;
@ -120,7 +145,7 @@ done:
return status; 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; void *obj = NULL;
@ -143,7 +168,7 @@ done:
return obj; 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!"); 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; 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_queue_t *queue = NULL;
zap_assert(inqueue != NULL, ZAP_FAIL, "Queue is 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; return ZAP_SUCCESS;
} }
#endif
/* For Emacs: /* For Emacs:
* Local Variables: * Local Variables:
* mode:c * mode:c

View File

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