From: D. H. R. <hug...@mi...> - 2006-10-07 07:33:01
|
This post is in the spirit of David Jones' keynote at OLS this year. In particular, strace reveals funny/surprising things about programs. I was doing an strace on lircd and I happened upon a sequence that appears silly and is repeated fairly often: time(NULL) = 1160202828 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1252, ...}) = 0 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1252, ...}) = 0 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1252, ...}) = 0 writev(2, [{"lircd-0.8.1-CVS[32693]: accepted"..., 57}, {"\n", 1}], 2) = 58 send(5, "<29>Oct 7 02:33:48 lircd-0.8.1-"..., 77, MSG_NOSIGNAL) = 77 Well, I looked the wrong place (I think), but did find some code that could be improved. In daemons/irrecord.c, routine logprintf looks like this: void logprintf(int prio,char *format_str, ...) { time_t current; char *currents; va_list ap; current=time(¤t); currents=ctime(¤t); if(lf) fprintf(lf,"%15.15s %s %s: ",currents+4,hostname,progname); if(!daemonized) fprintf(stderr,"%s: ",progname); if(lf) { va_start(ap,format_str); if(prio==LOG_WARNING) fprintf(lf,"WARNING: "); vfprintf(lf,format_str,ap); fputc('\n',lf);fflush(lf); va_end(ap); } if(!daemonized) { va_start(ap,format_str); if(prio==LOG_WARNING) fprintf(stderr,"WARNING: "); vfprintf(stderr,format_str,ap); fputc('\n',stderr);fflush(stderr); va_end(ap); } } I think two transformations would improve it: - only test lf and !daemonized once - only do the time stuff if it will be used (if lf is non-null) UNTESTED! (I haven't managed to build the vanilla version, let alone a modified one.) void logprintf(int prio,char *format_str, ...) { va_list ap; if(lf) { time_t current; char *currents; current=time(¤t); currents=ctime(¤t); fprintf(lf,"%15.15s %s %s: ",currents+4,hostname,progname); va_start(ap,format_str); if(prio==LOG_WARNING) fprintf(lf,"WARNING: "); vfprintf(lf,format_str,ap); fputc('\n',lf);fflush(lf); va_end(ap); } if(!daemonized) { fprintf(stderr,"%s: ",progname); va_start(ap,format_str); if(prio==LOG_WARNING) fprintf(stderr,"WARNING: "); vfprintf(stderr,format_str,ap); fputc('\n',stderr);fflush(stderr); va_end(ap); } } Well, I've got to go to bed, so I'm not going to look for the real reason for the redundant stat64 syscalls. I hope that you found this interesting. PS: It might be that the bad guy is syslog(3) since lircd.h contains the definition: #define logprintf syslog |