From: Moises Silva Date: Mon, 16 Nov 2009 15:21:08 +0000 (+0000) Subject: added API and hooks to override the queue implementation X-Git-Tag: v1.0.6~38^3~117 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9750bbed52a4fa1793c1609b4c1c01540080847d;p=thirdparty%2Ffreeswitch.git 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 --- diff --git a/libs/freetdm/src/include/openzap.h b/libs/freetdm/src/include/openzap.h index bc6b0a9dd3..177d56178f 100644 --- a/libs/freetdm/src/include/openzap.h +++ b/libs/freetdm/src/include/openzap.h @@ -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 + * */ #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) + +/*! \brief Override the default queue handler */ +OZ_DECLARE(zap_status_t) zap_global_set_queue_handler(zap_queue_handler_t *handler); -/* Duplicate string */ +/*! \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); diff --git a/libs/freetdm/src/zap_io.c b/libs/freetdm/src/zap_io.c index a8e7329558..c793158b03 100644 --- a/libs/freetdm/src/zap_io.c +++ b/libs/freetdm/src/zap_io.c @@ -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 + * */ #define _GNU_SOURCE diff --git a/libs/freetdm/src/zap_queue.c b/libs/freetdm/src/zap_queue.c index 7392c78117..88de09351c 100644 --- a/libs/freetdm/src/zap_queue.c +++ b/libs/freetdm/src/zap_queue.c @@ -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 diff --git a/libs/freetdm/src/zap_threadmutex.c b/libs/freetdm/src/zap_threadmutex.c index 1fb3c479f6..2e0d0d3395 100644 --- a/libs/freetdm/src/zap_threadmutex.c +++ b/libs/freetdm/src/zap_threadmutex.c @@ -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 + * */ #ifdef WIN32