修复日志处理,优化磁盘io,优化退出流程
This commit is contained in:
@ -11,18 +11,22 @@
|
||||
|
||||
int in_log(logs *log,log_manager *self)
|
||||
{
|
||||
if(log == NULL||self == NULL)
|
||||
return -1;
|
||||
log->log[MAX_LOG_LENGTH-1] = '\0';
|
||||
sem_wait(&self->log_sem);//加锁
|
||||
logs *buf = self->rear;
|
||||
if(self->log == NULL){
|
||||
self->log = log;
|
||||
self->rear = log;
|
||||
self->count++;
|
||||
sem_post(&self->log_sem);
|
||||
return 0;
|
||||
return self->count;
|
||||
}
|
||||
if(self->count == 1)
|
||||
self->log->next = log;
|
||||
self->count++;
|
||||
buf->next = log;
|
||||
log->next = NULL;
|
||||
self->rear->next = log;
|
||||
self->rear = log;
|
||||
sem_post(&self->log_sem);
|
||||
return self->count;
|
||||
@ -30,15 +34,19 @@ int in_log(logs *log,log_manager *self)
|
||||
|
||||
logs *out_log(log_manager *self)
|
||||
{
|
||||
if(self == NULL)
|
||||
return NULL;
|
||||
sem_wait(&self->log_sem);
|
||||
logs *buf = self->log;
|
||||
if(self->log==NULL)
|
||||
if(buf==NULL)
|
||||
{
|
||||
sem_post(&self->log_sem);
|
||||
return NULL;
|
||||
}
|
||||
if(self->log->next ==NULL)
|
||||
self->log = self->rear = NULL;
|
||||
else
|
||||
self->log = self->log->next;
|
||||
self->count--;
|
||||
sem_post(&self->log_sem);
|
||||
buf->next =NULL;
|
||||
@ -90,28 +98,105 @@ int cleanup(log_manager *self)
|
||||
|
||||
sem_post(&self->log_sem);
|
||||
//释放信号量
|
||||
int fd = open("log.txt",O_CREAT | O_WRONLY | O_APPEND, 0777);
|
||||
|
||||
char *logbuf;
|
||||
void *logbufbk;
|
||||
char failback[MAX_LOG_LENGTH];
|
||||
logbuf = (char*)malloc(1);
|
||||
logbuf[0] = '\0';
|
||||
size_t buf_length,buf_lengthbk = 0;
|
||||
while(loc->next !=NULL)
|
||||
{
|
||||
tobeclean = loc;
|
||||
loc = loc->next;
|
||||
if(fd == -1)
|
||||
perror("file:");
|
||||
write(fd,tobeclean->log,strlen(tobeclean->log));
|
||||
if(logbuf != failback){
|
||||
logbufbk = logbuf;
|
||||
logbuf = (char*)realloc(logbuf,strlen(logbuf)+strlen(tobeclean->log)+1);//为日志分配新的内存
|
||||
}
|
||||
if(logbuf == NULL){
|
||||
free(logbufbk);
|
||||
logbuf = failback;//降级策略,堆空间不足时,使用预分配栈空间,保留最后一条日志
|
||||
}
|
||||
if(logbuf != failback){
|
||||
buf_lengthbk = buf_length;
|
||||
buf_length = strlen(logbuf)+strlen(tobeclean->log);
|
||||
strcpy(logbuf+buf_lengthbk,tobeclean->log);
|
||||
}
|
||||
else
|
||||
{
|
||||
buf_length = MAX_LOG_LENGTH;
|
||||
}
|
||||
free(tobeclean);
|
||||
}
|
||||
close(fd);
|
||||
int fd = open("log.txt",O_CREAT | O_WRONLY | O_APPEND, 0644);
|
||||
if(fd == -1){
|
||||
perror("file:");
|
||||
free(loc);
|
||||
if(logbuf != failback)
|
||||
free(logbuf);
|
||||
return -1;
|
||||
}
|
||||
if(logbuf != failback){
|
||||
logbufbk = logbuf;
|
||||
logbuf = (char*)realloc(logbuf,strlen(logbuf)+strlen(loc->log)+2);
|
||||
if(logbuf == NULL)
|
||||
{
|
||||
free(logbufbk);
|
||||
logbuf = failback;
|
||||
strcpy(logbuf,loc->log);
|
||||
buf_length = strlen(loc->log);
|
||||
|
||||
}
|
||||
else{
|
||||
buf_lengthbk = buf_length;
|
||||
buf_length = strlen(logbuf)+strlen(loc->log);
|
||||
strcpy(logbuf+buf_lengthbk,loc->log);
|
||||
}
|
||||
}
|
||||
else{
|
||||
strcpy(logbuf,loc->log);
|
||||
buf_length = strlen(logbuf);
|
||||
}
|
||||
if(logbuf == failback&&buf_length>MAX_LOG_LENGTH)
|
||||
logbuf[MAX_LOG_LENGTH-1] = '\0';
|
||||
else{
|
||||
logbuf[buf_length] = '\0';
|
||||
}
|
||||
free(loc);
|
||||
int error_buf = write(fd,logbuf,strlen(logbuf));
|
||||
if(error_buf==-1){
|
||||
close(fd);
|
||||
if(logbuf != failback)
|
||||
free(logbuf);
|
||||
return -1;
|
||||
}
|
||||
else if(error_buf<buf_length)
|
||||
write(fd,"unknown error case log write cut down\n",38);
|
||||
if(logbuf != failback)
|
||||
free(logbuf);
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void log_manager_stop(log_manager *self)
|
||||
{
|
||||
pthread_mutex_lock(&self->mtx);
|
||||
self->stop = 1; /* 置退出标志 */
|
||||
pthread_cond_broadcast(&self->cond); /* 唤醒所有等待线程 */
|
||||
if(self->stop == 1){
|
||||
pthread_mutex_unlock(&self->mtx);
|
||||
return ;
|
||||
}
|
||||
self->stop = 1;
|
||||
/* 置退出标志 */
|
||||
printf("SYS:stopping loger\n");
|
||||
pthread_mutex_unlock(&self->mtx);
|
||||
logs *log = malloc(sizeof(logs));
|
||||
strcpy(log->log,"SYS:stopping loger\n");
|
||||
self->in_log(log,self);
|
||||
log = malloc(sizeof(logs));
|
||||
strcpy(log->log,"SYS:done\n");
|
||||
printf("SYS:done\n");
|
||||
self->in_log(log,self);
|
||||
pthread_mutex_unlock(&self->mtx);
|
||||
pthread_cond_broadcast(&self->cond); /* 唤醒所有等待线程 */
|
||||
}
|
||||
|
||||
//定期清理函数
|
||||
@ -122,7 +207,7 @@ void *clear_log(void *self_p)
|
||||
{
|
||||
sleep_with_signal(self);
|
||||
sem_wait(&self->log_sem);
|
||||
if((self->count<256||self->log==NULL)&&self->stop !=1){
|
||||
if((self->count<MAX_LOG||self->log==NULL)&&self->stop !=1){
|
||||
sem_post(&self->log_sem);
|
||||
continue;
|
||||
}
|
||||
@ -141,9 +226,28 @@ int init_loger(log_manager *self)
|
||||
perror("NULL\n");
|
||||
return -1;
|
||||
}
|
||||
sem_init(&self->log_sem, 0,1);
|
||||
pthread_mutex_init(&self->mtx,NULL);
|
||||
pthread_cond_init(&self->cond,NULL);
|
||||
if(sem_init(&self->log_sem, 0,1)==-1)
|
||||
return -1;
|
||||
if(pthread_mutex_init(&self->mtx,NULL)==-1)
|
||||
{
|
||||
if(sem_destroy(&self->log_sem)==-1)
|
||||
{
|
||||
perror("log:");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if(pthread_cond_init(&self->cond,NULL)==-1)
|
||||
{
|
||||
if(sem_destroy(&self->log_sem)==-1)
|
||||
{
|
||||
perror("log:");
|
||||
}
|
||||
if(pthread_mutex_destroy(&self->mtx)==-1)
|
||||
{
|
||||
perror("log:");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
self->in_log = in_log;
|
||||
self->out_log = out_log;
|
||||
self->clear_log = clear_log;
|
||||
@ -151,4 +255,5 @@ int init_loger(log_manager *self)
|
||||
self->stop = 0;
|
||||
self->cleanup = cleanup;
|
||||
self->count = 0;
|
||||
return 0;
|
||||
}
|
||||
@ -8,12 +8,13 @@
|
||||
|
||||
typedef struct logs
|
||||
{
|
||||
char log[4096];
|
||||
char log[MAX_LOG_LENGTH];
|
||||
struct logs *next;
|
||||
}logs;
|
||||
|
||||
typedef struct log_manager
|
||||
{
|
||||
pthread_t pid;
|
||||
int (*in_log)(logs *,struct log_manager*);
|
||||
logs* (*out_log)(struct log_manager*);
|
||||
void *(*clear_log)(void*);
|
||||
|
||||
Reference in New Issue
Block a user