* 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
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);
* 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
* 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;
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");
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;
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;
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!");
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!");
return ZAP_SUCCESS;
}
-#endif
-
/* For Emacs:
* Local Variables:
* mode:c
* 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