[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);

+}