Patch title: Release 93 bulk changes
Abstract:
File: /language/schedule/nestedsem.pli
Key:
    Removed line
    Added line
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

scope "/pliant/language/" "/pliant/install/"
module "/pliant/install/ring2.pli"


doc
  [Should be implemented more cleverly (lock algorithm):]
  list
    item
      [Try to get the semaphore through atomic_read_and_set:]
      list
        item
          [If we succeed, then we record the stack offset (but we don't loose time through findind the curren thread header).]
          [If we succeed, then we record the stack offset (but we don't loose time through findind the current thread header).]
        item
          [If we fail, we look at the the recorded stack offset:]
          list
            item [If it's one belonging to the current thread, then we can increment the count and succeed.]
            item [else, we 'yield' the processor and retry, or record ourself in the queue then suspend outself.]

type NestedSem
  field Sem sem
  field Pointer:ThreadHeader header
  field Int count

function build  ns
  arg_w NestedSem ns
  ns header :> null map ThreadHeader


method ns request
  arg_rw NestedSem ns
  var Pointer:ThreadHeader h :> current_thread_header
  if (addressof ns:header)<>addressof:h
    ns:sem request
    ns header :> h
    ns count := 1
  else
    ns count += 1

method ns release
  arg_rw NestedSem ns
  if ns:count=1
    ns header :> null map ThreadHeader
    ns:sem release
  else
    ns count -= 1


method ns rd_request
  arg_rw NestedSem ns
  var Pointer:ThreadHeader h :> current_thread_header
  if (addressof ns:header)<>addressof:h
    ns:sem rd_request
  # else
  #   ns count += 1

method ns rd_release
  arg_rw NestedSem ns
  var Pointer:ThreadHeader h :> current_thread_header
  if (addressof ns:header)<>addressof:h
    ns:sem rd_release
  # else
  #   ns count -= 1



export NestedSem '. request' '. release' '. rd_request' '. rd_release'


public
  gvar NestedSem pliant_compiler_semaphore