Skip to content

Commit 41ccd98

Browse files
committed
Rename Channel to Signal
1 parent 69137ab commit 41ccd98

File tree

5 files changed

+76
-76
lines changed

5 files changed

+76
-76
lines changed

examples/stdlib/acme.effekt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ import effekt
1313
import exception
1414
import heap
1515
import io
16-
import io/channel
1716
import io/console
1817
import io/error
1918
import io/filesystem
2019
import io/network
2120
import io/promise
21+
import io/signal
2222
import io/time
2323
import json
2424
import list

libraries/common/io/channel.effekt

Lines changed: 0 additions & 37 deletions
This file was deleted.

libraries/common/io/promise.effekt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
module io/promise
22

33
import io
4-
import io/channel
4+
import io/signal
55

66
// Promises
77
// --------
88

99
type State[T] {
1010
Resolved(value: T)
11-
Pending(channels: List[Channel[T]])
11+
Pending(signals: List[Signal[T]])
1212
}
1313

1414
extern type Promise[T]
@@ -45,11 +45,11 @@ extern {async, global} def await[T](promise: Promise[T]): T =
4545
get(reference) match {
4646
case Resolved(value) =>
4747
return value
48-
case Pending(channels) =>
49-
val channel = channel::allocate()
50-
// TODO use reference.set and channel.wait
51-
set(reference, Pending(Cons(channel, channels)))
52-
wait(channel)
48+
case Pending(signals) =>
49+
val signal = signal::allocate()
50+
// TODO use reference.set and signal.wait
51+
set(reference, Pending(Cons(signal, signals)))
52+
wait(signal)
5353
}
5454
}
5555

@@ -61,11 +61,11 @@ extern {io, global} def resolve[T](promise: Promise[T], value: T): Unit =
6161
get(reference) match {
6262
case Resolved(value) =>
6363
panic("ERROR: Promise already resolved")
64-
case Pending(channels) =>
64+
case Pending(signals) =>
6565
// TODO use reference.set
6666
set(reference, Resolved(value))
67-
// TODO use channels.reverse.foreach
68-
foreach(reverse(channels)) { channel => send(channel, value) }
67+
// TODO use signals.reverse.foreach
68+
foreach(reverse(signals)) { signal => send(signal, value) }
6969
}
7070
}
7171

libraries/common/io/signal.effekt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
module io/signal
2+
3+
// Signals
4+
// -------
5+
6+
/// Must be sent exactly once and waited for exactly once
7+
extern type Signal[T]
8+
9+
namespace signal {
10+
extern global def allocate[T](): Signal[T] =
11+
llvm """
12+
%signal = call %Pos @c_signal_make()
13+
ret %Pos %signal
14+
"""
15+
}
16+
17+
extern global def send[T](signal: Signal[T], value: T): Unit =
18+
llvm """
19+
call void @c_signal_send(%Pos ${signal}, %Pos ${value})
20+
ret %Pos zeroinitializer
21+
"""
22+
23+
extern async def wait[T](signal: Signal[T]): T =
24+
llvm """
25+
call void @c_signal_wait(%Pos ${signal}, %Stack %stack)
26+
ret void
27+
"""
28+
29+
extern llvm """
30+
declare %Pos @c_signal_make()
31+
declare void @c_signal_send(%Pos, %Pos)
32+
declare void @c_signal_wait(%Pos, %Stack)
33+
"""
34+
35+
36+
37+

libraries/llvm/io.c

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -295,95 +295,95 @@ void c_yield(Stack stack) {
295295
c_timer_start(0, stack);
296296
}
297297

298-
// Channels
298+
// Signals
299299
// --------
300300

301-
typedef enum { EMPTY, SENDED, WAITED } channel_state_t;
301+
typedef enum { EMPTY, SENDED, WAITED } signal_state_t;
302302

303303
typedef struct {
304304
uint64_t rc;
305305
void* eraser;
306-
channel_state_t state;
306+
signal_state_t state;
307307
union {
308308
struct Pos value;
309309
Stack stack;
310310
} payload;
311-
} Channel;
311+
} Signal;
312312

313-
void c_channel_erase(void *envPtr) {
314-
// envPtr points to a Channel _after_ the eraser, so let's adjust it to point to the beginning.
315-
Channel *channel = (Channel*) (envPtr - offsetof(Channel, state));
316-
channel_state_t state = channel->state;
313+
void c_signal_erase(void *envPtr) {
314+
// envPtr points to a Signal _after_ the eraser, so let's adjust it to point to the beginning.
315+
Signal *signal = (Signal*) (envPtr - offsetof(Signal, state));
316+
signal_state_t state = signal->state;
317317
switch (state) {
318318
case EMPTY:
319319
break;
320320
case SENDED:
321-
erasePositive(channel->payload.value);
321+
erasePositive(signal->payload.value);
322322
break;
323323
case WAITED:
324-
eraseStack(channel->payload.stack);
324+
eraseStack(signal->payload.stack);
325325
break;
326326
}
327327
}
328328

329-
struct Pos c_channel_make() {
330-
Channel* channel = (Channel*)malloc(sizeof(Channel));
329+
struct Pos c_signal_make() {
330+
Signal* signal = (Signal*)malloc(sizeof(Signal));
331331

332-
channel->rc = 0;
333-
channel->eraser = c_channel_erase;
334-
channel->state = EMPTY;
332+
signal->rc = 0;
333+
signal->eraser = c_signal_erase;
334+
signal->state = EMPTY;
335335

336-
return (struct Pos) { .tag = 0, .obj = channel, };
336+
return (struct Pos) { .tag = 0, .obj = signal, };
337337
}
338338

339-
void c_channel_send(struct Pos channel, struct Pos value) {
340-
Channel* f = (Channel*)channel.obj;
339+
void c_signal_send(struct Pos signal, struct Pos value) {
340+
Signal* f = (Signal*)signal.obj;
341341
switch (f->state) {
342342
case EMPTY: {
343343
f->state = SENDED;
344344
f->payload.value = value;
345-
erasePositive(channel);
345+
erasePositive(signal);
346346
break;
347347
}
348348
case SENDED: {
349-
erasePositive(channel);
349+
erasePositive(signal);
350350
erasePositive(value);
351351
// TODO more graceful panic
352-
fprintf(stderr, "ERROR: Channel already used for sending\n");
352+
fprintf(stderr, "ERROR: Signal already used for sending\n");
353353
exit(1);
354354
break;
355355
}
356356
case WAITED: {
357357
Stack stack = f->payload.stack;
358358
f->state = EMPTY;
359-
erasePositive(channel);
359+
erasePositive(signal);
360360
resume_Pos(stack, value);
361361
break;
362362
}
363363
}
364364
}
365365

366-
void c_channel_wait(struct Pos channel, Stack stack) {
367-
Channel* f = (Channel*)channel.obj;
366+
void c_signal_wait(struct Pos signal, Stack stack) {
367+
Signal* f = (Signal*)signal.obj;
368368
switch (f->state) {
369369
case EMPTY: {
370370
f->state = WAITED;
371371
f->payload.stack = stack;
372-
erasePositive(channel);
372+
erasePositive(signal);
373373
break;
374374
}
375375
case SENDED: {
376376
struct Pos value = f->payload.value;
377377
f->state = EMPTY;
378-
erasePositive(channel);
378+
erasePositive(signal);
379379
resume_Pos(stack, value);
380380
break;
381381
}
382382
case WAITED: {
383-
erasePositive(channel);
383+
erasePositive(signal);
384384
eraseStack(stack);
385385
// TODO more graceful panic
386-
fprintf(stderr, "ERROR: Channel already used for waiting\n");
386+
fprintf(stderr, "ERROR: Signal already used for waiting\n");
387387
exit(1);
388388
break;
389389
}

0 commit comments

Comments
 (0)