old_contents: #
  # Sheared -- non-blocking network programming library for Python
  # Copyright (C) 2003  Sune Kirkeby <sune@mel.interspace.dk>
  # 
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 2 of the License, or
  # (at your option) any later version.
  # 
  # 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
  # along with this program; if not, write to the Free Software
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  #
  
  import stackless
  
  class Semaphore:
      def __init__(self):
          self.channel = stackless.channel()
          self.taken = 0
          self.waiting = 0
  
      def grab(self):
          if self.taken:
              self.waiting = self.waiting + 1
              self.channel.receive()
              self.waiting = self.waiting - 1
          else:
              self.taken = 1
              
      def release(self):
          if self.waiting:
              self.channel.send()
          else:
              self.taken = 0
  
new_contents: #
  # Sheared -- non-blocking network programming library for Python
  # Copyright (C) 2003  Sune Kirkeby <sune@mel.interspace.dk>
  # 
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 2 of the License, or
  # (at your option) any later version.
  # 
  # 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
  # along with this program; if not, write to the Free Software
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  #
  
  import stackless
  
  class Semaphore:
      def __init__(self):
          self.channel = stackless.channel()
          self.taken = 0
          self.waiting = 0
  
      def grab(self):
          if self.taken:
              self.waiting = self.waiting + 1
              self.channel.receive()
              self.waiting = self.waiting - 1
          else:
              self.taken = 1
              
      def release(self):
          if self.waiting:
              self.channel.send(None)
          else:
              self.taken = 0
  
subject: Fix channel.send bug in semaphore release.