[HN Gopher] How to programmatically find out if computer is on
       ___________________________________________________________________
        
       How to programmatically find out if computer is on
        
       Author : marcodiego
       Score  : 183 points
       Date   : 2021-11-20 18:53 UTC (4 hours ago)
        
 (HTM) web link (www.haiku-os.org)
 (TXT) w3m dump (www.haiku-os.org)
        
       | syngrog66 wrote:
       | write a function whose sig is like "boolean isOn()". call it. if
       | it returns true, the computer is on. if it returns false, the
       | computer is also on. done. ship it!
       | 
       | add a // TODO in v2: handle case if it never returns, or the
       | process crashes, or caller times out waiting
        
       | AnimalMuppet wrote:
       | I was working on an embedded system. I told the hardware guy that
       | the CPU clock input wasn't running. He said, "Any reasonably
       | intelligent software should have detected that condition and
       | handled it." I replied, "Seems to me the software acted
       | appropriately for the conditions."
        
         | h2odragon wrote:
         | I tried inverting the clock and running a one way hash and my
         | CPU vanished...
        
       | a-dub wrote:
       | woah! i had no idea beos lived on in an oss project!
        
         | sneeeeeed wrote:
         | It works great on my Thinkpad. I run it on the metal.
        
           | capableweb wrote:
           | Interesting, but I think parent was asking how to run it on
           | silicon.
        
             | a-dub wrote:
             | now i'm confused.
        
               | capableweb wrote:
               | "On metal" would refer to running the OS without any
               | additional layers like virtualization, in this context.
               | 
               | But it could also refer to the material "metal" (or the
               | collection name for bunch of materials really), whereas
               | computers are commonly known for being made with a lot of
               | silicon instead of metal.
               | 
               | Hopefully I didn't dissect too much of the frog to kill
               | it.
        
       | IndexCardBox wrote:
       | I like how it also has support for the ENIAC platform. I kicked
       | my family out of the house so I had room to install the ENIAC.
       | Happy to hear there's an OS I can run on it to get real work
       | done, like posting unfunny jokes for strangers on Hacker News.
        
         | wk_end wrote:
         | It upsets me that this function's interface allows it to
         | describe silly things like "an ENIAC running on a 68000" or "an
         | Apple II running on SPARC". Wouldn't be an issue if C++
         | supported GADTs.
        
       | lifthrasiir wrote:
       | While it is clearly a joke, it has a legitimate use as a syscall
       | that does nothing so can be used to test the syscall process
       | itself [1]. (Its cousin `is_computer_on_fire` is not a syscall.)
       | 
       | [1]
       | https://github.com/haiku/haiku/commit/ccaac177f64038c160de6f...
        
         | jrumbut wrote:
         | I was thinking the same thing, although in reverse:
         | 
         | Imagine putting a few of these in as a joke and then you take
         | it out and your parallelized code doesn't work anymore.
         | 
         | Not sure how all that's handled on Haiku specifically.
        
           | marcodiego wrote:
           | https://xkcd.com/1172/
        
         | tialaramex wrote:
         | Sure.
         | 
         | Of course, one important trick here is that no matter how fast
         | your system call is, _not_ making a system call is just faster.
         | io_uring is an example, as are futexes. So it 's worth spending
         | more effort on figuring out tricks to avoid doing the system
         | call than exploiting tricks to shave a cycle or two off the
         | time taken to execute one.
        
           | spicybright wrote:
           | Completely depends on your use case. If you're checking if
           | sys calls work, you'd only need to run one first and see if
           | it succeeds. Then you can be reasonably sure you have access
           | to the rest.
           | 
           | And different programs have different speed requirements.
        
       | DonHopkins wrote:
       | Asynchronous JavaScript browser DOM callback API:
       | <html           onon="alert('Computer turned on!')"
       | onoff="alert('Computer turned off!')"         >
        
         | kjhughes wrote:
         | Asynchronous is definitely the way to go. I once tried
         | synchronous code. Had to move it to a service worker so as to
         | not bog down the UI, and you don't even want to know what
         | service workers do when the computer is off. Let's just say
         | it's undocumented.
        
       | FartyMcFarter wrote:
       | Presumably there's a non-joke version of this at some level in
       | the hardware / firmware stack?
        
         | rezonant wrote:
         | https://docs.microsoft.com/en-us/windows/win32/power/system-...
        
           | kreeben wrote:
           | I read "Soft Off" as "sort of" and though, well, that's
           | probably the best answer one can get in certain situations.
        
       | kazinator wrote:
       | // power cycle computer             bool was_on =
       | set_computer_on(true); // returns prior value             if
       | (was_on) {          set_computer_on(false);
       | set_computer_on(true);        } else {          // was previously
       | off, is now on: nothing to do!        }
        
       | rock_artist wrote:
       | is_computer_on_fire() seems more usable...
        
         | makepanic wrote:
         | weird how it's returning a constant
         | https://github.com/haiku/haiku/blob/8f16317a5b6db5c672f33181...
         | 
         | Interesting it seems to come from BeOS:
         | 
         | https://github.com/haiku/haiku/commit/bcf475ec65f1060c0a8abf...
         | 
         | where the same function had a hn thread about it already a
         | couple years ago :D
         | 
         | https://news.ycombinator.com/item?id=8780606
        
           | salawat wrote:
           | Not 451. I'm disappointed at the missed opportunity.
        
           | lucb1e wrote:
           | I can find various results where that number is negative
           | (Faltings height of LMFDB elliptic curve 1688.c1; north east
           | longitude of el Baix Segura) but not where the number is
           | positive. It's part of a DOI string though, but that's not
           | really a number.
           | 
           | Probably I'm being nerd sniped. https://xkcd.com/356/
        
         | speed_spread wrote:
         | Doc doesn't specify the unit of measure used. Also would be
         | nice to know if fire was caused by computer itself or from an
         | external cause.
        
       | sharmin123 wrote:
       | Avoid Hacking Threats: Hacking Risk You Face With Gadgets:
       | https://www.hackerslist.co/avoid-hacking-threats-hacking-ris...
        
       | BurningFrog wrote:
       | Descartes for the digital age:
       | 
       | "I compute, therefore I am on"
        
       | DeathArrow wrote:
       | In Soviet Russia the computer checks you to see if you are on.
        
       | thoughtsimple wrote:
       | Where is the function is_halting() ?
        
         | yjftsjthsd-h wrote:
         | Right? Especially since the implementation is so simple, and
         | even runs in O(1) time:) https://xkcd.com/1266/
        
       | aequitas wrote:
       | Reminds me of 'onstat' in Brendan Gregg's special tools:
       | https://www.brendangregg.com/specials.html
        
       | marcodiego wrote:
       | Although many people are laughing, I believe the function works
       | ok. The only complicated part is to find a way to call it when
       | the computer is not on.
        
       | YXNjaGVyZWdlbgo wrote:
       | I know it's not as common anymore but if the computer is in a
       | "hold and catch fire" incident it won't report temperature sensor
       | readings. What happens? Is it considered off?
        
       | mare5x wrote:
       | Similar situation: a process queries the operating system (CPU
       | scheduler) to find out if the process is currently being executed
       | on the CPU.
        
       | 13of40 wrote:
       | Odd they have a TI 99/4a platform but no TMS990 CPU.
        
       | [deleted]
        
       | atkailash wrote:
       | I love it when this sort of just fun random thing is thrown into
       | code.
        
       | dottrap wrote:
       | Since the not-on result is 'undefined', a devilish implementer
       | could return 1 for the off case, just to screw with people.
       | 
       | (How could this work in theory? Maybe the computer has a separate
       | watchdog controller board which allows the computer to be turned
       | on and off remotely, and that controller acts as a proxy for the
       | API request.)
        
         | rezonant wrote:
         | Only if the watchdog also has a CPU that can run programs when
         | the "real" CPU is off. But then we'd need a is_watchdog_on() to
         | know if that one is powered on, in the case where the wall plug
         | has been pulled.
        
       | h2odragon wrote:
       | > If the computer isn't on, the value returned by this function
       | is undefined.
       | 
       | Shouldn't it just block until the computer turns back on?
       | Probably interferes with pthreads.
        
         | eminence32 wrote:
         | Hmm, it seems like you need to make sure the computer is on
         | before calling this function, or else you run the risk of
         | getting back undefined data. Seems like we also need a function
         | that can be used to tell if the computer is on...
        
           | salawat wrote:
           | Nah. Just bump that responsibility to the caller, and power
           | supply manufacturer. Have the caller call power_on_computer()
           | first always. This will ensure you always get defined state!
           | 
           | ...What do you mean not every power supply manufacturer
           | implements the power_on_computer() function as a NOOP if the
           | computer is already on?!
        
             | h2odragon wrote:
             | Some implement it that way, some it returns and error
             | message or throws an NMI; then ya got the cheap clones that
             | use it to frob a toggle without regard to the state it was
             | in (which there's no way to read)... Then ya got the weird
             | ones (HP) where it only works right if you call it twice
             | with a 40ms delay between while streaming a sample from
             | "Swan Lake" over their NDA'd 1wire thingy.
        
           | ancode wrote:
           | There's a syscall to check whether the computer is on so just
           | call that before this and you'll be fine
        
             | Someone wrote:
             | That introduces a time-of-check to time-of-use bug
             | (https://en.wikipedia.org/wiki/Time-of-check_to_time-of-
             | use).
        
         | jcwayne wrote:
         | Seems like a reasonable compiler would inline the most likely
         | implementation as 1. So, while technically undefined, it's safe
         | to assume that it will 'return' 1 regardless of the actual
         | on/off state of the computer.
        
           | yholio wrote:
           | {return 1;} is clearly a faulty implementation, it's entirely
           | possible that the computer is already turned off by the time
           | the function is executed using power stored in the decoupling
           | capacitors of the CPU.
        
             | azundo wrote:
             | Since the behavior is undefined when the computer is off
             | this implementation seems correct in your hypothetical as
             | well.
        
           | jeremyjh wrote:
           | I agree on the implementation, but I'm pretty sure if the
           | computer is off you aren't getting a 1.
        
           | josefx wrote:
           | I would be unreasonable. The power state appears to me as
           | highly asynchronous to program execution. I see no explicit
           | guarantees on how the state is retrieved or synchronized,
           | without synchronization the state wont be properly updated.
           | We know that the computer was of at some point, so it starts
           | of as undefined. Given undefined as starting state and the
           | lack of update guarantee we can assume that it will always
           | return an undefined value. This opens up a lot more
           | optimization possibilities than assuming a 1.
        
       | rcakebread wrote:
       | I was expecting this to be about using IPMI on a BMC to see if
       | the motherboard is powered on.
        
       | slmjkdbtl wrote:
       | I'm curious if there's any significance in number 0.63739 in this
       | implementation                   double
       | is_computer_on_fire(void)         {             return 0.63739;
       | }
       | 
       | https://github.com/haiku/haiku/blob/8f16317a5b6db5c672f33181...
        
       | largbae wrote:
       | This reminds me of
       | http://www.hasthelargehadroncolliderdestroyedtheworldyet.com...
        
       | Waterluvian wrote:
       | I'd like to see the unit tests for the non-true return state.
        
         | chizhik-pyzhik wrote:
         | I think that would have to be an integration test
        
         | 1_player wrote:
         | Result is undefined if computer isn't on, so any value is OK,
         | no tests necessary.
        
         | 13of40 wrote:
         | It's actually pretty straightforward:
         | 
         | turn_computer_off();
         | 
         | Assert(!is_computer_on(), "Computer should have been off but
         | it's on.");
         | 
         | The opposite is a bit tricky, though.
        
           | [deleted]
        
           | ancode wrote:
           | This assert doesn't work like you think it does. If the
           | computer is off is_computer_on is undefined, so if this is
           | called when the computer is already off it could return a
           | nonzero value, thus resolving to true even though the
           | computer is already off.
        
       | zoomablemind wrote:
       | > is_computer_on()
       | 
       | How does this relate to computer being in Halt state, which is
       | quite valid state for servers (there could be even a dedicated
       | Halt button)? Technically computer hardware is ON. I remember
       | that in such state it shows a "carrot" prompt (>>>) from the SRE
       | console.
       | 
       | By the way, there is also HCF instruction (Halt and Catch Fire).
       | 
       | https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(computing...
        
         | spicybright wrote:
         | Wouldn't a CPU halt state mean no code is running?
        
           | wereHamster wrote:
           | a computer has multiple CPUs. One may be halted while another
           | still running.
        
             | sgtnoodle wrote:
             | If the function call doesn't allow you to specify a CPU
             | core, then it seems like it would be testing either the
             | logical or'ing of all core's powered-on state, or the state
             | of the current core.
             | 
             | In order for the code to execute anywhere, at least one
             | core must be powered on and not halted. Also, I would
             | consider a halted CPU to still be powered on.
             | 
             | Otherwise, the function's name has no relation to it's
             | behavior and it's a buggy function on top of being a
             | useless but amusing thought experiment.
        
             | dfox wrote:
             | which implies that the power state of the whole core
             | cluster is on, so the syscall is defined to return 1
        
           | onlydnaq wrote:
           | A CPU can halt as a power saving measure, and still respond
           | to interrupts.
        
         | dmitshur wrote:
         | I've wondered what Go APIs involving channels should do when
         | the computer is put to sleep and later on wakes up.
        
         | Filligree wrote:
         | > By the way, there is also HCF instruction (Halt and Catch
         | Fire).
         | 
         | I was somewhat recently scarred for life by this instruction,
         | having just discovered that if you execute HCF on the MIPS-
         | based integrated circuits in Stationeers, the simulated IC...
         | explodes in your face.
        
       | dkga wrote:
       | "How to find out computer is on fire"
        
       | kjhughes wrote:
       | Functional programming with monads is the right way to implement
       | this.
        
         | avl999 wrote:
         | A sideeffect free api to turn on the computer in haskell would
         | be brilliant.
        
         | WJW wrote:
         | Please, can we make it `MonadIO m => m Bool` so that this can
         | work with any IO-like monad and/or monad transformer stacks
         | based off IO? It will also make unit testing much easier.
        
         | perihelions wrote:
         | There's an elegant FP solution that involves searching an
         | infinite data structure using only a finite amount of
         | computation -- actually, with precisely zero computation,
         | because the machine isn't on.
         | 
         | It's like lazy evaluation, only more lazy.
        
           | h2odragon wrote:
           | Wait. When the machine isn't on, P=NP!
           | 
           | So our security systems are (useless | perfect)!
           | 
           | I think there might even be other implications...
        
             | MikeTheGreat wrote:
             | Nice job - having shown that P is the same as NP factorial
             | will allow us to solve a lot of really hard problems!
        
               | rezonant wrote:
               | Golf clap.
        
         | marcosdumay wrote:
         | It's obviously `IO Bool`, so it's equivalent to directly
         | evaluating in an imperative language and you gain nothing from
         | the monadic interface.
         | 
         | I'm sure some impurity "pragmatist" will try to argue you can
         | make a perfectly good version of it as `Bool`. That kind of
         | pragmatism is better ignored because it interferes with
         | compiler optimization and standardization. As an example, you
         | can look at the recent discussion around `==` and `/=`.
         | 
         | (And I just noticed some people may seriously argue that, so
         | here comes the /s.)
        
       | praptak wrote:
       | See also isUserAMonkey and isUserAGoat.
       | 
       | I think the following always holds: isUserAGoat==!isComputerOn,
       | in other words the user is a goat if and only if the computer is
       | off.
        
       | omgwtf1000 wrote:
       | Keeps timing out.
        
       | Animats wrote:
       | What's so amusing today is that "off" tends to be an illusion
       | today. It's more like "sleeping". There's still some stuff
       | running. Listening for the On button, Wake on LAN, timers, the
       | system management engine...
        
       | rossdavidh wrote:
       | Javascript equivalent function is kind of wonky so they had to
       | make is_the_computer_really_on() to do what you want here.
        
         | finnh wrote:
         | there's a convenient npm package to handle that for you
        
           | h2odragon wrote:
           | Yeah but you never know whose computer the result applies to
        
           | psyc wrote:
           | And a separate package by the same prolific author for not_on
           | that depends on the first package.
        
       | corpMaverick wrote:
       | Paraphrasing Descartes. "I think, therefore I am on".
        
       | cesarb wrote:
       | While this is a joke, there are some contexts in which is does
       | make sense to ask whether the computer is on. For instance, most
       | laptops have an embedded controller which runs all the time, even
       | when the laptop is powered off, and manages things like battery
       | charging and the power state. Within that embedded controller, an
       | is_computer_on() function could legitimately return "false".
        
         | capableweb wrote:
         | Yeah, would make sense in that case. Probably would name the
         | function differently though, to indicate the difference.
         | "is_computer_on" makes me think it's checking the state of the
         | computer this code is running on, not the state of another
         | computer than "myself".
        
       | salawat wrote:
       | I posit a much more interesting question.
       | 
       | Given a lump of silicon, how does one programmatically tell if it
       | is a computer?
        
         | h2odragon wrote:
         | `rock.exists()`? see also the last line of most "weather rock"
         | forecasting stations.
        
       | firefoxd wrote:
       | Where does the code run when the computer is off?
       | 
       | Edit: I see the downvotes, yet i still don't know if it's a joke.
       | I was genuinely asking the question.
        
         | agildehaus wrote:
         | thatsthejoke.jpg
        
         | icehawk wrote:
         | In the cloud
        
         | fragmede wrote:
         | that's the joke
        
         | tibanne wrote:
         | must be serverless
        
         | rzzzt wrote:
         | Embedded controller, management engine, low-power core.
        
         | charles_f wrote:
         | It looks like you haven't heard of quantum computing
        
           | rezonant wrote:
           | The computer is only on or off when you measure it.
        
         | h2odragon wrote:
         | Genuine answer: the code cant run when the computer is off,
         | thus the joke.
         | 
         | The question is worth asking (all are) but then soliciting
         | "quantum computing" as an answer makes it a doubly worthy set
         | up line, so thanks twice.
        
           | slacka wrote:
           | When I first read the headline, I assumed this was some kind
           | of query to the Intel Management Engine. But in this context,
           | it's some good programming humor.
        
       | zatarc wrote:
       | I think the is_computer_on_fire function is far more useful
        
       ___________________________________________________________________
       (page generated 2021-11-20 23:00 UTC)