v / examples / pendulum-simulation
Raw file | 56 loc (43 sloc) | 1.29 KB | Latest commit hash e81e0ac70
1module main
2
3import benchmark
4import sim
5import sim.anim
6import sim.args as simargs
7import sim.img
8
9fn main() {
10 args := simargs.parse_args(extra_workers: 2)! as simargs.ParallelArgs
11
12 img_settings := img.image_settings_from_grid(args.grid)
13
14 mut writer := img.ppm_writer_for_fname(args.filename, img_settings)!
15
16 mut app := anim.new_app(args)
17 mut workers := []thread{cap: args.workers + 1}
18
19 mut bmark := benchmark.start()
20
21 img_result_chan := chan &sim.SimResult{cap: args.workers}
22
23 defer {
24 image_worker := workers.pop()
25 app.request_chan.close()
26 sim.log('Waiting for workers to finish')
27 workers.wait()
28 app.result_chan.close()
29 img_result_chan.close()
30 sim.log('Waiting for image writer to finish')
31 image_worker.wait()
32 sim.log('Workers finished!')
33 bmark.measure(@FN)
34 sim.log('Closing writer file')
35 writer.close()
36 sim.log('Done!')
37 }
38
39 // start a worker on each core
40 for id in 0 .. app.args.workers {
41 workers << spawn sim.sim_worker(id, app.request_chan, [app.result_chan, img_result_chan])
42 }
43
44 handle_request := fn [app] (request &sim.SimRequest) ! {
45 app.request_chan <- request
46 }
47
48 workers << spawn img.image_worker(mut writer, img_result_chan, img_settings)
49
50 spawn app.gg.run()
51
52 sim.run(app.args.params,
53 grid: app.args.grid
54 on_request: sim.SimRequestHandler(handle_request)
55 )
56}