73 lines
1.5 KiB
C
73 lines
1.5 KiB
C
#include "log.h"
|
|
#include <stdio.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
int in_log(logs *log,log_manager *self)
|
|
{
|
|
sem_wait(&self->log_sem);//加锁
|
|
logs *buf = self->rear;
|
|
if(self->log == NULL){
|
|
self->log = log;
|
|
self->rear = log;
|
|
return 0;
|
|
}
|
|
self->count++;
|
|
buf->next = log;
|
|
log->next = NULL;
|
|
self->rear = log;
|
|
sem_post(&self->log_sem);
|
|
return self->count;
|
|
}
|
|
|
|
logs *out_log(log_manager *self)
|
|
{
|
|
sem_wait(&self->log_sem);
|
|
logs *buf = self->log;
|
|
if(self->log->next ==NULL)
|
|
self->log = self->rear = NULL;
|
|
self->count--;
|
|
sem_post(&self->log_sem);
|
|
buf->next =NULL;
|
|
return buf;
|
|
}
|
|
|
|
//定期清理函数
|
|
void *clear_log(void *self_p)
|
|
{
|
|
log_manager *self = (log_manager*)self_p;
|
|
for(;;)
|
|
{
|
|
sleep(1000);
|
|
sem_wait(&self->log_sem);
|
|
if(self->count<256){
|
|
sem_post(&self->log_sem);
|
|
continue;
|
|
}
|
|
logs* buf = self->log;
|
|
self->log = self->rear =NULL;
|
|
sem_post(&self->log_sem);
|
|
logs* tobeclear;
|
|
while(buf->next !=NULL)
|
|
{
|
|
tobeclear = buf;
|
|
buf = buf->next;
|
|
free(tobeclear);
|
|
}
|
|
}
|
|
}
|
|
|
|
int init_loger(log_manager *self)
|
|
{
|
|
if(self == NULL)
|
|
{
|
|
perror("NULL\n");
|
|
return -1;
|
|
}
|
|
sem_init(&self->log_sem, 0,1);
|
|
self->in_log = in_log;
|
|
self->out_log = out_log;
|
|
self->clear_log = clear_log;
|
|
self->log = NULL;
|
|
} |