-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAsyncGroupImpl.java
More file actions
110 lines (96 loc) · 2.39 KB
/
AsyncGroupImpl.java
File metadata and controls
110 lines (96 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
* AsyncGroupImpl.java
* Copyright (C) 2023-2026 Takayuki Sato. All Rights Reserved.
*/
package com.github.sttk.sabi.internal;
import com.github.sttk.errs.Err;
import com.github.sttk.sabi.AsyncGroup;
import com.github.sttk.sabi.Runner;
import java.util.Map;
public final class AsyncGroupImpl implements AsyncGroup {
private ErrEntry errHead;
private ErrEntry errLast;
private VthEntry vthHead;
private VthEntry vthLast;
String name;
public AsyncGroupImpl() {}
@Override
public void add(final Runner runner) {
final var name = this.name;
var vth =
Thread.ofVirtual()
.start(
() -> {
try {
runner.run();
} catch (Err | RuntimeException e) {
addErr(name, e);
}
});
var ent = new VthEntry(name, vth);
if (this.vthLast == null) {
this.vthHead = ent;
this.vthLast = ent;
} else {
this.vthLast.next = ent;
this.vthLast = ent;
}
}
synchronized void addErr(String name, Exception e) {
var err = (e instanceof Err) ? Err.class.cast(e) : new Err(new RunnerFailed(), e);
var ent = new ErrEntry(name, err);
if (this.errLast == null) {
this.errHead = ent;
this.errLast = ent;
} else {
this.errLast.next = ent;
this.errLast = ent;
}
}
void joinAndPutErrsInto(Map<String, Err> errMap) {
for (var ent = this.vthHead; ent != null; ent = ent.next) {
try {
ent.thread.join();
} catch (InterruptedException e) {
addErr(ent.name, new Err(new RunnerInterrupted(), e));
}
}
for (var ent = this.errHead; ent != null; ent = ent.next) {
errMap.put(ent.name, ent.err);
}
clear();
}
void joinAndIgnoreErrs() {
for (var ent = this.vthHead; ent != null; ent = ent.next) {
try {
ent.thread.join();
} catch (InterruptedException e) {
}
}
clear();
}
void clear() {
this.errHead = null;
this.errLast = null;
this.vthHead = null;
this.vthLast = null;
}
}
class ErrEntry {
final String name;
final Err err;
ErrEntry next;
ErrEntry(String name, Err err) {
this.name = name;
this.err = err;
}
}
class VthEntry {
final String name;
final Thread thread;
VthEntry next;
VthEntry(String name, Thread thread) {
this.name = name;
this.thread = thread;
}
}