]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
added API and hooks to override the queue implementation
authorMoises Silva <moy@sangoma.com>
Mon, 16 Nov 2009 15:21:08 +0000 (15:21 +0000)
committerMoises Silva <moy@sangoma.com>
Mon, 16 Nov 2009 15:21:08 +0000 (15:21 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@865 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/src/include/openzap.h
libs/freetdm/src/zap_io.c
libs/freetdm/src/zap_queue.c
libs/freetdm/src/zap_threadmutex.c

index bc6b0a9dd3b939134d7ed80cf9e85282a2b99bdf..177d56178f03b9e671d99d4eddb6c81aa08fae48 100644 (file)
  * 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)
+
+/*! \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);
index a8e73295586f213ac562f7e260770351a0473b2d..c793158b031e2d24c995a7d10c8f5ad3a17465c3 100644 (file)
  * 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
index 7392c78117db6dbe06104b121a3a08f37bebf2c8..88de09351c52100a0b4ad25b9ad81725fc054bd3 100644 (file)
  * 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
index 1fb3c479f6c624aaaf13c0b575fa448dfe02fe2c..2e0d0d3395708efb51cb42da9d29f8ecaa49af07 100644 (file)
  * 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