
%% five clients, 1 server thread

:-object server.

	var data = 0.

	server(N) :-
		format('~w server running (data=~w) ...~n', [this, data]),
		server_loop(N).

	server_loop(0).
	server_loop(I) :-
		accept(rendez_vous(_)),
		N is I - 1,
		server_loop(N).

	rendez_vous(C) :-
		delay(10),	%% force a DLP thread context switch,
		%% otherwise clients will terminate each after another.
		format('rendez_vous: accepting call from ~w~n', [C]).

:-end_object server.


:-object client.

	var qw = 1, er = 2, ty = 3.

	client(N,S) :-
		format('~w client running (qw=~w) ...~n', [this,qw]),
		client_loop(N,S).

	set_data(D) :-
		qw := D,
		format('~w data set ~w ...~n', [this,qw]),
		true.
	get_data(D) :-
		D := qw,
		format('~w data get ~w ...~n', [this,qw]),
		true.

	client_loop(0,_).
	client_loop(I,S) :-
		S <- rendez_vous(this),
		N is I - 1,
		client_loop(N,S).

:-end_object client.


:-object pxfive.

main :-
	S0 := new(server(20)),

	client <- set_data(22),
	C1 := new(client(4,S0)),
	client <- set_data(33),
	C2 := new(client(4,S0)),
	client <- set_data(44),
	C3 := new(client(4,S0)),
	client <- set_data(55),
	C4 := new(client(4,S0)),
	client <- set_data(66),
	C5 := new(client(4,S0)).

:-end_object pxfive.

