Hi Jesper, Thanks for the reply, and the patch! I'll have to download the src etc. so I'll try this over the weekend.
Might it be "better" to register a `t` second EVFILT_TIMER kevent with the kqueue to handle polling? All the best, Mark On Fri, 13 Oct 2017 at 11:25 Jesper Wallin <jes...@ifconfig.se> wrote: > On Thu, Oct 12, 2017 at 08:42:44PM +0000, Mark Lee Smith wrote: > > As the -t option appears to have been available in previous releases so I > > suspect this bug has existed for some time, and effects more than just > the > > new autoactions, although what it might effect I can't say. > > > > I hope that I've managed to provide enough information to confirm that a > > bug exists and gone some way to helping isolate it. > > > > All the best, > > > > Mark > > Hi Mark, > > I just realized that I've always used apmd with -t 10 and thus never had > any issue with this. I've did a bit of testing now and as far as I can > tell, apmtimeout is sometimes incorrect as the loop doesn't iterate > every second. > > The patch below uses a time() timestamp instead and compares it to the > time when last iteration occured. This may not be the best solutions > considering suspending/resuming and the clock might be off. The quick > fix for this is to simply reset the timestamp if things seems off and > the worst-case scenario is that we poll an extra time. > > > Jesper Wallin > > > Index: apmd.c > =================================================================== > RCS file: /cvs/src/usr.sbin/apmd/apmd.c,v > retrieving revision 1.80 > diff -u -p -r1.80 apmd.c > --- apmd.c 28 Aug 2017 16:16:58 -0000 1.80 > +++ apmd.c 13 Oct 2017 09:01:31 -0000 > @@ -358,7 +358,7 @@ main(int argc, char *argv[]) > int noacsleep = 0; > struct timespec ts = {TIMO, 0}, sts = {0, 0}; > struct apm_power_info pinfo; > - time_t apmtimeout = 0; > + time_t tc, tn; > const char *sockname = sockfile; > const char *errstr; > int kq, nchanges; > @@ -482,17 +482,18 @@ main(int argc, char *argv[]) > if (sysctl(ncpu_mib, 2, &ncpu, &ncpu_sz, NULL, 0) < 0) > error("cannot read hw.ncpu", NULL); > > + tc = time(NULL); > for (;;) { > int rv; > > sts = ts; > + tn = time(NULL); > > - apmtimeout += 1; > if ((rv = kevent(kq, NULL, 0, ev, 1, &sts)) < 0) > break; > > - if (apmtimeout >= ts.tv_sec) { > - apmtimeout = 0; > + if (tn-tc >= ts.tv_sec || tn < tc) { > + tc = time(NULL); > > /* wakeup for timeout: take status */ > powerbak = power_status(ctl_fd, 0, &pinfo); >