int log_mesg (int id , int n , enum type_log t , char * mesg , ...) { Log * lg = NULL ; if ((lg = malloc (sizeof(Log))) == NULL) return -1 ; LOG_ID(lg) = id ; LOG_TYPE(lg) = t ; LOG_TIME(lg) = time(NULL) ; if (n) { if ((LOG_MESG(lg) = malloc (n+1)) == NULL) { free(lg); return -1 ; } va_list ap ; va_start (ap , mesg) ; vsnprintf (LOG_MESG(lg) , n , mesg , ap); LOG_MESG(lg)[n] = '\0' ; } else { if ((LOG_MESG(lg) = strdup(mesg)) == NULL) { free(lg); return -1 ; } } sem_wait(&(LISTE_SEMAPHORE(file_logs))); liste_add(file_logs , LISTE_QUEUE(file_logs) , lg); sem_post(&(LISTE_SEMAPHORE(file_logs))); sem_post(&(sem_log)) ; return 0 ; }
int dm_dump_memory_debug(void) { unsigned long tot = 0; struct memblock *mb; char str[32]; if (_head) log_very_verbose("You have a memory leak:"); for (mb = _head; mb; mb = mb->next) { #ifdef VALGRIND_POOL /* * We can't look at the memory in case it has had * VALGRIND_MAKE_MEM_NOACCESS called on it. */ str[0] = '\0'; #else size_t c; for (c = 0; c < sizeof(str) - 1; c++) { if (c >= mb->length) str[c] = ' '; else if (((char *)mb->magic)[c] == '\0') str[c] = '\0'; else if (((char *)mb->magic)[c] < ' ') str[c] = '?'; else str[c] = ((char *)mb->magic)[c]; } str[sizeof(str) - 1] = '\0'; #endif LOG_MESG(_LOG_INFO, mb->file, mb->line, 0, "block %d at %p, size %" PRIsize_t "\t [%s]", mb->id, mb->magic, mb->length, str); tot += mb->length; } if (_head) log_very_verbose("%ld bytes leaked in total", tot); return 1; }
void * logs (void * v) { Log * lg = NULL ; Param_log * p = (Param_log *) v ; FILE * f_g = PARAM_LOG_FG(p) ; FILE * f_c = PARAM_LOG_FC(p) ; FILE * f_s = PARAM_LOG_FS(p) ; if (f_g == NULL) f_g = stdout ; if (f_c == NULL) f_c = stdout ; if (f_s == NULL) f_s = stdout ; int * res = malloc (sizeof(int)) ; *res = -1 ; while (1) { lg = NULL ; sem_wait (&(sem_log)) ; sem_wait(&LISTE_SEMAPHORE(file_logs)); liste_rm(file_logs , NULL , (void **)&lg); sem_post(&LISTE_SEMAPHORE(file_logs)); if (lg != NULL) { t = ctime(&LOG_TIME(lg)) ; t[TIME_BUF_SIZE-2] = '\0' ; fprintf(f_g , "log general %s: %d %s\n" , t , LOG_ID(lg) , LOG_MESG(lg)); switch(LOG_TYPE(lg)) { case LOG_CONNEXION : fprintf(f_c , "log connexion %s: %d %s\n" , t , LOG_ID(lg) , LOG_MESG(lg)); break ; case LOG_STAT : fprintf(f_s , "log stat %s: %d %s\n" , t , LOG_ID(lg) , LOG_MESG(lg)); break ; case LOG_GENERAL : break ; case LOG_DECONNEXION : fclose(f_g); fclose(f_c); fclose(f_s); goto end ; } destroy_log((void *) lg); } } end : *res = 0 ; free(p); pthread_exit(res) ; }
void destroy_log (void * l) { Log * lg = (Log *) l ; free(LOG_MESG(lg)); free(lg); }