Files
chat_rebot-connect-with-one…/c/tools/log/log.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;
}