1 | % (c) 2011-2021 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, | |
2 | % Heinrich Heine Universitaet Duesseldorf | |
3 | % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) | |
4 | ||
5 | :- module(zmq, [init_zmq/0, | |
6 | master_main/10, alloc_term/3, | |
7 | setup_worker/5, work_reactor/1, teardown_worker/0, | |
8 | new_results_message/1, start_timer/0, stop_timer/0, | |
9 | msg_put_str/2, put_succ/4, add_stats/1, send_and_destroy_msg/1]). | |
10 | ||
11 | :- use_module(probsrc(module_information)). | |
12 | :- module_info(group,zmq). | |
13 | :- module_info(description,'This is the interface to C code for distributed model checking.'). | |
14 | ||
15 | foreign_resource('zmq', [master_main, alloc_term, | |
16 | setup_worker, work_reactor, teardown_worker, | |
17 | new_results_message, | |
18 | start_timer, stop_timer, | |
19 | msg_put_str, put_succ, | |
20 | add_stats, send_and_destroy_msg]). | |
21 | ||
22 | % master functions | |
23 | foreign(master_main, c, master_main(+integer,+integer,+integer,+address(zchunk_t),+address(zchunk_t),+string,+string,+string,+integer,[-integer])). | |
24 | foreign(alloc_term, c, alloc_term(+address(char), +integer, [-address(zchunk_t)])). | |
25 | ||
26 | % worker functions | |
27 | foreign(setup_worker, c, setup_worker(+integer, +integer, +string, +string, +string)). | |
28 | foreign(work_reactor, c, work_reactor([-integer])). | |
29 | foreign(teardown_worker, c, teardown_worker). | |
30 | foreign(new_results_message, c, new_results_message([-address(zmsg_t)])). | |
31 | foreign(start_timer, c, start_timer). | |
32 | foreign(stop_timer, c, stop_timer). | |
33 | foreign(msg_put_str, c, msg_put_str(+address(zmsg_t), +string)). | |
34 | foreign(put_succ, c, put_succ(+address(zmsg_t), +address(char), +integer, +integer)). | |
35 | foreign(add_stats, c, add_stats(+address(zmsg_t))). | |
36 | foreign(send_and_destroy_msg, c, send_and_destroy_msg(+address(zmsg_t))). | |
37 | ||
38 | :- dynamic is_initialised/0. | |
39 | ||
40 | init_zmq :- is_initialised,!. | |
41 | init_zmq :- | |
42 | safe_load_foreign_resource(zmq), | |
43 | assertz(is_initialised). | |
44 | ||
45 | ||
46 | safe_load_foreign_resource(R) :- | |
47 | E=error(existence_error(_,_),_), | |
48 | % print(loading_foreign_resource(R)),nl, | |
49 | catch(load_foreign_resource(library(R)), E, ( | |
50 | format(user_error,'~n! Could not load ~w library!~n! Check that it is available in the lib folder of ProB.~n~n',[R]), | |
51 | throw(E) | |
52 | )). |