annotate app/src/main/java/com/bartsent/simpleresizer/lib/Channel.kt @ 9:884092efe31a concur

Gets gratuitously killed. WTF?
author David Barts <n5jrn@me.com>
date Wed, 17 Feb 2021 13:20:25 -0800
parents 9374d044a132
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
1 package com.bartsent.simpleresizer.lib
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
2
9
884092efe31a Gets gratuitously killed. WTF?
David Barts <n5jrn@me.com>
parents: 7
diff changeset
3 import android.util.Log
7
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
4 import java.util.concurrent.Semaphore
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
5
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
6 /**
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
7 * A typed, buffered communications channel a'la C.A.R. Hoare's communicating sequential
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
8 * processes (CSP).
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
9 */
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
10 class Channel<T: Any>(capacity: Int) {
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
11 private val buffer = Array<Any?>(capacity) { null }
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
12 private var start = 0
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
13 private val wSem = Semaphore(capacity)
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
14 private val rSem = Semaphore(0)
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
15
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
16 /**
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
17 * Write a single item to this channel.
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
18 * @param item Item to write
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
19 */
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
20 fun write(item: T): Unit {
9
884092efe31a Gets gratuitously killed. WTF?
David Barts <n5jrn@me.com>
parents: 7
diff changeset
21 Log.d("Channel<${hashCode()}>", "write…")
7
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
22 wSem.acquire()
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
23 synchronized(this) {
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
24 buffer[(start + rSem.availablePermits()) % buffer.size] = item
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
25 rSem.release()
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
26 }
9
884092efe31a Gets gratuitously killed. WTF?
David Barts <n5jrn@me.com>
parents: 7
diff changeset
27 Log.d("Channel<${hashCode()}>", "write done")
7
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
28 }
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
29
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
30 /**
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
31 * Read a single item from this channel.
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
32 * @return The item read
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
33 */
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
34 fun read(): T {
9
884092efe31a Gets gratuitously killed. WTF?
David Barts <n5jrn@me.com>
parents: 7
diff changeset
35 Log.d("Channel<${hashCode()}>", "read…")
7
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
36 rSem.acquire()
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
37 synchronized(this) {
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
38 val ret = buffer[start]!! as T
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
39 buffer[start] = null // unref
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
40 start = (start + 1) % buffer.size
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
41 wSem.release()
9
884092efe31a Gets gratuitously killed. WTF?
David Barts <n5jrn@me.com>
parents: 7
diff changeset
42 Log.d("Channel<${hashCode()}>", "read done")
7
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
43 return ret
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
44 }
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
45 }
9374d044a132 Concurrency attempt, NOT WORKING.
David Barts <n5jrn@me.com>
parents:
diff changeset
46 }