Index: ossp-pkg/l2/l2_env.c RCS File: /v/ossp/cvs/ossp-pkg/l2/l2_env.c,v rcsdiff -q -kk '-r1.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/l2/l2_env.c,v' 2>/dev/null --- l2_env.c 2001/11/07 11:37:18 1.3 +++ l2_env.c 2001/11/16 19:45:12 1.4 @@ -49,6 +49,7 @@ env->szError[0] = '\0'; env->levelmask = L2_LEVEL_ALL; env->flushmask = L2_LEVEL_NONE; + env->interval = 0; for (i = 0; i < L2_MAX_FORMATTERS; i++) env->formatters[i].cb = NULL; for (i = 0; i < L2_MAX_HANDLERS; i++) @@ -212,3 +213,65 @@ return env->szError; } +/* sets the virtual timer to the interval value in env */ +static int set_alarm(l2_env_t *env) +{ +#if defined(HAVE_SETITIMER) && defined(HAVE_SYS_TIME_H) + struct itimerval valtest, valnew; + + /* initialize auto vars before using them */ + memset(&valnew, 0, sizeof(valnew)); + + valnew.it_interval.tv_sec = (long)env->interval; + valnew.it_interval.tv_usec = 0L; /* no microsecond granularity */ + valnew.it_value.tv_sec = (long)env->interval; + valnew.it_value.tv_usec = 0L; /* no microsecond granularity */ + if ((getitimer(L2_BUFFER_TIMER, &valtest) == 0) && + ((valtest.it_value.tv_sec | valtest.it_value.tv_usec | + valtest.it_interval.tv_sec | valtest.it_interval.tv_usec) == 0L)) + return (setitimer(L2_BUFFER_TIMER, &valnew, 0) ? L2_ERR_INT : L2_OK); + else { + env->interval = L2_BROKEN_TIMER; /* mark this timer as broken */ + assert(FALSE); /* throw the switch right away when debugging */ + return L2_ERR_ARG; + } +#else + unsigned int uiAlarmed = 0; + + assert(env->interval >= 0); /* guard against a broken timer */ + assert(!(uiAlarmed = alarm((unsigned int)iInterval))); + if (uiAlarmed) { /* check if SIGALRM is occupied */ + alarm(uiAlarmed); /* ...if so, then hack in the old value */ + env->interval = L2_BROKEN_TIMER; /* ...mark this timer as broken */ + return L2_ERR_INT; + } + else + return L2_OK; +#endif +} + +/* l2_env_settimer will change or disappear with */ +/* the arrival of the multiplexed L2 timer object */ +/* set the L2 timer */ +l2_result_t l2_env_settimer(l2_env_t *env, int iInterval) +{ + if ((env == NULL) || (iInterval < 0)) /* argument sanity check */ + return L2_ERR_ARG; + + /* short circuit if setting again with identical interval value */ + if (env->interval == iInterval) + return L2_OK; + + /* one value only, no multiplexed timer support */ + if (env->interval != 0) /* && (env->interval != iInterval) */ + return L2_ERR_ARG; + + env->interval = iInterval; + if (set_alarm(env) != L2_OK) { + env->interval = L2_BROKEN_TIMER; /* L2 timer is broken */ + return L2_ERR_INT; + } + else + return L2_OK; +} +