Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/schedule/sem3.pli
Key:
    Removed line
    Added line
module "/pliant/linux/schedule/futex.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/os.pli"


constant not_locked 0
constant write_locked 80000000h
constant please_retry 0FFFFFFFFh

type Sem3
  field uInt status <- 0
  field Int pending <-0


method sem safe_read_status -> s
  arg_rw Sem3 sem ; arg uInt s
  part aquire
    s := atomic_read_and_set sem:status please_retry
    if s=please_retry
      os_yield
      restart aquire
    

method sem request
  arg_rw Sem3 sem
  atomic_add sem:pending 1
  while true
    var uInt s := atomic_read_and_set sem:status please_retry
    if s=not_locked
      atomic_add sem:pending -1
      sem status := write_locked
      return
    sem status := s
    os_futex_wait sem:status s
  
  
method sem nowait_request -> success
  arg_rw Sem3 sem ; arg CBool success
  while true
    var uInt s := atomic_read_and_set sem:status please_retry
    if s=not_locked
      sem status := write_locked
      success := true
    else
      if s<>please_retry
        sem status := s
      success := false
  
  
method sem release
  arg_rw Sem3 sem
  var uInt s := sem safe_read_status
  check s=write_locked "Attempted to write realease a not write locked semaphore"
  sem status := not_locked
  if sem:pending>0
    os_futex_wake sem:status 1 # 256
  
  
method sem rd_request
  arg_rw Sem3 sem
  atomic_add sem:pending 1
  while true
    var uInt s := atomic_read_and_set sem:status please_retry
    if s<write_locked
      atomic_add sem:pending -1
      sem status := s+1
      return
    sem status := s
    os_futex_wait sem:status s
  
  
method sem nowait_rd_request -> success
  arg_rw Sem3 sem ; arg CBool success
  while true
    var uInt s := atomic_read_and_set sem:status please_retry
    if s<>write_locked and s<>please_retry
      sem status := s+1
      success := true
    else
      if s<>please_retry
        sem status := s
      success := false
  
  
method sem rd_release
  arg_rw Sem3 sem
  var uInt s := sem safe_read_status
  check s>0 and s<>write_locked "Attempted to read realease a not read locked semaphore"
  sem status := s-1
  if s=1 and sem:pending>0
    os_futex_wake sem:status 1
  
  
export Sem3 '. request' '. nowait_request' '. release' '. nowait_rd_request' '. rd_request' '. rd_release'