#include <iostream>
#include <pthread.h>
int report_msg_queue_length;
pthread_mutex_t report_msg_queue_mutex;
struct report_msg_queue_node{
report_msg_queue_node* prev;
report_msg_queue_node* next;
char * data;
};
report_msg_queue_node * report_msg_queue_start;
report_msg_queue_node * report_msg_queue_end;
void report_msg_queue_init(){
pthread_mutex_init(&report_msg_queue_mutex,NULL);
report_msg_queue_length=0;
report_msg_queue_start=(struct report_msg_queue_node *)malloc(sizeof(struct report_msg_queue_node));
report_msg_queue_start->prev=NULL;
report_msg_queue_start->next=NULL;
report_msg_queue_end=report_msg_queue_start;
}
void report_msg_queue_push(char * msg){
pthread_mutex_lock(&report_msg_queue_mutex);
if(report_msg_queue_start->data==NULL){
report_msg_queue_start->data=msg;
pthread_mutex_unlock(&report_msg_queue_mutex);
}else{
report_msg_queue_node* report_msg_queue_temp = (struct report_msg_queue_node *)malloc(sizeof(struct report_msg_queue_node));
report_msg_queue_temp->prev=NULL;
report_msg_queue_temp->next=report_msg_queue_start;
report_msg_queue_temp->data=msg;
report_msg_queue_start->prev=report_msg_queue_temp;
report_msg_queue_start = report_msg_queue_temp;
pthread_mutex_unlock(&report_msg_queue_mutex);
}
}
char * report_msg_queue_pop(){
pthread_mutex_lock(&report_msg_queue_mutex);
if(report_msg_queue_end->data==NULL){
pthread_mutex_unlock(&report_msg_queue_mutex);
return NULL;
}else{
char * ret = report_msg_queue_end->data;
if(report_msg_queue_end->prev!=NULL){
report_msg_queue_node * temp = report_msg_queue_end;
report_msg_queue_end= report_msg_queue_end->prev;
free(temp);
}else{
report_msg_queue_end->data=NULL;
}
pthread_mutex_unlock(&report_msg_queue_mutex);
return ret;
}
}
int main() {
report_msg_queue_init();
for (int i = 0; i <100 ; ++i) {
report_msg_queue_push("1");
report_msg_queue_push("2");
report_msg_queue_push("3");
report_msg_queue_push("4");
char * ch;
while (ch = report_msg_queue_pop()){
printf("%s\n",ch);
}
}
return 0;
}