
blocking wait
-------------

- allocate a new clock entry
- add to list of pending sync waits
- do {
    wait on entry
  } while (entry != restart)
- free entry/remove from list

async wait
----------

- if no thread, start thread
- alloc a new clock entry
- add to list of pending async waits
- signal thread to restart timeouts

async thread
------------

  while (true) {
    if (no entry) wait for restart
    do {
      take first entry
      wait on it
     } while (entry != restart)
     call entry signal function
     free entry/remove from list
   }
  
clock adjust
------------

- loop over sync/async entries
- restart all entries

 


