Index: ossp-pkg/l2/TODO RCS File: /v/ossp/cvs/ossp-pkg/l2/TODO,v rcsdiff -q -kk '-r1.32' '-r1.33' -u '/v/ossp/cvs/ossp-pkg/l2/TODO,v' 2>/dev/null --- TODO 2001/10/22 15:25:37 1.32 +++ TODO 2001/10/23 10:05:53 1.33 @@ -78,6 +78,7 @@ - signal handler chaining, save old signal handler and call it after our own - consider adding options such as PCRE_CASELESS to filter channel - implement "action" channel +- correct problem with multiple buffer channels using the timer ISSUES ------ Index: ossp-pkg/l2/l2_ch_buffer.c RCS File: /v/ossp/cvs/ossp-pkg/l2/l2_ch_buffer.c,v rcsdiff -q -kk '-r1.25' '-r1.26' -u '/v/ossp/cvs/ossp-pkg/l2/l2_ch_buffer.c,v' 2>/dev/null --- l2_ch_buffer.c 2001/10/22 16:32:29 1.25 +++ l2_ch_buffer.c 2001/10/23 10:05:53 1.26 @@ -41,7 +41,7 @@ char *buf; int bufpos; int bufsize; - int bufinterval; + long bufinterval; struct sigaction sigalrm; #ifdef HAVE_SETITIMER struct itimerval valprev; @@ -111,6 +111,9 @@ L2_PARAM_SET(pa[2], levelflush, INT, &cfg->levelflush); L2_PARAM_END(pa[3]); rv = l2_util_setparams(pa, fmt, ap); + if (cfg->bufinterval == -1L) /* -1 is reserved by L2 */ + return L2_ERR_ARG; /* set_alarm() uses it */ + if (cfg->bufsize < 0) return L2_ERR_ARG; @@ -124,7 +127,7 @@ static int set_alarm(l2_ch_buffer_t *cfg) { #ifdef HAVE_INET_SETITIMER - struct itimerval valnew; + struct itimerval valtest, valnew; /* initialize auto vars before using them */ memset(&valnew, 0, sizeof(valnew)); @@ -133,9 +136,23 @@ valnew.it_interval.tv_usec = 0; valnew.it_value.tv_sec = cfg->bufinterval; valnew.it_value.tv_usec = 0; - return setitimer(L2_BUFFER_TIMER, &valnew, &cfg->valprev); + if ((getitimer(L2_BUFFER_TIMER, &testval) == 0) && + ((testval.it_value.tv_sec | testval.it_value.tv_usec | + testval.it_interval.tv_sec | testval.it_interval.tv_usec) == 0)) + return setitimer(L2_BUFFER_TIMER, &valnew, &cfg->valprev); + else { + cfg->bufinterval = -1L; /* mark this timer as broken */ + assert(FALSE); + } #else - alarm(cfg->bufinterval); + unsigned int uiAlarmed = 0; + + uiAlarmed = alarm(cfg->bufinterval); + if (uiAlarmed) { /* check if SIGALRM is occupied */ + alarm(uiAlarmed); /* ...if so, then hack in the old value */ + cfg->bufinterval = -1L; /* ...mark this timer as broken */ + assert(FALSE); /* ...and warn the user about problems */ + } return 0; #endif } @@ -171,7 +188,7 @@ struct sigaction locact; l2_result_t rv; - if (cfg->bufinterval != 0) { + if ((cfg->bufinterval != 0) && (cfg->bufinterval != -1L)) { /* initialize auto vars before using them */ memset(&locact, 0, sizeof(locact)); @@ -184,7 +201,7 @@ if (sigaction(SIGALRM, &locact, &cfg->sigalrm) < 0) return L2_ERR_SYS; - if (set_alarm(cfg)) + if (set_alarm(cfg)) /* this is our own L2 set_alarm */ return L2_ERR_SYS; } @@ -259,7 +276,7 @@ } /* reset the flush alarm timer to synchronize the buffer */ - if (cfg->bufinterval != 0) + if ((cfg->bufinterval != 0) && (cfg->bufinterval != -1L)) if (reset_alarm(cfg)) return L2_ERR_SYS; @@ -277,7 +294,7 @@ l2_channel_t *downstream = l2_channel_downstream(ch); l2_result_t rv; - if (cfg->bufinterval != 0) { + if ((cfg->bufinterval != 0) && (cfg->bufinterval != -1L)) { #ifdef HAVE_INET_SETITIMER if (setitimer(L2_BUFFER_TIMER, &cfg->valprev, 0)) /* restore timer */ return L2_ERR_SYS;