Public ClosedWriteChannelException and message for it
diff --git a/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteBufferChannel.kt b/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteBufferChannel.kt
index 33d54d7..e4c7df8 100644
--- a/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteBufferChannel.kt
+++ b/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteBufferChannel.kt
@@ -4,13 +4,14 @@
 
 import kotlinx.coroutines.experimental.CancellableContinuation
 import kotlinx.coroutines.experimental.channels.ClosedReceiveChannelException
-import kotlinx.coroutines.experimental.channels.ClosedSendChannelException
 import kotlinx.coroutines.experimental.io.internal.*
 import kotlinx.coroutines.experimental.io.packet.*
 import kotlinx.coroutines.experimental.suspendCancellableCoroutine
 import java.nio.BufferOverflowException
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater
 
+internal const val DEFAULT_CLOSE_MESSAGE = "Byte channel was closed"
+
 // implementation for ByteChannel
 internal class ByteBufferChannel(
     override val autoFlush: Boolean,
@@ -1276,7 +1277,8 @@
                 c.resume(state.capacity.availableForRead > 0)
         }
 
-        WriteOp.getAndSet(this, null)?.tryResumeWithException(cause ?: ClosedSendChannelException(null))
+        WriteOp.getAndSet(this, null)?.tryResumeWithException(cause ?:
+            ClosedWriteChannelException(DEFAULT_CLOSE_MESSAGE))
     }
 
     private tailrec suspend fun readSuspend(size: Int): Boolean {
diff --git a/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteWriteChannel.kt b/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteWriteChannel.kt
index 73f5ca7..58a9510 100644
--- a/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteWriteChannel.kt
+++ b/core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteWriteChannel.kt
@@ -1,6 +1,8 @@
 package kotlinx.coroutines.experimental.io
 
-import kotlinx.coroutines.experimental.io.packet.*
+import kotlinx.coroutines.experimental.io.packet.ByteReadPacket
+import kotlinx.coroutines.experimental.io.packet.ByteWritePacket
+import kotlinx.coroutines.experimental.io.packet.buildPacket
 import java.nio.ByteBuffer
 import java.nio.CharBuffer
 import java.util.concurrent.CancellationException
@@ -174,4 +176,9 @@
     writePacket(buildPacket { builder() })
 }
 
-class ClosedWriteChannelException(message: String?) : CancellationException(message)
\ No newline at end of file
+/**
+ * Indicates attempt to write on [isClosedForWrite][ByteWriteChannel.isClosedForWrite] channel
+ * that was closed without a cause. A _failed_ channel rethrows the original [close][ByteWriteChannel.close] cause
+ * exception on send attempts.
+ */
+public class ClosedWriteChannelException(message: String?) : CancellationException(message)
\ No newline at end of file