   }
 }
 
-extension SelectChan: SelectionChannel
+/**
+  The SelectionChannel methods for SelectChan
+*/
+
+extension SelectChan //: SelectionChannel (repeating this crashes swiftc)
 {
   /**
     selectMutex() must be used to send data to SelectChan in a thread-safe manner
+  
+    Actions which must be performed synchronously with the SelectChan should be passed to
+    selectMutex() as a closure. The closure will only be executed if the channel is still open.
   */
 
   public func selectMutex(action: () -> ())

  {
    pthread_mutex_lock(channelMutex)

//    log("attempting to read from 0-channel")

    while self.isEmpty && !self.closed
    {
      blockedReaders += 1
      if blockedWriters > 0
      {
        // Maybe we can interest a writer
        pthread_cond_signal(writeCondition)
      }
      // wait for a writer to signal us
      pthread_cond_wait(readCondition, channelMutex)
      blockedReaders -= 1
    }

    assert(!self.isEmpty || self.isClosed, "Messed up an unbuffered read")

    let element = self.element
    self.element = nil

    if self.closed { pthread_cond_signal(readCondition) }
    pthread_mutex_unlock(channelMutex)

//    log("read from 0-channel")

    return element
  }

  override func selectRead(channel: SelectChan<SelectionType>, messageID: Selectable) -> Signal

    async {
      pthread_mutex_lock(self.channelMutex)

      while !self.isReady && !self.isClosed
      {
        self.blockedReaders += 1
        if self.blockedWriters > 0
