Re: sleep wake without runloop


Gerriet M. Denkmann
 

On 2 Dec 2017, at 06:51, Jens Alfke <jens@...> wrote:

On Nov 23, 2017, at 1:45 AM, Gerriet M. Denkmann <g@...> wrote:

Is there a way to ascertain whether a process is sleeping or awake?
If a process is doing anything, it’s awake. Asking “is my process asleep?” is kind of like asking a person “are you asleep?” :)
Let’s define sleeping = time between NSWorkspaceWillSleepNotification and NSWorkspaceDidWakeNotification (or the equivalent kIOMessageSystemWillSleep and kIOMessageSystemHasPoweredOn);
and awake = not sleeping.

Active is defined as: CPU does something, e.g. runs my app.

So whenever my app is active, it makes sense for it to ask whether it is sleeping.


There is IORegisterForSystemPower which sends seep/wake notifications but needs a runloop.
You can start a background thread and run a runloop on it.
Yes; this is what I did: make a SleepThread (subclass of NSThread) with a CFRunLoop which registers for IORegisterForSystemPower.
Now my app can ask this SleepThread whether it is sleeping or not.


The problem: between NSWorkspaceWillSleepNotification and NSWorkspaceDidWakeNotification this (as any app) will be active from time to time (every few minutes it will be active for almost a minute), which messes up the internals of chronyd.
Are you talking about Power Nap mode, where the computer can wake up periodically when it’s asleep to fetch email, etc?
Yes, this seems to be the correct term.
When the computer is active in Power Nap mode (while still sleeping according to my definition above) all apps will run for a short period - not only the ones fetching email etc.


Gerriet.

Join cocoa@apple-dev.groups.io to automatically receive all group messages.