|
<html><head><title>dlib C++ Library - bsp.h</title></head><body bgcolor='white'><pre> |
|
<font color='#009900'>// Copyright (C) 2012 Davis E. King (davis@dlib.net) |
|
</font><font color='#009900'>// License: Boost Software License See LICENSE.txt for the full license. |
|
</font><font color='#0000FF'>#ifndef</font> DLIB_BsP_Hh_ |
|
<font color='#0000FF'>#define</font> DLIB_BsP_Hh_ |
|
|
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='bsp_abstract.h.html'>bsp_abstract.h</a>" |
|
|
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>memory<font color='#5555FF'>></font> |
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>queue<font color='#5555FF'>></font> |
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>vector<font color='#5555FF'>></font> |
|
|
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../sockets.h.html'>../sockets.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../array.h.html'>../array.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../sockstreambuf.h.html'>../sockstreambuf.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../string.h.html'>../string.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../serialize.h.html'>../serialize.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../map.h.html'>../map.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../ref.h.html'>../ref.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../vectorstream.h.html'>../vectorstream.h</a>" |
|
|
|
<font color='#0000FF'>namespace</font> dlib |
|
<b>{</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>namespace</font> impl1 |
|
<b>{</b> |
|
<font color='#0000FF'>inline</font> <font color='#0000FF'><u>void</u></font> <b><a name='null_notify'></a>null_notify</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> |
|
<font face='Lucida Console'>)</font> <b>{</b><b>}</b> |
|
|
|
<font color='#0000FF'>struct</font> <b><a name='bsp_con'></a>bsp_con</b> |
|
<b>{</b> |
|
<b><a name='bsp_con'></a>bsp_con</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> network_address<font color='#5555FF'>&</font> dest |
|
<font face='Lucida Console'>)</font> : |
|
con<font face='Lucida Console'>(</font>connect<font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>, |
|
buf<font face='Lucida Console'>(</font>con<font face='Lucida Console'>)</font>, |
|
stream<font face='Lucida Console'>(</font><font color='#5555FF'>&</font>buf<font face='Lucida Console'>)</font>, |
|
terminated<font face='Lucida Console'>(</font><font color='#979000'>false</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
con<font color='#5555FF'>-</font><font color='#5555FF'>></font><font color='#BB00BB'>disable_nagle</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<b><a name='bsp_con'></a>bsp_con</b><font face='Lucida Console'>(</font> |
|
std::unique_ptr<font color='#5555FF'><</font>connection<font color='#5555FF'>></font><font color='#5555FF'>&</font> conptr |
|
<font face='Lucida Console'>)</font> : |
|
buf<font face='Lucida Console'>(</font>conptr<font face='Lucida Console'>)</font>, |
|
stream<font face='Lucida Console'>(</font><font color='#5555FF'>&</font>buf<font face='Lucida Console'>)</font>, |
|
terminated<font face='Lucida Console'>(</font><font color='#979000'>false</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make sure we own the connection |
|
</font> conptr.<font color='#BB00BB'>swap</font><font face='Lucida Console'>(</font>con<font face='Lucida Console'>)</font>; |
|
|
|
con<font color='#5555FF'>-</font><font color='#5555FF'>></font><font color='#BB00BB'>disable_nagle</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
std::unique_ptr<font color='#5555FF'><</font>connection<font color='#5555FF'>></font> con; |
|
sockstreambuf buf; |
|
std::iostream stream; |
|
<font color='#0000FF'><u>bool</u></font> terminated; |
|
<b>}</b>; |
|
|
|
<font color='#0000FF'>typedef</font> dlib::map<font color='#5555FF'><</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font>, std::unique_ptr<font color='#5555FF'><</font>bsp_con<font color='#5555FF'>></font> <font color='#5555FF'>></font>::kernel_1a_c map_id_to_con; |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='connect_all'></a>connect_all</b> <font face='Lucida Console'>(</font> |
|
map_id_to_con<font color='#5555FF'>&</font> cons, |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
ensures |
|
- creates connections to all the given hosts and stores them into cons |
|
!*/</font> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='send_out_connection_orders'></a>send_out_connection_orders</b> <font face='Lucida Console'>(</font> |
|
map_id_to_con<font color='#5555FF'>&</font> cons, |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'>struct</font> <b><a name='hostinfo'></a>hostinfo</b> |
|
<b>{</b> |
|
<b><a name='hostinfo'></a>hostinfo</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b><b>}</b> |
|
<b><a name='hostinfo'></a>hostinfo</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> network_address<font color='#5555FF'>&</font> addr_, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id_ |
|
<font face='Lucida Console'>)</font> : |
|
addr<font face='Lucida Console'>(</font>addr_<font face='Lucida Console'>)</font>, |
|
node_id<font face='Lucida Console'>(</font>node_id_<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<b>}</b> |
|
|
|
network_address addr; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id; |
|
<b>}</b>; |
|
|
|
<font color='#0000FF'>inline</font> <font color='#0000FF'><u>void</u></font> <b><a name='serialize'></a>serialize</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> hostinfo<font color='#5555FF'>&</font> item, |
|
std::ostream<font color='#5555FF'>&</font> out |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
dlib::<font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>item.addr, out<font face='Lucida Console'>)</font>; |
|
dlib::<font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>item.node_id, out<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>inline</font> <font color='#0000FF'><u>void</u></font> <b><a name='deserialize'></a>deserialize</b> <font face='Lucida Console'>(</font> |
|
hostinfo<font color='#5555FF'>&</font> item, |
|
std::istream<font color='#5555FF'>&</font> in |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>item.addr, in<font face='Lucida Console'>)</font>; |
|
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>item.node_id, in<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='connect_all_hostinfo'></a>connect_all_hostinfo</b> <font face='Lucida Console'>(</font> |
|
map_id_to_con<font color='#5555FF'>&</font> cons, |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>hostinfo<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id, |
|
std::string<font color='#5555FF'>&</font> error_string |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='listen_and_connect_all'></a>listen_and_connect_all</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&</font> node_id, |
|
map_id_to_con<font color='#5555FF'>&</font> cons, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> port, |
|
port_notify_function_type port_notify_function |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
cons.<font color='#BB00BB'>clear</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
std::unique_ptr<font color='#5555FF'><</font>listener<font color='#5555FF'>></font> list; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> status <font color='#5555FF'>=</font> <font color='#BB00BB'>create_listener</font><font face='Lucida Console'>(</font>list, port<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>status <font color='#5555FF'>=</font><font color='#5555FF'>=</font> PORTINUSE<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>throw</font> <font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Unable to create listening port </font>" <font color='#5555FF'>+</font> <font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>port<font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> |
|
"<font color='#CC0000'>. The port is already in use</font>"<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>status <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>throw</font> <font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Unable to create listening port </font>" <font color='#5555FF'>+</font> <font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>port<font face='Lucida Console'>)</font> <font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#BB00BB'>port_notify_function</font><font face='Lucida Console'>(</font>list<font color='#5555FF'>-</font><font color='#5555FF'>></font><font color='#BB00BB'>get_listening_port</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
std::unique_ptr<font color='#5555FF'><</font>connection<font color='#5555FF'>></font> con; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>list<font color='#5555FF'>-</font><font color='#5555FF'>></font><font color='#BB00BB'>accept</font><font face='Lucida Console'>(</font>con<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>throw</font> <font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Error occurred while accepting new connection</font>"<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
std::unique_ptr<font color='#5555FF'><</font>bsp_con<font color='#5555FF'>></font> <font color='#BB00BB'>temp</font><font face='Lucida Console'>(</font><font color='#0000FF'>new</font> <font color='#BB00BB'>bsp_con</font><font face='Lucida Console'>(</font>con<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> remote_node_id; |
|
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>remote_node_id, temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>stream<font face='Lucida Console'>)</font>; |
|
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>node_id, temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>stream<font face='Lucida Console'>)</font>; |
|
std::vector<font color='#5555FF'><</font>hostinfo<font color='#5555FF'>></font> targets; |
|
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>targets, temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>stream<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_incoming_connections; |
|
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>num_incoming_connections, temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>stream<font face='Lucida Console'>)</font>; |
|
|
|
cons.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>remote_node_id,temp<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// make a thread that will connect to all the targets |
|
</font> map_id_to_con cons2; |
|
std::string error_string; |
|
thread_function <font color='#BB00BB'>thread</font><font face='Lucida Console'>(</font>connect_all_hostinfo, dlib::<font color='#BB00BB'>ref</font><font face='Lucida Console'>(</font>cons2<font face='Lucida Console'>)</font>, dlib::<font color='#BB00BB'>ref</font><font face='Lucida Console'>(</font>targets<font face='Lucida Console'>)</font>, node_id, dlib::<font color='#BB00BB'>ref</font><font face='Lucida Console'>(</font>error_string<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>error_string.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>throw</font> <font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>error_string<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// accept any incoming connections |
|
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'><</font> num_incoming_connections; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// If it takes more than 10 seconds for the other nodes to connect to us |
|
</font> <font color='#009900'>// then something has gone horribly wrong and it almost certainly will |
|
</font> <font color='#009900'>// never connect at all. So just give up if that happens. |
|
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> timeout_milliseconds <font color='#5555FF'>=</font> <font color='#979000'>10000</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>list<font color='#5555FF'>-</font><font color='#5555FF'>></font><font color='#BB00BB'>accept</font><font face='Lucida Console'>(</font>con, timeout_milliseconds<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>throw</font> <font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Error occurred while accepting new connection</font>"<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
temp.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font color='#0000FF'>new</font> <font color='#BB00BB'>bsp_con</font><font face='Lucida Console'>(</font>con<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>remote_node_id, temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>stream<font face='Lucida Console'>)</font>; |
|
cons.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>remote_node_id,temp<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
|
|
<font color='#009900'>// put all the connections created by the thread into cons |
|
</font> thread.<font color='#BB00BB'>wait</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>cons2.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>></font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> id; |
|
std::unique_ptr<font color='#5555FF'><</font>bsp_con<font color='#5555FF'>></font> temp; |
|
cons2.<font color='#BB00BB'>remove_any</font><font face='Lucida Console'>(</font>id,temp<font face='Lucida Console'>)</font>; |
|
cons.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>id,temp<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'>struct</font> <b><a name='msg_data'></a>msg_data</b> |
|
<b>{</b> |
|
std::shared_ptr<font color='#5555FF'><</font>std::vector<font color='#5555FF'><</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>></font> <font color='#5555FF'>></font> data; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> sender_id; |
|
<font color='#0000FF'><u>char</u></font> msg_type; |
|
dlib::uint64 epoch; |
|
|
|
<b><a name='msg_data'></a>msg_data</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> : sender_id<font face='Lucida Console'>(</font><font color='#979000'>0xFFFFFFFF</font><font face='Lucida Console'>)</font>, msg_type<font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>, epoch<font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b><b>}</b> |
|
|
|
std::string <b><a name='data_to_string'></a>data_to_string</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data <font color='#5555FF'>&</font><font color='#5555FF'>&</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font><font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> std::<font color='#BB00BB'>string</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>data<font face='Lucida Console'>)</font>[<font color='#979000'>0</font>], data<font color='#5555FF'>-</font><font color='#5555FF'>></font><font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>else</font> |
|
<font color='#0000FF'>return</font> "<font color='#CC0000'></font>"; |
|
<b>}</b> |
|
<b>}</b>; |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'>class</font> <b><a name='thread_safe_message_queue'></a>thread_safe_message_queue</b> : noncopyable |
|
<b>{</b> |
|
<font color='#009900'>/*! |
|
WHAT THIS OBJECT REPRESENTS |
|
This is a simple message queue for msg_data objects. Note that it |
|
has the special property that, while messages will generally leave |
|
the queue in the order they are inserted, any message with a smaller |
|
epoch value will always be popped out first. But for all messages |
|
with equal epoch values the queue functions as a normal FIFO queue. |
|
!*/</font> |
|
<font color='#0000FF'>private</font>: |
|
<font color='#0000FF'>struct</font> <b><a name='msg_wrap'></a>msg_wrap</b> |
|
<b>{</b> |
|
<b><a name='msg_wrap'></a>msg_wrap</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> msg_data<font color='#5555FF'>&</font> data_, |
|
<font color='#0000FF'>const</font> dlib::uint64<font color='#5555FF'>&</font> sequence_number_ |
|
<font face='Lucida Console'>)</font> : data<font face='Lucida Console'>(</font>data_<font face='Lucida Console'>)</font>, sequence_number<font face='Lucida Console'>(</font>sequence_number_<font face='Lucida Console'>)</font> <b>{</b><b>}</b> |
|
|
|
<b><a name='msg_wrap'></a>msg_wrap</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> : sequence_number<font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font><b>{</b><b>}</b> |
|
|
|
msg_data data; |
|
dlib::uint64 sequence_number; |
|
|
|
<font color='#009900'>// Make it so that when msg_wrap objects are in a std::priority_queue, |
|
</font> <font color='#009900'>// messages with a smaller epoch number always come first. Then, within an |
|
</font> <font color='#009900'>// epoch, messages are ordered by their sequence number (so smaller first |
|
</font> <font color='#009900'>// there as well). |
|
</font> <font color='#0000FF'><u>bool</u></font> <b><a name='operator'></a>operator</b><font color='#5555FF'><</font><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> msg_wrap<font color='#5555FF'>&</font> item<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data.epoch <font color='#5555FF'><</font> item.data.epoch<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data.epoch <font color='#5555FF'>></font> item.data.epoch<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sequence_number <font color='#5555FF'><</font> item.sequence_number<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<font color='#0000FF'>else</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<b>}</b> |
|
<b>}</b> |
|
<b>}</b>; |
|
|
|
<font color='#0000FF'>public</font>: |
|
<b><a name='thread_safe_message_queue'></a>thread_safe_message_queue</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> : sig<font face='Lucida Console'>(</font>class_mutex<font face='Lucida Console'>)</font>,disabled<font face='Lucida Console'>(</font><font color='#979000'>false</font><font face='Lucida Console'>)</font>,next_seq_num<font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <b>{</b><b>}</b> |
|
|
|
~<b><a name='thread_safe_message_queue'></a>thread_safe_message_queue</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='disable'></a>disable</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
auto_mutex <font color='#BB00BB'>lock</font><font face='Lucida Console'>(</font>class_mutex<font face='Lucida Console'>)</font>; |
|
disabled <font color='#5555FF'>=</font> <font color='#979000'>true</font>; |
|
sig.<font color='#BB00BB'>broadcast</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <b><a name='size'></a>size</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
auto_mutex <font color='#BB00BB'>lock</font><font face='Lucida Console'>(</font>class_mutex<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> data.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='push_and_consume'></a>push_and_consume</b><font face='Lucida Console'>(</font> msg_data<font color='#5555FF'>&</font> item<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
auto_mutex <font color='#BB00BB'>lock</font><font face='Lucida Console'>(</font>class_mutex<font face='Lucida Console'>)</font>; |
|
data.<font color='#BB00BB'>push</font><font face='Lucida Console'>(</font><font color='#BB00BB'>msg_wrap</font><font face='Lucida Console'>(</font>item, next_seq_num<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#009900'>// do this here so that we don't have to worry about different threads touching the shared_ptr. |
|
</font> item.data.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
sig.<font color='#BB00BB'>signal</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>bool</u></font> <b><a name='pop'></a>pop</b> <font face='Lucida Console'>(</font> |
|
msg_data<font color='#5555FF'>&</font> item |
|
<font face='Lucida Console'>)</font> |
|
<font color='#009900'>/*! |
|
ensures |
|
- if (this function returns true) then |
|
- #item == the next thing from the queue |
|
- else |
|
- this object is disabled |
|
!*/</font> |
|
<b>{</b> |
|
auto_mutex <font color='#BB00BB'>lock</font><font face='Lucida Console'>(</font>class_mutex<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>data.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font color='#5555FF'>!</font>disabled<font face='Lucida Console'>)</font> |
|
sig.<font color='#BB00BB'>wait</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>disabled<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
|
|
item <font color='#5555FF'>=</font> data.<font color='#BB00BB'>top</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.data; |
|
data.<font color='#BB00BB'>pop</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>bool</u></font> <b><a name='pop'></a>pop</b> <font face='Lucida Console'>(</font> |
|
msg_data<font color='#5555FF'>&</font> item, |
|
<font color='#0000FF'>const</font> dlib::uint64<font color='#5555FF'>&</font> max_epoch |
|
<font face='Lucida Console'>)</font> |
|
<font color='#009900'>/*! |
|
ensures |
|
- if (this function returns true) then |
|
- #item == the next thing from the queue that has an epoch <= max_epoch |
|
- else |
|
- this object is disabled |
|
!*/</font> |
|
<b>{</b> |
|
auto_mutex <font color='#BB00BB'>lock</font><font face='Lucida Console'>(</font>class_mutex<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>data.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> data.<font color='#BB00BB'>top</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.data.epoch <font color='#5555FF'>></font> max_epoch<font face='Lucida Console'>)</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font color='#5555FF'>!</font>disabled<font face='Lucida Console'>)</font> |
|
sig.<font color='#BB00BB'>wait</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>disabled<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
|
|
item <font color='#5555FF'>=</font> data.<font color='#BB00BB'>top</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.data; |
|
data.<font color='#BB00BB'>pop</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>private</font>: |
|
std::priority_queue<font color='#5555FF'><</font>msg_wrap<font color='#5555FF'>></font> data; |
|
dlib::mutex class_mutex; |
|
dlib::signaler sig; |
|
<font color='#0000FF'><u>bool</u></font> disabled; |
|
dlib::uint64 next_seq_num; |
|
<b>}</b>; |
|
|
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>class</font> <b><a name='bsp_context'></a>bsp_context</b> : noncopyable |
|
<b>{</b> |
|
|
|
<font color='#0000FF'>public</font>: |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='send'></a>send</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> T<font color='#5555FF'>&</font> item, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> target_node_id |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make sure requires clause is not broken |
|
</font> <font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>target_node_id <font color='#5555FF'><</font> <font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
target_node_id <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#BB00BB'>node_id</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, |
|
"<font color='#CC0000'>\t void bsp_context::send()</font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t Invalid arguments were given to this function.</font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t target_node_id: </font>" <font color='#5555FF'><</font><font color='#5555FF'><</font> target_node_id |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t node_id(): </font>" <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#BB00BB'>node_id</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t number_of_nodes(): </font>" <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t this: </font>" <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#0000FF'>this</font> |
|
<font face='Lucida Console'>)</font>; |
|
|
|
std::vector<font color='#5555FF'><</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>></font> buf; |
|
vectorstream <font color='#BB00BB'>sout</font><font face='Lucida Console'>(</font>buf<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>item, sout<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>send_data</font><font face='Lucida Console'>(</font>buf, target_node_id<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='broadcast'></a>broadcast</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> T<font color='#5555FF'>&</font> item |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
std::vector<font color='#5555FF'><</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>></font> buf; |
|
vectorstream <font color='#BB00BB'>sout</font><font face='Lucida Console'>(</font>buf<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>item, sout<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'><</font> <font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// Don't send to yourself. |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#BB00BB'>node_id</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>continue</font>; |
|
|
|
<font color='#BB00BB'>send_data</font><font face='Lucida Console'>(</font>buf, i<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <b><a name='node_id'></a>node_id</b> <font face='Lucida Console'>(</font> |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> _node_id; <b>}</b> |
|
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <b><a name='number_of_nodes'></a>number_of_nodes</b> <font face='Lucida Console'>(</font> |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> _cons.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>1</font>; <b>}</b> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='receive'></a>receive</b> <font face='Lucida Console'>(</font> |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> id; |
|
std::shared_ptr<font color='#5555FF'><</font>std::vector<font color='#5555FF'><</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>></font> <font color='#5555FF'>></font> temp; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>receive_data</font><font face='Lucida Console'>(</font>temp,id<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>throw</font> dlib::<font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Call to bsp_context::receive() got an unexpected message.</font>"<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='receive'></a>receive</b> <font face='Lucida Console'>(</font> |
|
T<font color='#5555FF'>&</font> item |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font><font face='Lucida Console'>(</font><font color='#5555FF'>!</font><font color='#BB00BB'>try_receive</font><font face='Lucida Console'>(</font>item<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>throw</font> dlib::<font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>bsp_context::receive(): no messages to receive, all nodes currently blocked.</font>"<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>bool</u></font> <b><a name='try_receive'></a>try_receive</b> <font face='Lucida Console'>(</font> |
|
T<font color='#5555FF'>&</font> item |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> sending_node_id; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>try_receive</font><font face='Lucida Console'>(</font>item, sending_node_id<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='receive'></a>receive</b> <font face='Lucida Console'>(</font> |
|
T<font color='#5555FF'>&</font> item, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&</font> sending_node_id |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font><font face='Lucida Console'>(</font><font color='#5555FF'>!</font><font color='#BB00BB'>try_receive</font><font face='Lucida Console'>(</font>item, sending_node_id<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>throw</font> dlib::<font color='#BB00BB'>socket_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>bsp_context::receive(): no messages to receive, all nodes currently blocked.</font>"<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>bool</u></font> <b><a name='try_receive'></a>try_receive</b> <font face='Lucida Console'>(</font> |
|
T<font color='#5555FF'>&</font> item, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&</font> sending_node_id |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
std::shared_ptr<font color='#5555FF'><</font>std::vector<font color='#5555FF'><</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>></font> <font color='#5555FF'>></font> temp; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>receive_data</font><font face='Lucida Console'>(</font>temp, sending_node_id<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
vectorstream <font color='#BB00BB'>sin</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>temp<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>item, sin<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sin.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> EOF<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>throw</font> <font color='#BB00BB'>serialization_error</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>deserialize() did not consume all bytes produced by serialize(). </font>" |
|
"<font color='#CC0000'>This probably means you are calling a receive method with a different type </font>" |
|
"<font color='#CC0000'>of object than the one which was sent.</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
~<b><a name='bsp_context'></a>bsp_context</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>private</font>: |
|
|
|
<b><a name='bsp_context'></a>bsp_context</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
|
|
<b><a name='bsp_context'></a>bsp_context</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id_, |
|
impl1::map_id_to_con<font color='#5555FF'>&</font> cons_ |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='close_all_connections_gracefully'></a>close_all_connections_gracefully</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
ensures |
|
- closes all the connections to other nodes and lets them know that |
|
we are terminating normally rather than as the result of some kind |
|
of error. |
|
!*/</font> |
|
|
|
<font color='#0000FF'><u>bool</u></font> <b><a name='receive_data'></a>receive_data</b> <font face='Lucida Console'>(</font> |
|
std::shared_ptr<font color='#5555FF'><</font>std::vector<font color='#5555FF'><</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>></font> <font color='#5555FF'>></font><font color='#5555FF'>&</font> item, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&</font> sending_node_id |
|
<font face='Lucida Console'>)</font>; |
|
|
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='notify_control_node'></a>notify_control_node</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>char</u></font> val |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='broadcast_byte'></a>broadcast_byte</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>char</u></font> val |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='send_data'></a>send_data</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>></font><font color='#5555FF'>&</font> item, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> target_node_id |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
requires |
|
- target_node_id < number_of_nodes() |
|
- target_node_id != node_id() |
|
ensures |
|
- sends a copy of item to the node with the given id. |
|
!*/</font> |
|
|
|
|
|
|
|
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> outstanding_messages; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_waiting_nodes; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_terminated_nodes; |
|
dlib::uint64 current_epoch; |
|
|
|
impl1::thread_safe_message_queue msg_buffer; |
|
|
|
impl1::map_id_to_con<font color='#5555FF'>&</font> _cons; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> _node_id; |
|
array<font color='#5555FF'><</font>std::unique_ptr<font color='#5555FF'><</font>thread_function<font color='#5555FF'>></font> <font color='#5555FF'>></font> threads; |
|
|
|
<font color='#009900'>// ----------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3, |
|
<font color='#0000FF'>typename</font> ARG4 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3, |
|
ARG4 arg4 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// ----------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3, |
|
<font color='#0000FF'>typename</font> ARG4 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3, |
|
ARG4 arg4 |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// ----------------------------------- |
|
</font> |
|
<b>}</b>; |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#BB00BB'>connect_all</font><font face='Lucida Console'>(</font>cons, hosts, node_id<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>send_out_connection_orders</font><font face='Lucida Console'>(</font>cons, hosts<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#BB00BB'>connect_all</font><font face='Lucida Console'>(</font>cons, hosts, node_id<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>send_out_connection_orders</font><font face='Lucida Console'>(</font>cons, hosts<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#BB00BB'>connect_all</font><font face='Lucida Console'>(</font>cons, hosts, node_id<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>send_out_connection_orders</font><font face='Lucida Console'>(</font>cons, hosts<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1,arg2<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#BB00BB'>connect_all</font><font face='Lucida Console'>(</font>cons, hosts, node_id<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>send_out_connection_orders</font><font face='Lucida Console'>(</font>cons, hosts<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1,arg2,arg3<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3, |
|
<font color='#0000FF'>typename</font> ARG4 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_connect'></a>bsp_connect</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>network_address<font color='#5555FF'>></font><font color='#5555FF'>&</font> hosts, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3, |
|
ARG4 arg4 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#BB00BB'>connect_all</font><font face='Lucida Console'>(</font>cons, hosts, node_id<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>send_out_connection_orders</font><font face='Lucida Console'>(</font>cons, hosts<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1,arg2,arg3,arg4<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen'></a>bsp_listen</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
funct_type funct |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make sure requires clause is not broken |
|
</font> <font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>listening_port <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font>, |
|
"<font color='#CC0000'>\t void bsp_listen()</font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t Invalid arguments were given to this function.</font>" |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#BB00BB'>bsp_listen_dynamic_port</font><font face='Lucida Console'>(</font>listening_port, impl1::null_notify, funct<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen'></a>bsp_listen</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
funct_type funct, |
|
ARG1 arg1 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make sure requires clause is not broken |
|
</font> <font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>listening_port <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font>, |
|
"<font color='#CC0000'>\t void bsp_listen()</font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t Invalid arguments were given to this function.</font>" |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#BB00BB'>bsp_listen_dynamic_port</font><font face='Lucida Console'>(</font>listening_port, impl1::null_notify, funct, arg1<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen'></a>bsp_listen</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make sure requires clause is not broken |
|
</font> <font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>listening_port <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font>, |
|
"<font color='#CC0000'>\t void bsp_listen()</font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t Invalid arguments were given to this function.</font>" |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#BB00BB'>bsp_listen_dynamic_port</font><font face='Lucida Console'>(</font>listening_port, impl1::null_notify, funct, arg1, arg2<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen'></a>bsp_listen</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make sure requires clause is not broken |
|
</font> <font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>listening_port <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font>, |
|
"<font color='#CC0000'>\t void bsp_listen()</font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t Invalid arguments were given to this function.</font>" |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#BB00BB'>bsp_listen_dynamic_port</font><font face='Lucida Console'>(</font>listening_port, impl1::null_notify, funct, arg1, arg2, arg3<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3, |
|
<font color='#0000FF'>typename</font> ARG4 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen'></a>bsp_listen</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3, |
|
ARG4 arg4 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make sure requires clause is not broken |
|
</font> <font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>listening_port <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font>, |
|
"<font color='#CC0000'>\t void bsp_listen()</font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\n\t Invalid arguments were given to this function.</font>" |
|
<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#BB00BB'>bsp_listen_dynamic_port</font><font face='Lucida Console'>(</font>listening_port, impl1::null_notify, funct, arg1, arg2, arg3, arg4<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id; |
|
<font color='#BB00BB'>listen_and_connect_all</font><font face='Lucida Console'>(</font>node_id, cons, listening_port, port_notify_function<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id; |
|
<font color='#BB00BB'>listen_and_connect_all</font><font face='Lucida Console'>(</font>node_id, cons, listening_port, port_notify_function<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id; |
|
<font color='#BB00BB'>listen_and_connect_all</font><font face='Lucida Console'>(</font>node_id, cons, listening_port, port_notify_function<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1,arg2<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id; |
|
<font color='#BB00BB'>listen_and_connect_all</font><font face='Lucida Console'>(</font>node_id, cons, listening_port, port_notify_function<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1,arg2,arg3<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font> |
|
<font color='#0000FF'>typename</font> port_notify_function_type, |
|
<font color='#0000FF'>typename</font> funct_type, |
|
<font color='#0000FF'>typename</font> ARG1, |
|
<font color='#0000FF'>typename</font> ARG2, |
|
<font color='#0000FF'>typename</font> ARG3, |
|
<font color='#0000FF'>typename</font> ARG4 |
|
<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_listen_dynamic_port'></a>bsp_listen_dynamic_port</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port, |
|
port_notify_function_type port_notify_function, |
|
funct_type funct, |
|
ARG1 arg1, |
|
ARG2 arg2, |
|
ARG3 arg3, |
|
ARG4 arg4 |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
impl1::map_id_to_con cons; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> node_id; |
|
<font color='#BB00BB'>listen_and_connect_all</font><font face='Lucida Console'>(</font>node_id, cons, listening_port, port_notify_function<font face='Lucida Console'>)</font>; |
|
bsp_context <font color='#BB00BB'>obj</font><font face='Lucida Console'>(</font>node_id, cons<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>funct</font><font face='Lucida Console'>(</font>obj,arg1,arg2,arg3,arg4<font face='Lucida Console'>)</font>; |
|
obj.<font color='#BB00BB'>close_all_connections_gracefully</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#ifdef</font> NO_MAKEFILE |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='bsp.cpp.html'>bsp.cpp</a>" |
|
<font color='#0000FF'>#endif</font> |
|
|
|
<font color='#0000FF'>#endif</font> <font color='#009900'>// DLIB_BsP_Hh_ |
|
</font> |
|
|
|
</pre></body></html> |