源文件
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
queue* create_queue() {
queue* q = (queue*)malloc(sizeof(queue));
q->size = 0;
q->front = NULL; q->back = NULL;
return q;
}
int empty_queue(queue* q) {
return q->size == 0;
}
void push_queue(queue* q, shuncom_item_t* value) {
queue_node* qn = (queue_node*)malloc(sizeof(queue_node));
qn->value = value;
qn->next = NULL;
if (empty_queue(q)) {
q->back = q->front = qn;
}
else {
q->back->next = qn, q->back = qn;
}
q->size++;
}
shuncom_item_t* pop_queue(queue* q) {
if (empty_queue(q)) {
return 0;
}
shuncom_item_t* value = q->front->value;
queue_node* qn = q->front;
q->front = q->front->next;
free(qn);
q->size--;
return value;
}
头文件
#ifndef __QUEUE_H__
#define __QUEUE_H__
struct shuncom_item {
int fd;
char* json_buf;
};
typedef struct shuncom_item shuncom_item_t;
struct queue_node {
shuncom_item_t* value;
struct queue_node* next;
};
typedef struct queue_node queue_node;
struct queue {
queue_node* front;
queue_node* back;
int size;
};
typedef struct queue queue;
queue* create_queue();
int empty_queue(queue* q);
void push_queue(queue* q, shuncom_item_t* item);
shuncom_item_t* pop_queue(queue* q);
#endif
与锁一起使用
pthread_mutex_t mutex;
queue* tasks_queues;
void send_buffer_to_task(char* buffer, int len, int fd)
{
shuncom_item_t* item;
item = (shuncom_item_t*)malloc(sizeof(shuncom_item_t));
item->fd = fd;
item->json_buf = (char*)malloc(len + 1);
if (!item->json_buf)
{
logger_fatal("no memory");
free(item);
return;
}
strcpy(item->json_buf, buffer);
pthread_mutex_lock(&mutex);
push_queue(tasks_queues, item);
pthread_mutex_unlock(&mutex);
logger_debug("\nunlock___________len=%d\n",len);
}
void* process_taskusb0(void* arg) {
my_adt* adt0 = (my_adt*)arg;
while (1)
{
pthread_mutex_lock(&mutex);
shuncom_item_t* item = pop_queue(tasks_queues);
pthread_mutex_unlock(&mutex);
if (item == NULL) {
logger_pthread("%s \n",adt0->logger);
usleep(1000*1000);
continue;
}
int time_start= get_time();
ble0_flush_status = STATE_FLUSHING;
int state=flush_pic(adt0->uart,item->json_buf);
ble0_flush_status = STATE_IDLE;
int time_end= get_time();
logger_info("\n>>>>>>>>uartfdusb0 use time =%d<<<<<<<<<< \n ",time_end-time_start );
if (item->json_buf) free(item->json_buf);
if (item) free(item);
}
return 0;
}