aboutsummaryrefslogblamecommitdiffstats
path: root/doc/protocol
blob: f45799ecf7777d8d722e563aede41a53abdaa978 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
       

                          


                                                                         
 


                                                                          





                                                      
                           

                  
 



                                                             

       








                                                          










                                                                
                                                     
 
create:
	Select a filename.

	Create XSI semaphore array {S = 0, W = 0, X = 1, Q = 0 and N = 0}
	with random key. Store the semaphore array's key in decimal form
	on the first line in the selected file.

	Create XSI shared memory, with an allocation of 2048 bytes, with a
	random key. Store the shared memory's key in decimal form on the
	second line in the selected file.


broadcast:
	with P(X):
	  Z(W)
	  Write NUL-terminate message to shared memory
	  with V(N): -- (1)
	    Q := 0
	    Z(S)

	-- (1) may be omitted if semaphores are known that
	   P(·), Z(·), V(·) cannot create a race condition
	   with a processes running Z(·).


listen:
	with V(S):
	  forever:
	    V(Q)
	    Z(Q)
	    Read NUL-terminated message from shared memory
	    if breaking:
	      break
	    with V(W):
	      with P(S):
	        Z(S)
	        Z(N)


`V(a)` means that semaphore a is released.
`P(a)` means that semaphore a is acquired.
`Z(a)` means that the process waits for semaphore a to become 0.
`with P(a)` that `P(a)` is done before the entering the scope,
and `V(a)` is done when exiting the scope. It also means that
these actions [P(a) and V(a)] are undone when the process exits,
or if the call fails.
`with V(a)` is to `V(a)` as `with P(a)` is to `P(a)`.