src/coordinator/UnixSocketPolicy.bend
mylsm-lsm-store@0.6.0.1 · 63 lines · 11 definitions
1import Base
2
3
4type Classification is Data:
5 UnsupportedPlatform{}
6 Transient{code: U32}
7 Host{code: U32}
8
9
10type PollStatus is Data:
11 Readable{}
12 ReadableFailed{}
13 Idle{}
14 Failed{}
15
16
17type PollFailureAction is Data:
18 Retry{}
19 Stop{}
20
21def event.applies(connection_id: U32, event_id: U32) -> Bool:
22 U32.is_eq(connection_id, event_id)
23
24
25def classify_code(code: U32) -> Classification:
26 match code:
27 case 45: UnsupportedPlatform{}
28 case 78: UnsupportedPlatform{}
29 case 95: UnsupportedPlatform{}
30 case 38: UnsupportedPlatform{}
31 case 4: Transient{4}
32 case 11: Transient{11}
33 case 35: Transient{35}
34 case _: Host{code}
35
36def poll.failure.action(classification: Classification) -> PollFailureAction:
37 match classification:
38 case Transient{_}: Retry{}
39 case _: Stop{}
40
41def poll.failure(code: U32) -> PollFailureAction:
42 poll.failure.action(classify_code(code))
43
44def poll.failed(flags: U32) -> Bool:
45 Bool.not(U32.is_eq(U32.and(flags, 56), 0))
46
47def poll.readable(flags: U32) -> Bool:
48 Bool.not(U32.is_eq(U32.and(flags, 1), 0))
49
50def poll.status.readable(readable: Bool, failed: Bool) -> PollStatus:
51 match readable:
52 case True{}:
53 match failed:
54 case True{}: ReadableFailed{}
55 case False{}: Readable{}
56 case False{}:
57 match failed:
58 case True{}: Failed{}
59 case False{}: Idle{}
60
61
62def poll_status(+flags: U32) -> PollStatus:
63 poll.status.readable(poll.readable(flags), poll.failed(flags))