Skip to content

Commit 19e5a4e

Browse files
committed
changed scheduler.async to scheduler.run. refactored gen_server
1 parent 58a8c96 commit 19e5a4e

File tree

3 files changed

+45
-21
lines changed

3 files changed

+45
-21
lines changed

src/processes/otp/gen_server.js

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,42 @@ function start_process(module, args){
1111
let [ok, state] = module.init.apply(null, [args]);
1212
yield self.scheduler.put("state", state);
1313

14-
while(true){
15-
yield self.scheduler.receive(function(args){
16-
if(args[0] === "call"){
17-
let result = module.handle_call(args[1], args[2], self.scheduler.get("state"));
18-
self.scheduler.put("state", result[2]);
14+
try{
15+
while(true){
16+
yield self.scheduler.receive(function(args){
17+
let command = args[0];
1918

20-
self.scheduler.send(args[2], result[1]);
19+
switch(command){
20+
case "call":
21+
var request = args[1];
22+
var sender = args[2];
2123

22-
}else if(args[0] === "cast"){
23-
let result = module.handle_cast(args[1], self.scheduler.get("state"));
24-
self.scheduler.put("state", result[1]);
24+
var [reply, response, new_state] = module.handle_call(request, sender, self.scheduler.get("state"));
25+
self.scheduler.put("state", new_state);
2526

26-
self.scheduler.send(args[2], Symbol.for("ok"));
27+
self.scheduler.send(sender, response);
28+
break;
2729

28-
}
29-
});
30+
case "cast":
31+
var request = args[1];
32+
var sender = args[2];
33+
34+
var [reply, new_state] = module.handle_cast(request, self.scheduler.get("state"));
35+
36+
self.scheduler.put("state", new_state);
37+
self.scheduler.send(args[2], Symbol.for("ok"));
38+
39+
break;
40+
41+
case "stop":
42+
throw "stop";
43+
}
44+
});
45+
}
46+
}catch(e){
47+
if(e !== "stop"){
48+
throw e;
49+
}
3050
}
3151
}
3252
}
@@ -47,4 +67,8 @@ function* cast(server, request){
4767
});
4868
}
4969

50-
export default { start, start_link, call, cast };
70+
function stop(server, request){
71+
self.scheduler.send(server, ["stop"]);
72+
}
73+
74+
export default { start, start_link, call, cast, stop };

src/processes/scheduler.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class Scheduler {
2828
});
2929
}
3030

31-
static * async(fun, args, context = null){
31+
static * run(fun, args, context = null){
3232
if(fun.constructor.name === "GeneratorFunction"){
3333
return yield* fun.apply(context, args);
3434
}else{
@@ -53,14 +53,14 @@ class Scheduler {
5353
spawn_link(...args){
5454
if(args.length === 1){
5555
let fun = args[0];
56-
return this.add_proc(fun, [], false).pid;
56+
return this.add_proc(fun, [], true).pid;
5757

5858
}else if(args.length === 3){
5959
let mod = args[0];
6060
let fun = args[1];
6161
let the_args = args[2];
6262

63-
return this.add_proc(mod[fun], the_args, false).pid;
63+
return this.add_proc(mod[fun], the_args, true).pid;
6464
}
6565
}
6666

@@ -93,7 +93,7 @@ class Scheduler {
9393
this.links.set(newpid, new Set());
9494

9595
if(linked){
96-
link(newpid);
96+
this.link(newpid);
9797
}
9898

9999
newproc.start();

test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ const Stack = {
1919
}
2020

2121
self.scheduler.spawn(function*(){
22-
const [ok, pid] = yield* Scheduler.async(GenServer.start, [Stack, ["hello"]]);
22+
const [ok, pid] = yield* Scheduler.run(GenServer.start, [Stack, ["hello"]]);
2323

24-
let a = yield* Scheduler.async(GenServer.call, [pid, "pop"]);
24+
let a = yield* Scheduler.run(GenServer.call, [pid, "pop"]);
2525
console.log(a);
2626

27-
let b = yield* Scheduler.async(GenServer.cast, [pid, ["push", "world"]]);
27+
let b = yield* Scheduler.run(GenServer.cast, [pid, ["push", "world"]]);
2828
console.log(b);
2929

30-
let c = yield* Scheduler.async(GenServer.call, [pid, "pop"]);
30+
let c = yield* Scheduler.run(GenServer.call, [pid, "pop"]);
3131
console.log(c);
3232
});
3333

0 commit comments

Comments
 (0)