@zk-tech/bedrock 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async/index.cjs.map +1 -1
- package/dist/async/index.d.cts +2 -2
- package/dist/async/index.d.ts +2 -2
- package/dist/async/index.js.map +1 -1
- package/dist/error/index.cjs.map +1 -1
- package/dist/error/index.d.cts +19 -19
- package/dist/error/index.d.ts +19 -19
- package/dist/error/index.js.map +1 -1
- package/dist/{error-base-B4zaiJ5m.d.cts → error-base-DOFtBFla.d.cts} +8 -8
- package/dist/{error-base-B4zaiJ5m.d.ts → error-base-DOFtBFla.d.ts} +8 -8
- package/dist/promise/index.cjs.map +1 -1
- package/dist/promise/index.d.cts +4 -4
- package/dist/promise/index.d.ts +4 -4
- package/dist/promise/index.js.map +1 -1
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +2 -2
- package/dist/worker/index.d.ts +2 -2
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -2
- package/src/_internal/logger.ts +0 -59
- package/src/array/array.test.ts +0 -35
- package/src/array/array.ts +0 -25
- package/src/array/index.ts +0 -1
- package/src/assert/assert.test.ts +0 -86
- package/src/assert/assert.ts +0 -42
- package/src/assert/index.ts +0 -2
- package/src/async/barrier.test.ts +0 -90
- package/src/async/barrier.ts +0 -58
- package/src/async/cancellation.test.ts +0 -85
- package/src/async/cancellation.ts +0 -193
- package/src/async/index.ts +0 -18
- package/src/async/queue/queue.test.ts +0 -70
- package/src/async/queue/queue.ts +0 -56
- package/src/async/queue/task.test.ts +0 -155
- package/src/async/queue/task.ts +0 -67
- package/src/async/utils.test.ts +0 -28
- package/src/async/utils.ts +0 -8
- package/src/async/wait.ts +0 -9
- package/src/byte/format.test.ts +0 -64
- package/src/byte/format.ts +0 -44
- package/src/byte/index.ts +0 -2
- package/src/byte/node_modules/.vitest/results.json +0 -1
- package/src/byte/var.ts +0 -11
- package/src/cache/index.ts +0 -2
- package/src/cache/lru-with-timeout.test.ts +0 -88
- package/src/cache/lru-with-timeout.ts +0 -85
- package/src/cache/lru.test.ts +0 -56
- package/src/cache/lru.ts +0 -59
- package/src/context/context.test.ts +0 -17
- package/src/context/context.ts +0 -60
- package/src/context/index.ts +0 -8
- package/src/di/base.ts +0 -73
- package/src/di/container-service.test.ts +0 -179
- package/src/di/context.web.tsx +0 -41
- package/src/di/descriptor.ts +0 -31
- package/src/di/idle-value.test.ts +0 -73
- package/src/di/idle-value.ts +0 -63
- package/src/di/index.common.ts +0 -32
- package/src/di/index.ts +0 -2
- package/src/di/instantiation-service.interface.ts +0 -46
- package/src/di/instantiation-service.test.ts +0 -337
- package/src/di/instantiation-service.ts +0 -468
- package/src/di/lazy/foo.mock.ts +0 -28
- package/src/di/lazy/idle-load.ts +0 -39
- package/src/di/lazy/index.ts +0 -4
- package/src/di/lazy/lazy-service.test.ts +0 -65
- package/src/di/lazy/lazy-service.ts +0 -71
- package/src/di/lazy/type.ts +0 -5
- package/src/di/node_modules/.vitest/results.json +0 -1
- package/src/di/proxy-builder.test.ts +0 -45
- package/src/di/proxy-builder.ts +0 -38
- package/src/di/service-collection.test.ts +0 -27
- package/src/di/service-collection.ts +0 -46
- package/src/di/service-ownership-collection.test.ts +0 -39
- package/src/di/service-ownership-collection.ts +0 -38
- package/src/di/service-registry.test.ts +0 -66
- package/src/di/service-registry.ts +0 -99
- package/src/di/trace.ts +0 -85
- package/src/dispose/disposable-store.test.ts +0 -57
- package/src/dispose/disposable-store.ts +0 -80
- package/src/dispose/disposable-t.test.ts +0 -123
- package/src/dispose/disposable-t.ts +0 -238
- package/src/dispose/disposable-utils.test.ts +0 -15
- package/src/dispose/disposable-utils.ts +0 -28
- package/src/dispose/dispose-base.ts +0 -9
- package/src/dispose/index.ts +0 -34
- package/src/dispose/logger.test.ts +0 -65
- package/src/dispose/logger.ts +0 -39
- package/src/dispose/timer.test.ts +0 -30
- package/src/dispose/timer.ts +0 -16
- package/src/dispose/tracker.test.ts +0 -51
- package/src/dispose/tracker.ts +0 -105
- package/src/error/error-base.ts +0 -45
- package/src/error/error-code.ts +0 -39
- package/src/error/error-const.test.ts +0 -30
- package/src/error/error-const.ts +0 -16
- package/src/error/error-or.test.ts +0 -44
- package/src/error/error-or.ts +0 -2
- package/src/error/error-t.test.ts +0 -116
- package/src/error/error-t.ts +0 -100
- package/src/error/index.ts +0 -24
- package/src/error/node_modules/.vitest/results.json +0 -1
- package/src/event/disposable-linked-list.ts +0 -29
- package/src/event/emitter.test.ts +0 -191
- package/src/event/emitter.ts +0 -162
- package/src/event/error-handler.ts +0 -22
- package/src/event/index.ts +0 -34
- package/src/event/once.ts +0 -29
- package/src/event/phase-emitter.test.ts +0 -212
- package/src/event/phase-emitter.ts +0 -209
- package/src/event/shortcut-event-utils.ts +0 -33
- package/src/event/utils.ts +0 -6
- package/src/event/when.ts +0 -40
- package/src/function/debounce.test.ts +0 -274
- package/src/function/debounce.ts +0 -168
- package/src/function/index.ts +0 -2
- package/src/function/node_modules/.vitest/results.json +0 -1
- package/src/function/throttle.test.ts +0 -179
- package/src/function/throttle.ts +0 -26
- package/src/hash/hash-t.test.ts +0 -100
- package/src/hash/hash-t.ts +0 -51
- package/src/hash/index.ts +0 -3
- package/src/json/index.ts +0 -1
- package/src/json/node_modules/.vitest/results.json +0 -1
- package/src/json/parse.ts +0 -19
- package/src/launch/abstract-job.ts +0 -45
- package/src/launch/cost-recorder.ts +0 -22
- package/src/launch/index.ts +0 -2
- package/src/launch/job-scheduler.test.ts +0 -122
- package/src/launch/job-scheduler.ts +0 -118
- package/src/launch/node_modules/.vitest/deps/_metadata.json +0 -8
- package/src/launch/node_modules/.vitest/deps/package.json +0 -3
- package/src/launch/node_modules/.vitest/results.json +0 -1
- package/src/lock/README.md +0 -11
- package/src/lock/capability.test.ts +0 -110
- package/src/lock/capability.ts +0 -89
- package/src/lock/index.ts +0 -15
- package/src/lock/node_modules/.vitest/results.json +0 -1
- package/src/lock/semaphore.ts +0 -21
- package/src/lock/shared-mutex.test.ts +0 -537
- package/src/lock/shared-mutex.ts +0 -242
- package/src/lock/utils.test.ts +0 -165
- package/src/lock/utils.ts +0 -135
- package/src/lodash-es/index.ts +0 -1
- package/src/math/degree.ts +0 -16
- package/src/math/index.ts +0 -7
- package/src/math/math.test.ts +0 -40
- package/src/math/math.ts +0 -64
- package/src/math/node_modules/.vitest/results.json +0 -1
- package/src/math/vector.test.ts +0 -73
- package/src/math/vector.ts +0 -114
- package/src/network/client.interface.ts +0 -104
- package/src/network/client.web.ts +0 -24
- package/src/network/index.common.ts +0 -10
- package/src/network/index.ts +0 -2
- package/src/network/plugins/retry.ts +0 -98
- package/src/objects/deep-clone.test.ts +0 -40
- package/src/objects/deep-clone.ts +0 -13
- package/src/objects/deep-equal.test.ts +0 -86
- package/src/objects/deep-equal.ts +0 -60
- package/src/objects/index.ts +0 -4
- package/src/platform/index.ts +0 -64
- package/src/promise/index.ts +0 -16
- package/src/promise/promise.test.ts +0 -254
- package/src/promise/promise.ts +0 -212
- package/src/scheduler/callback-token.ts +0 -31
- package/src/scheduler/core/actuator-args.test.ts +0 -47
- package/src/scheduler/core/actuator.test.ts +0 -82
- package/src/scheduler/core/actuator.ts +0 -58
- package/src/scheduler/core/chunk-scheduler.test.ts +0 -54
- package/src/scheduler/core/chunk-scheduler.ts +0 -28
- package/src/scheduler/core/node_modules/.vitest/results.json +0 -1
- package/src/scheduler/core/scheduler.test.ts +0 -328
- package/src/scheduler/core/scheduler.ts +0 -172
- package/src/scheduler/core/task-queue.test.ts +0 -78
- package/src/scheduler/core/task-queue.ts +0 -44
- package/src/scheduler/core/task.test.ts +0 -34
- package/src/scheduler/core/task.ts +0 -52
- package/src/scheduler/core/utils.ts +0 -48
- package/src/scheduler/executor/abstract-executor.test.ts +0 -44
- package/src/scheduler/executor/abstract-executor.ts +0 -38
- package/src/scheduler/executor/executor.interface.ts +0 -39
- package/src/scheduler/executor/idle-callback-executor.test.ts +0 -70
- package/src/scheduler/executor/idle-callback-executor.ts +0 -98
- package/src/scheduler/executor/make-executor.ts +0 -18
- package/src/scheduler/executor/post-message-executor.test.ts +0 -66
- package/src/scheduler/executor/post-message-executor.ts +0 -52
- package/src/scheduler/index.ts +0 -15
- package/src/scheduler/lv-scheduler-callback.ts +0 -19
- package/src/scheduler/lv-scheduler-config.ts +0 -17
- package/src/scheduler/type.ts +0 -48
- package/src/sprintf/index.ts +0 -2
- package/src/sprintf/sprintf.test.ts +0 -95
- package/src/sprintf/sprintf.ts +0 -97
- package/src/structure/graph.test.ts +0 -181
- package/src/structure/graph.ts +0 -105
- package/src/structure/index.ts +0 -8
- package/src/structure/linked-list.test.ts +0 -74
- package/src/structure/linked-list.ts +0 -145
- package/src/structure/min-heap.test.ts +0 -71
- package/src/structure/min-heap.ts +0 -91
- package/src/type/REAME.md +0 -2
- package/src/type/distributive-omit.interface.ts +0 -4
- package/src/type/index.ts +0 -3
- package/src/type/object-key-paths.interface.ts +0 -40
- package/src/undo-redo-stack/README.md +0 -61
- package/src/undo-redo-stack/action-stack.test.ts +0 -330
- package/src/undo-redo-stack/action-stack.ts +0 -150
- package/src/undo-redo-stack/element.ts +0 -4
- package/src/undo-redo-stack/index.ts +0 -7
- package/src/undo-redo-stack/state-stack.test.ts +0 -118
- package/src/undo-redo-stack/state-stack.ts +0 -133
- package/src/uuid/index.ts +0 -7
- package/src/uuid/uuid.ts +0 -86
- package/src/worker/cors-worker.ts +0 -38
- package/src/worker/index.ts +0 -4
- package/src/worker/node_modules/.vitest/results.json +0 -1
- package/src/worker/promise-worker-main-thread.test.ts +0 -91
- package/src/worker/promise-worker-main-thread.ts +0 -76
- package/src/worker/promise-worker-worker-thread.ts +0 -64
- package/src/worker/promise-worker.interface.ts +0 -15
|
@@ -1,537 +0,0 @@
|
|
|
1
|
-
import { SharedMutex } from './shared-mutex';
|
|
2
|
-
|
|
3
|
-
class Foo {
|
|
4
|
-
private readonly _mutex: SharedMutex = new SharedMutex();
|
|
5
|
-
private _value = 0;
|
|
6
|
-
private _getCounter = 0;
|
|
7
|
-
|
|
8
|
-
get value() {
|
|
9
|
-
return this._value;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
get getCounter() {
|
|
13
|
-
return this._getCounter;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async add(val: number) {
|
|
17
|
-
await this._mutex.lock();
|
|
18
|
-
this._value += val;
|
|
19
|
-
setTimeout(() => {
|
|
20
|
-
this._mutex.unLock();
|
|
21
|
-
}, 50);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async subtract(val: number) {
|
|
25
|
-
await this._mutex.lock();
|
|
26
|
-
this._value -= val;
|
|
27
|
-
setTimeout(() => {
|
|
28
|
-
this._mutex.unLock();
|
|
29
|
-
}, 50);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async getValue(ms: number) {
|
|
33
|
-
await this._mutex.lockShared();
|
|
34
|
-
try {
|
|
35
|
-
this._getCounter++;
|
|
36
|
-
return this._value;
|
|
37
|
-
} finally {
|
|
38
|
-
setTimeout(() => {
|
|
39
|
-
this._mutex.unLockShared();
|
|
40
|
-
}, ms);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
describe('SharedMutex used', () => {
|
|
46
|
-
beforeEach(() => {
|
|
47
|
-
vi.useFakeTimers();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// 竞争写锁
|
|
51
|
-
it('lock', async () => {
|
|
52
|
-
const foo = new Foo();
|
|
53
|
-
|
|
54
|
-
foo.add(10);
|
|
55
|
-
foo.subtract(10);
|
|
56
|
-
foo.subtract(10);
|
|
57
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
58
|
-
vi.advanceTimersByTime(1);
|
|
59
|
-
await Promise.resolve();
|
|
60
|
-
|
|
61
|
-
expect(foo.value).toBe(10);
|
|
62
|
-
|
|
63
|
-
vi.advanceTimersByTime(50);
|
|
64
|
-
await Promise.resolve();
|
|
65
|
-
expect(foo.value).toBe(0);
|
|
66
|
-
|
|
67
|
-
vi.advanceTimersByTime(50);
|
|
68
|
-
await Promise.resolve();
|
|
69
|
-
expect(foo.value).toBe(-10);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// 读锁共享
|
|
73
|
-
it('sharedLock', async () => {
|
|
74
|
-
const foo = new Foo();
|
|
75
|
-
foo.getValue(50);
|
|
76
|
-
foo.getValue(50);
|
|
77
|
-
foo.getValue(50);
|
|
78
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
79
|
-
vi.advanceTimersByTime(1);
|
|
80
|
-
await Promise.resolve();
|
|
81
|
-
|
|
82
|
-
expect(foo.getCounter).toBe(3);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
// 先上读锁,写锁等待
|
|
86
|
-
it('shared before, exclusive after1', async () => {
|
|
87
|
-
const result: number[] = [];
|
|
88
|
-
const foo = new Foo();
|
|
89
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
90
|
-
foo.add(10);
|
|
91
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
92
|
-
vi.advanceTimersByTime(1);
|
|
93
|
-
await Promise.resolve();
|
|
94
|
-
await Promise.resolve();
|
|
95
|
-
|
|
96
|
-
expect(foo.getCounter).toBe(1);
|
|
97
|
-
expect(result.length).toBe(1);
|
|
98
|
-
expect(result[0]).toBe(0);
|
|
99
|
-
|
|
100
|
-
vi.advanceTimersByTime(50);
|
|
101
|
-
await Promise.resolve();
|
|
102
|
-
// 写者成功执行
|
|
103
|
-
expect(foo.value).toBe(10);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// 多个读锁,写锁等待
|
|
107
|
-
it('shared before, exclusive after2', async () => {
|
|
108
|
-
const result: number[] = [];
|
|
109
|
-
const foo = new Foo();
|
|
110
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
111
|
-
foo.getValue(100).then((v) => result.push(v));
|
|
112
|
-
foo.add(10);
|
|
113
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
114
|
-
vi.advanceTimersByTime(1);
|
|
115
|
-
await Promise.resolve();
|
|
116
|
-
await Promise.resolve();
|
|
117
|
-
await Promise.resolve();
|
|
118
|
-
|
|
119
|
-
expect(foo.getCounter).toBe(2);
|
|
120
|
-
expect(result.length).toBe(2);
|
|
121
|
-
expect(result[0]).toBe(0);
|
|
122
|
-
expect(result[1]).toBe(0);
|
|
123
|
-
|
|
124
|
-
vi.advanceTimersByTime(50);
|
|
125
|
-
await Promise.resolve();
|
|
126
|
-
// 有一个读锁还没有释放
|
|
127
|
-
expect(foo.value).toBe(0);
|
|
128
|
-
|
|
129
|
-
vi.advanceTimersByTime(50);
|
|
130
|
-
await Promise.resolve();
|
|
131
|
-
// 写者成功执行
|
|
132
|
-
expect(foo.value).toBe(10);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
// 先上读锁,多个写锁等待
|
|
136
|
-
it('shared before, exclusive after3', async () => {
|
|
137
|
-
const result: number[] = [];
|
|
138
|
-
const foo = new Foo();
|
|
139
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
140
|
-
foo.add(10);
|
|
141
|
-
foo.add(20);
|
|
142
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
143
|
-
vi.advanceTimersByTime(1);
|
|
144
|
-
await Promise.resolve();
|
|
145
|
-
await Promise.resolve();
|
|
146
|
-
|
|
147
|
-
expect(foo.getCounter).toBe(1);
|
|
148
|
-
expect(result.length).toBe(1);
|
|
149
|
-
expect(result[0]).toBe(0);
|
|
150
|
-
|
|
151
|
-
vi.advanceTimersByTime(50);
|
|
152
|
-
await Promise.resolve();
|
|
153
|
-
// 第一个写者执行完毕
|
|
154
|
-
expect(foo.value).toBe(10);
|
|
155
|
-
|
|
156
|
-
vi.advanceTimersByTime(50);
|
|
157
|
-
await Promise.resolve();
|
|
158
|
-
// 第二个写者执行完毕
|
|
159
|
-
expect(foo.value).toBe(30);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// 先上写锁,再上读锁
|
|
163
|
-
it('exclusive before, shared after1', async () => {
|
|
164
|
-
const result: number[] = [];
|
|
165
|
-
const foo = new Foo();
|
|
166
|
-
foo.add(10);
|
|
167
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
168
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
169
|
-
vi.advanceTimersByTime(1);
|
|
170
|
-
await Promise.resolve();
|
|
171
|
-
|
|
172
|
-
expect(foo.getCounter).toBe(0);
|
|
173
|
-
expect(foo.value).toBe(10);
|
|
174
|
-
expect(result.length).toBe(0);
|
|
175
|
-
|
|
176
|
-
vi.advanceTimersByTime(50);
|
|
177
|
-
await Promise.resolve();
|
|
178
|
-
await Promise.resolve();
|
|
179
|
-
expect(foo.getCounter).toBe(1);
|
|
180
|
-
expect(result.length).toBe(1);
|
|
181
|
-
expect(result[0]).toBe(10);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
// 多个写锁在前,读锁在后
|
|
185
|
-
it('exclusive before, shared after2', async () => {
|
|
186
|
-
const result: number[] = [];
|
|
187
|
-
const foo = new Foo();
|
|
188
|
-
foo.add(10);
|
|
189
|
-
foo.add(15);
|
|
190
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
191
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
192
|
-
vi.advanceTimersByTime(1);
|
|
193
|
-
await Promise.resolve();
|
|
194
|
-
|
|
195
|
-
expect(foo.getCounter).toBe(0);
|
|
196
|
-
expect(foo.value).toBe(10);
|
|
197
|
-
expect(result.length).toBe(0);
|
|
198
|
-
|
|
199
|
-
vi.advanceTimersByTime(50);
|
|
200
|
-
await Promise.resolve();
|
|
201
|
-
expect(foo.getCounter).toBe(0);
|
|
202
|
-
expect(foo.value).toBe(25);
|
|
203
|
-
expect(result.length).toBe(0);
|
|
204
|
-
|
|
205
|
-
vi.advanceTimersByTime(50);
|
|
206
|
-
await Promise.resolve();
|
|
207
|
-
await Promise.resolve();
|
|
208
|
-
expect(foo.getCounter).toBe(1);
|
|
209
|
-
expect(result.length).toBe(1);
|
|
210
|
-
expect(result[0]).toBe(25);
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
// 写锁在前,多个读锁在后
|
|
214
|
-
it('exclusive before, shared after3', async () => {
|
|
215
|
-
const result: number[] = [];
|
|
216
|
-
const foo = new Foo();
|
|
217
|
-
foo.add(15);
|
|
218
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
219
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
220
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
221
|
-
vi.advanceTimersByTime(1);
|
|
222
|
-
await Promise.resolve();
|
|
223
|
-
|
|
224
|
-
expect(foo.getCounter).toBe(0);
|
|
225
|
-
expect(foo.value).toBe(15);
|
|
226
|
-
expect(result.length).toBe(0);
|
|
227
|
-
|
|
228
|
-
vi.advanceTimersByTime(50);
|
|
229
|
-
await Promise.resolve();
|
|
230
|
-
await Promise.resolve();
|
|
231
|
-
await Promise.resolve();
|
|
232
|
-
expect(foo.getCounter).toBe(2);
|
|
233
|
-
expect(result.length).toBe(2);
|
|
234
|
-
expect(result[0]).toBe(15);
|
|
235
|
-
expect(result[1]).toBe(15);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
// 写者优先,写者优先级比读者搞
|
|
239
|
-
it('exclusive first1', async () => {
|
|
240
|
-
const result: number[] = [];
|
|
241
|
-
const foo = new Foo();
|
|
242
|
-
foo.add(15);
|
|
243
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
244
|
-
foo.add(15);
|
|
245
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
246
|
-
vi.advanceTimersByTime(1);
|
|
247
|
-
await Promise.resolve();
|
|
248
|
-
|
|
249
|
-
expect(foo.value).toBe(15);
|
|
250
|
-
expect(result.length).toBe(0);
|
|
251
|
-
|
|
252
|
-
vi.advanceTimersByTime(50);
|
|
253
|
-
await Promise.resolve();
|
|
254
|
-
// 虽然读者先等待,但是写者优先
|
|
255
|
-
expect(foo.getCounter).toBe(0);
|
|
256
|
-
expect(foo.value).toBe(30);
|
|
257
|
-
expect(result.length).toBe(0);
|
|
258
|
-
|
|
259
|
-
vi.advanceTimersByTime(50);
|
|
260
|
-
await Promise.resolve();
|
|
261
|
-
await Promise.resolve();
|
|
262
|
-
// 最后读者可以正常触发
|
|
263
|
-
expect(foo.getCounter).toBe(1);
|
|
264
|
-
expect(result.length).toBe(1);
|
|
265
|
-
expect(result[0]).toBe(30);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
// 写者优先,穿插读者最后一起获取锁
|
|
269
|
-
it('exclusive first2', async () => {
|
|
270
|
-
const result: number[] = [];
|
|
271
|
-
const foo = new Foo();
|
|
272
|
-
foo.add(15);
|
|
273
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
274
|
-
foo.add(15);
|
|
275
|
-
foo.getValue(50).then((v) => result.push(v));
|
|
276
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
277
|
-
vi.advanceTimersByTime(1);
|
|
278
|
-
await Promise.resolve();
|
|
279
|
-
|
|
280
|
-
expect(foo.value).toBe(15);
|
|
281
|
-
expect(result.length).toBe(0);
|
|
282
|
-
|
|
283
|
-
vi.advanceTimersByTime(50);
|
|
284
|
-
await Promise.resolve();
|
|
285
|
-
// 虽然读者先等待,但是写者优先
|
|
286
|
-
expect(foo.getCounter).toBe(0);
|
|
287
|
-
expect(foo.value).toBe(30);
|
|
288
|
-
expect(result.length).toBe(0);
|
|
289
|
-
|
|
290
|
-
vi.advanceTimersByTime(50);
|
|
291
|
-
await Promise.resolve();
|
|
292
|
-
await Promise.resolve();
|
|
293
|
-
await Promise.resolve();
|
|
294
|
-
// 最后读者可以正常触发
|
|
295
|
-
expect(foo.getCounter).toBe(2);
|
|
296
|
-
expect(result.length).toBe(2);
|
|
297
|
-
expect(result[0]).toBe(30);
|
|
298
|
-
expect(result[1]).toBe(30);
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
// 写者-读者-写者-读者
|
|
302
|
-
it('exclusive first3', async () => {
|
|
303
|
-
const result: number[] = [];
|
|
304
|
-
const foo = new Foo();
|
|
305
|
-
// 第一轮的处理
|
|
306
|
-
foo.add(15);
|
|
307
|
-
foo.getValue(10).then((v) => result.push(v));
|
|
308
|
-
|
|
309
|
-
vi.advanceTimersByTime(50);
|
|
310
|
-
await Promise.resolve();
|
|
311
|
-
vi.advanceTimersByTime(50);
|
|
312
|
-
await Promise.resolve();
|
|
313
|
-
await Promise.resolve();
|
|
314
|
-
|
|
315
|
-
expect(foo.value).toBe(15);
|
|
316
|
-
expect(result.length).toBe(1);
|
|
317
|
-
|
|
318
|
-
// 第二轮的处理
|
|
319
|
-
foo.add(15);
|
|
320
|
-
foo.getValue(10).then((v) => result.push(v));
|
|
321
|
-
|
|
322
|
-
vi.advanceTimersByTime(50);
|
|
323
|
-
await Promise.resolve();
|
|
324
|
-
vi.advanceTimersByTime(50);
|
|
325
|
-
await Promise.resolve();
|
|
326
|
-
await Promise.resolve();
|
|
327
|
-
|
|
328
|
-
expect(foo.value).toBe(30);
|
|
329
|
-
expect(result.length).toBe(2);
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
// 读者-写者-读者-写者
|
|
333
|
-
it('exclusive first4', async () => {
|
|
334
|
-
const result: number[] = [];
|
|
335
|
-
const foo = new Foo();
|
|
336
|
-
// 第一轮的处理
|
|
337
|
-
foo.getValue(10).then((v) => result.push(v));
|
|
338
|
-
foo.add(15);
|
|
339
|
-
|
|
340
|
-
vi.advanceTimersByTime(50);
|
|
341
|
-
await Promise.resolve();
|
|
342
|
-
await Promise.resolve();
|
|
343
|
-
vi.advanceTimersByTime(50);
|
|
344
|
-
await Promise.resolve();
|
|
345
|
-
|
|
346
|
-
expect(foo.value).toBe(15);
|
|
347
|
-
expect(result.length).toBe(1);
|
|
348
|
-
|
|
349
|
-
// 第二轮的处理
|
|
350
|
-
foo.getValue(10).then((v) => result.push(v));
|
|
351
|
-
foo.add(15);
|
|
352
|
-
|
|
353
|
-
vi.advanceTimersByTime(50);
|
|
354
|
-
await Promise.resolve();
|
|
355
|
-
vi.advanceTimersByTime(50);
|
|
356
|
-
await Promise.resolve();
|
|
357
|
-
await Promise.resolve();
|
|
358
|
-
|
|
359
|
-
expect(foo.value).toBe(30);
|
|
360
|
-
expect(result.length).toBe(2);
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
// 极端场景没有报错
|
|
364
|
-
it('lvAsset success', () => {
|
|
365
|
-
const sharedMutex = new SharedMutex();
|
|
366
|
-
sharedMutex.lock();
|
|
367
|
-
sharedMutex.lock();
|
|
368
|
-
sharedMutex.unLock();
|
|
369
|
-
sharedMutex.lock();
|
|
370
|
-
|
|
371
|
-
expect(true).toBe(true);
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
it('lvAsset success2', () => {
|
|
375
|
-
const sharedMutex = new SharedMutex();
|
|
376
|
-
sharedMutex.lockShared();
|
|
377
|
-
sharedMutex.lock();
|
|
378
|
-
sharedMutex.unLockShared();
|
|
379
|
-
sharedMutex.unLock();
|
|
380
|
-
expect(true).toBe(true);
|
|
381
|
-
|
|
382
|
-
sharedMutex.lockShared();
|
|
383
|
-
sharedMutex.unLockShared();
|
|
384
|
-
expect(true).toBe(true);
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
describe('SharedMutex self', () => {
|
|
389
|
-
beforeEach(() => {
|
|
390
|
-
vi.useFakeTimers();
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
// 写者等待,锁释放的同步任务,后面插入了写者
|
|
394
|
-
// 前写者为大
|
|
395
|
-
it('sync unlock1', async () => {
|
|
396
|
-
const result: number[] = [];
|
|
397
|
-
const sharedMutex = new SharedMutex();
|
|
398
|
-
sharedMutex.lock().then(() => {
|
|
399
|
-
result.push(0);
|
|
400
|
-
});
|
|
401
|
-
sharedMutex.lock().then(() => {
|
|
402
|
-
result.push(1);
|
|
403
|
-
});
|
|
404
|
-
sharedMutex.unLock();
|
|
405
|
-
sharedMutex.lock().then(() => {
|
|
406
|
-
result.push(2);
|
|
407
|
-
});
|
|
408
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
409
|
-
vi.advanceTimersByTime(1);
|
|
410
|
-
await Promise.resolve();
|
|
411
|
-
// 只释放了一次,前写者为大
|
|
412
|
-
expect(result.length).toBe(2);
|
|
413
|
-
expect(result[0]).toBe(0);
|
|
414
|
-
expect(result[1]).toBe(1);
|
|
415
|
-
sharedMutex.unLock();
|
|
416
|
-
// 涉及异步
|
|
417
|
-
await Promise.resolve();
|
|
418
|
-
expect(result.length).toBe(3);
|
|
419
|
-
expect(result[2]).toBe(2);
|
|
420
|
-
});
|
|
421
|
-
|
|
422
|
-
// 读者等待,锁释放的同步任务,后面插入了写者
|
|
423
|
-
// 前读者为大
|
|
424
|
-
it('sync unlock2', async () => {
|
|
425
|
-
const result: number[] = [];
|
|
426
|
-
const sharedMutex = new SharedMutex();
|
|
427
|
-
sharedMutex.lock().then(() => {
|
|
428
|
-
result.push(0);
|
|
429
|
-
});
|
|
430
|
-
sharedMutex.lockShared().then(() => {
|
|
431
|
-
result.push(1);
|
|
432
|
-
});
|
|
433
|
-
sharedMutex.unLock();
|
|
434
|
-
sharedMutex.lock().then(() => {
|
|
435
|
-
result.push(2);
|
|
436
|
-
});
|
|
437
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
438
|
-
vi.advanceTimersByTime(1);
|
|
439
|
-
await Promise.resolve();
|
|
440
|
-
// 只释放了一次,读者为大
|
|
441
|
-
expect(result.length).toBe(2);
|
|
442
|
-
expect(result[0]).toBe(0);
|
|
443
|
-
expect(result[1]).toBe(1);
|
|
444
|
-
sharedMutex.unLockShared();
|
|
445
|
-
// 涉及异步
|
|
446
|
-
await Promise.resolve();
|
|
447
|
-
expect(result.length).toBe(3);
|
|
448
|
-
expect(result[2]).toBe(2);
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
it('tryLock', async () => {
|
|
452
|
-
const result: number[] = [];
|
|
453
|
-
const sharedMutex = new SharedMutex();
|
|
454
|
-
sharedMutex.lock();
|
|
455
|
-
// tryLock失败
|
|
456
|
-
expect(sharedMutex.tryLock()).toBeFalsy();
|
|
457
|
-
sharedMutex.unLock();
|
|
458
|
-
// tryLock成功
|
|
459
|
-
expect(sharedMutex.tryLock()).toBeTruthy();
|
|
460
|
-
// 再次tryLock失败
|
|
461
|
-
expect(sharedMutex.tryLock()).toBeFalsy();
|
|
462
|
-
sharedMutex.lock().then(() => {
|
|
463
|
-
result.push(0);
|
|
464
|
-
});
|
|
465
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
466
|
-
vi.advanceTimersByTime(1);
|
|
467
|
-
await Promise.resolve();
|
|
468
|
-
// tryLock先拿到了锁
|
|
469
|
-
expect(result.length).toBe(0);
|
|
470
|
-
// 释放了tryLock的锁
|
|
471
|
-
sharedMutex.unLock();
|
|
472
|
-
// 涉及异步
|
|
473
|
-
await Promise.resolve();
|
|
474
|
-
expect(result.length).toBe(1);
|
|
475
|
-
expect(result[0]).toBe(0);
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
it('tryLockShared', async () => {
|
|
479
|
-
const result: number[] = [];
|
|
480
|
-
const sharedMutex = new SharedMutex();
|
|
481
|
-
sharedMutex.lock();
|
|
482
|
-
// tryLockShared失败
|
|
483
|
-
expect(sharedMutex.tryLockShared()).toBeFalsy();
|
|
484
|
-
sharedMutex.unLock();
|
|
485
|
-
// tryLockShared成功
|
|
486
|
-
expect(sharedMutex.tryLockShared()).toBeTruthy();
|
|
487
|
-
// 再次tryLockShared成功
|
|
488
|
-
expect(sharedMutex.tryLockShared()).toBeTruthy();
|
|
489
|
-
// tryLock失败
|
|
490
|
-
expect(sharedMutex.tryLock()).toBeFalsy();
|
|
491
|
-
sharedMutex.lockShared().then(() => {
|
|
492
|
-
result.push(0);
|
|
493
|
-
});
|
|
494
|
-
sharedMutex.lock().then(() => {
|
|
495
|
-
result.push(1);
|
|
496
|
-
});
|
|
497
|
-
// 涉及到拿锁,是异步的,所以wait一下
|
|
498
|
-
vi.advanceTimersByTime(1);
|
|
499
|
-
await Promise.resolve();
|
|
500
|
-
// 读锁共享
|
|
501
|
-
expect(result.length).toBe(1);
|
|
502
|
-
expect(result[0]).toBe(0);
|
|
503
|
-
// 释放了tryLockShared的锁
|
|
504
|
-
sharedMutex.unLockShared();
|
|
505
|
-
sharedMutex.unLockShared();
|
|
506
|
-
sharedMutex.unLockShared();
|
|
507
|
-
// 此时tryLockShared失败,写者已经进入第一道门了
|
|
508
|
-
expect(sharedMutex.tryLockShared()).toBeFalsy();
|
|
509
|
-
// 涉及异步
|
|
510
|
-
await Promise.resolve();
|
|
511
|
-
expect(result.length).toBe(2);
|
|
512
|
-
expect(result[1]).toBe(1);
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
// 连续两次 读-写-读 穿插场景
|
|
516
|
-
it('real scene1', async () => {
|
|
517
|
-
const sharedMutex = new SharedMutex();
|
|
518
|
-
sharedMutex.lockShared().then(() => sharedMutex.unLockShared());
|
|
519
|
-
sharedMutex.lock().then(() => sharedMutex.unLock());
|
|
520
|
-
sharedMutex.lockShared().then(() => sharedMutex.unLockShared());
|
|
521
|
-
sharedMutex.lockShared().then(() => sharedMutex.unLockShared());
|
|
522
|
-
vi.advanceTimersByTime(1);
|
|
523
|
-
await Promise.resolve();
|
|
524
|
-
await Promise.resolve();
|
|
525
|
-
await Promise.resolve();
|
|
526
|
-
sharedMutex.lockShared().then(() => sharedMutex.unLockShared());
|
|
527
|
-
sharedMutex.lock().then(() => sharedMutex.unLock());
|
|
528
|
-
sharedMutex.lockShared().then(() => sharedMutex.unLockShared());
|
|
529
|
-
sharedMutex.lockShared().then(() => sharedMutex.unLockShared());
|
|
530
|
-
vi.advanceTimersByTime(1);
|
|
531
|
-
await Promise.resolve();
|
|
532
|
-
await Promise.resolve();
|
|
533
|
-
await Promise.resolve();
|
|
534
|
-
// 读锁共享
|
|
535
|
-
expect(sharedMutex.isLocked()).toBeFalsy();
|
|
536
|
-
});
|
|
537
|
-
});
|