A wait object has a mutable clock value and access to a real time clock. One order sets the clock value. Another order waits until the real time exceeds the clock value. Note that one domain can set the clock value while another domain is waiting and this action causes the first domain to proceed.
There are several kernel wait objects and wait multiplexors which provide more wait objects built with domain code. Kernel wait objects are faster and fewer. Special pleading can get you a kernel wait object.