All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scala.actors.MessageQueue.scala Maven / Gradle / Ivy


package scala.actors

/**
 * This class is used by our efficient message queue
 * implementation.
 *
 * @version 0.9.4
 * @author Philipp Haller
 */
class MessageQueueElement {
  var msg: Any = _
  var session: Channel[Any] = null
  var next: MessageQueueElement = null
}

/**
 * The class MessageQueue provides an efficient
 * implementation of a message queue specialized for this actor
 * library. Classes in this package are supposed to be the only
 * clients of this class.
 *
 * @version 0.9.4
 * @author Philipp Haller
 */
class MessageQueue {
  var first: MessageQueueElement = null
  // last == null iff list empty
  var last: MessageQueueElement = null

  def append(msg: Any, session: Channel[Any]) = {
    if (null eq last) { // list empty
      val el = new MessageQueueElement
      el.msg = msg
      el.session = session
      first = el
      last = el
    }
    else {
      val el = new MessageQueueElement
      el.msg = msg
      el.session = session
      last.next = el
      last = el
    }
  }

  def extractFirst(p: Any => boolean): MessageQueueElement = {
    if (null eq last) null
    else {
      // test first element
      if (p(first.msg)) {
        val tmp = first
        // remove first element
        first = first.next

        // might have to update last
        if (tmp eq last) {
          last = null
        }

        tmp
      }
      else {
        var curr = first
        var prev = curr
        while(curr.next != null) {
          prev = curr
          curr = curr.next
          if (p(curr.msg)) {
            // remove curr
            prev.next = curr.next

            // might have to update last
            if (curr eq last) {
              last = prev
            }

            return curr
          }
        }
        null
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy