[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/cwmp/netcwmp/libcwmp/src/queue.c b/ap/app/cwmp/netcwmp/libcwmp/src/queue.c
new file mode 100755
index 0000000..0317708
--- /dev/null
+++ b/ap/app/cwmp/netcwmp/libcwmp/src/queue.c
@@ -0,0 +1,155 @@
+/* Papastefanos Serafeim */
+/* Ulopoihsh sunarthsewn ouras */
+
+#include <cwmp/cwmp.h>
+#include "cwmp/queue.h"
+#include "cwmp/log.h"
+
+
+
+void queue_add(queue_t *q, void * data, int type, int priority, void * arg1, void *arg2) {
+ qnode_t *node;
+
+ node = (qnode_t *)MALLOC(sizeof(qnode_t));
+
+ if(node == NULL) {
+ cwmp_log_error("malloc null");
+ return ;
+ }
+
+ node->data = data;
+ node->arg1 = arg1;
+ node->arg2 = arg2;
+ node->datatype = type;
+ node->priority = priority;
+ node->next = NULL;
+
+ pthread_mutex_lock(&q->mutex);
+
+ q->size += 1;
+
+ if(q->first==NULL) {
+ q->first = node;
+ q->last = node;
+ } else {
+ qnode_t * first = q->first;
+ if(priority >= first->priority)
+ {
+ node->next = first->next;
+ q->first = node;
+ }
+ else
+ {
+ q->last->next = node;
+ q->last = node;
+ }
+ }
+
+ pthread_mutex_unlock(& q->mutex);
+
+}
+
+void queue_push(queue_t *q, void * data, int type) {
+ qnode_t *node;
+
+ node = (qnode_t *)MALLOC(sizeof(qnode_t));
+
+ if(node == NULL) {
+ cwmp_log_error("malloc null");
+ return ;
+ }
+
+ node->data = data;
+ node->arg1 = NULL;
+ node->arg2 = NULL;
+ node->datatype = type;
+ node->priority = QUEUE_PRIORITY_COMMON;
+ node->next = NULL;
+
+ pthread_mutex_lock(&q->mutex);
+
+ q->size += 1;
+
+ if(q->first==NULL) {
+ q->first = node;
+ q->last = node;
+ } else {
+ q->last->next = node;
+ q->last = node;
+
+ }
+
+ pthread_mutex_unlock(& q->mutex);
+
+}
+
+
+void queue_view(queue_t *q) {
+ qnode_t *p;
+ p=q->first;
+ if(p==NULL) {
+ cwmp_log_debug("queue is empty.");
+ return;
+ } else {
+ cwmp_log_debug("queue size = %d. ", q->size);
+ while(p->next!=NULL) {
+ cwmp_log_debug(" %s ", (char *)p->data);
+ p=p->next;
+ }
+ cwmp_log_debug(" %s ", (char *)p->data);
+ }
+}
+
+
+int queue_pop(queue_t *q, void ** data) {
+ if(q->first == NULL) {
+ cwmp_log_debug("queue is empty.");
+ return -1;
+ }
+ qnode_t *p;
+ int type ;
+ pthread_mutex_lock(& q->mutex);
+
+ void *c=q->first->data;
+ p=q->first;
+ type = p->datatype;
+ q->first=q->first->next;
+ if(q->first == NULL) q->last = NULL;
+ free(p);
+ q->size--;
+ pthread_mutex_unlock(& q->mutex);
+
+ *data = c;
+ return type;
+}
+
+
+queue_t *queue_create(pool_t * pool) {
+ queue_t *queue = MALLOC(sizeof(queue_t));//(queue_t *)pool_pcalloc(pool, sizeof(queue_t) );
+ if(queue == NULL) return NULL;
+ queue->first = NULL;
+ queue->last = NULL;
+ queue->size = 0;
+
+
+ pthread_mutex_init(& queue->mutex ,NULL);
+
+ return queue;
+}
+
+/* Elegxei an h oura einai adeia */
+int queue_is_empty(queue_t *q) {
+ return (q->first == NULL);
+}
+
+void queue_free(pool_t * pool, queue_t *q) {
+ pthread_mutex_lock(& q->mutex);
+ qnode_t *p = q->first;
+ while(p->next != NULL) {
+ qnode_t *r = p;
+ p=p->next;
+ free(r);
+ }
+ pthread_mutex_unlock(& q->mutex);
+ pool_pfree(pool, q);
+}