Return the current value of an eventcount. It equals the number of advance operations that have been performed on
it. To be more precise, the value returned by read() counts all of the advance operations that precede the
execution, and may or may not count those in progress during the read. Thus, although the value may be changing
during the execution of the read primitive, the result of read() is a lower bound on the current value of E after
the read, and an upper bound on the value of E before the read.
Quite often, a process may not wish to execute until some event in a class in which it has interest has happened.
Although that effect can be achieved by looping around an execution of a read() primitive until a specified value
of the eventcount, E, is reached, it is more useful to provide a primitive that incorporates the waiting. Such a
primitive would also provide the opportunity to avoid the busy form of waiting. Consequently, we define a
primitive await(E, v) that suspends the calling process until the value of the eventcount E is at least v. Of
course, as in all mechanisms designed for asynchronous processes, the await primitive may not return immediately
once the vth advance on E is executed; the only guarantee is that at least v advances have been performed by the
time await(E, v) returns.