Scala Library: scala.concurrent.SyncChannel
scala.concurrent.SyncChannel
class SyncChannel[A] extends AnyRef
A SyncChannel
allows one to exchange data synchronously between a reader and a
writer thread. The writer thread is blocked until the data to be written has
been read by a corresponding reader thread.
- Source
- Version
- 2.0, 04/17/2008
Instance Constructors From scala.concurrent.SyncChannel
new SyncChannel()
(defined at scala.concurrent.SyncChannel)
Value Members From scala.concurrent.SyncChannel
def write(data: A): Unit
(defined at scala.concurrent.SyncChannel)
Full Source:
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala.concurrent
/** A `SyncChannel` allows one to exchange data synchronously between
* a reader and a writer thread. The writer thread is blocked until the
* data to be written has been read by a corresponding reader thread.
*
* @author Philipp Haller
* @version 2.0, 04/17/2008
*/
class SyncChannel[A] {
private var pendingWrites = List[(A, SyncVar[Boolean])]()
private var pendingReads = List[SyncVar[A]]()
def write(data: A) {
// create write request
val writeReq = new SyncVar[Boolean]
this.synchronized {
// check whether there is a reader waiting
if (!pendingReads.isEmpty) {
val readReq = pendingReads.head
pendingReads = pendingReads.tail
// let reader continue
readReq set data
// resolve write request
writeReq set true
}
else {
// enqueue write request
pendingWrites = pendingWrites ::: List((data, writeReq))
}
}
writeReq.get
}
def read: A = {
// create read request
val readReq = new SyncVar[A]
this.synchronized {
// check whether there is a writer waiting
if (!pendingWrites.isEmpty) {
// read data
val (data, writeReq) = pendingWrites.head
pendingWrites = pendingWrites.tail
// let writer continue
writeReq set true
// resolve read request
readReq set data
}
else {
// enqueue read request
pendingReads = pendingReads ::: List(readReq)
}
}
readReq.get
}
}
Interested in Scala?
I send out weekly, personalized emails with articles and conference talks.
Subscribe now.