diff --git a/examples/1_socketlike/amy.c b/examples/1_socketlike/amy.c index cc41ad7ee02e9f32fd783bf7c45a35a233f2ac2c..415c02f8fb45d06e44bbf95bc18cf4bb1f00729c 100644 --- a/examples/1_socketlike/amy.c +++ b/examples/1_socketlike/amy.c @@ -3,8 +3,9 @@ #include "../../reowolf.h" #include "../utility.c" -int main() { // AMY +int main() { + // amy hard-codes her protocol. char* pdl = "primitive forward(in i, out o) {" " while(true) synchronous {" @@ -13,16 +14,16 @@ int main() { // AMY "}" ; + // fill a buffer with the user's message to send. char msg_buf[128]; memset(msg_buf, 0, 128); - printf("input a message to send:"); - check("fgets", fgets(msg_buf, 128-1, stdin) == NULL); int msg_len = strlen(msg_buf); msg_buf[msg_len-1] = 0; printf("will send msg `%s`\n", msg_buf); + // create a connector with one outgoing network channel. Connector* c = connector_new(); printf("configuring...\n"); check("config ", connector_configure(c, pdl, "forward")); @@ -31,6 +32,7 @@ int main() { // AMY printf("connecting...\n"); check("connect", connector_connect(c, 5000)); + // send the user-provided message three times int i; for (i = 0; i < 3; i++) { check("put ", connector_put(c, 0, msg_buf, msg_len)); @@ -38,6 +40,7 @@ int main() { // AMY printf("Sent one message!\n"); } + // clean up printf("destroying...\n"); connector_destroy(c); printf("exiting...\n"); diff --git a/examples/1_socketlike/bob.c b/examples/1_socketlike/bob.c index 9a2c1f19c29b93e84c2f092cf560c7217d5f3328..a66a1af4d89b0f1345a037df28e1932eeb2fd512 100644 --- a/examples/1_socketlike/bob.c +++ b/examples/1_socketlike/bob.c @@ -2,8 +2,9 @@ #include "../../reowolf.h" #include "../utility.c" -int main() { // BOB! - +int main() { + + // bob hard-codes his protocol. char* pdl = "primitive forward(in i, out o) {" " while(true) synchronous {" @@ -12,7 +13,7 @@ int main() { // BOB! "}" ; - // BOB + // setup a connector with one incoming network channel. Connector* c = connector_new(); printf("configuring...\n"); check("config ", connector_configure(c, pdl, "forward")); @@ -21,6 +22,7 @@ int main() { // BOB! printf("connecting...\n"); check("connect", connector_connect(c, 5000)); + // receive a message and print it to stdout three times int i; for (i = 0; i < 3; i++) { check("get ", connector_get(c, 0)); @@ -32,7 +34,8 @@ int main() { // BOB! printf("Received one message `%s`!\n", msg); } - + + // cleanup printf("destroying...\n"); connector_destroy(c); printf("exiting...\n"); diff --git a/examples/2_dynamic_pdl/amy.c b/examples/2_dynamic_pdl/amy.c index b9ba74c2bf23f5143abe91c1e9da2b68703ee680..5a853ef2b5ed1f10c08331411edbddeb1b5d8654 100644 --- a/examples/2_dynamic_pdl/amy.c +++ b/examples/2_dynamic_pdl/amy.c @@ -4,14 +4,14 @@ #include "../../reowolf.h" #include "../utility.c" -int main() { // AMY +int main() { + + // amy's protocol is loaded at runtime from a file. char * pdl = buffer_pdl("eg_protocols.pdl"); char msg_buf[128]; memset(msg_buf, 0, 128); - printf("input a message to send:"); - check("fgets", fgets(msg_buf, 128-1, stdin) == NULL); int msg_len = strlen(msg_buf); msg_buf[msg_len-1] = 0; diff --git a/examples/2_dynamic_pdl/bob.c b/examples/2_dynamic_pdl/bob.c index 977c6f29cb5bf721ab6b9f52b3ccc60fad8b31fd..e8db48ba8a58f62c37c1f479d9a41c504a916583 100644 --- a/examples/2_dynamic_pdl/bob.c +++ b/examples/2_dynamic_pdl/bob.c @@ -2,10 +2,11 @@ #include "../../reowolf.h" #include "../utility.c" -int main() { // BOB! +int main() { + + // bob's behavior is loaded from a file at runtime char * pdl = buffer_pdl("eg_protocols.pdl"); - // BOB Connector* c = connector_new(); printf("configuring...\n"); check("config ", connector_configure(c, pdl, "forward")); diff --git a/examples/3_nondeterminism/amy.c b/examples/3_nondeterminism/amy.c index 3e3f771509150187a1858943d39c507690ae7329..7567b504528be3da36f135ba473ca3d84a27c3a7 100644 --- a/examples/3_nondeterminism/amy.c +++ b/examples/3_nondeterminism/amy.c @@ -4,35 +4,36 @@ #include "../../reowolf.h" #include "../utility.c" -int main() { // AMY +int main() { char * pdl = buffer_pdl("eg_protocols.pdl"); Connector* c = connector_new(); printf("configuring...\n"); - check("config ", connector_configure(c, pdl, "sync")); check("bind 0 ", connector_bind_native(c, 0)); check("bind 1 ", connector_bind_passive(c, 1, "127.0.0.1:7000")); printf("connecting...\n"); check("connect", connector_connect(c, 5000)); + // amy offers a message to her peer. + // the message is the number of messages the peer previously received. + int send_next = 0; char msg_buf[32]; int code; int i; for (i = 0; 1; i++) { itoa(send_next, msg_buf, 10); - printf("\nround %d. Will send msg `%s` next", i, msg_buf); - - // batch 0: no messages sent + // option (a): no messages sent check("next_batch ", connector_next_batch(c)); - // batch 1: put 0 + // option (b): one message sent check("put ", connector_put(c, 0, msg_buf, strlen(msg_buf) + 1)); code = connector_sync(c, 3000); + // reflect on the outcome of the exchange if (code == 0) printf("Sent no message!"); else if (code == 1) { printf("Sent message `%s`!", msg_buf); diff --git a/examples/3_nondeterminism/bob.c b/examples/3_nondeterminism/bob.c index b2417f6f54bea8e46041f60e87c83e51b4d14fae..60981663b22bc66ea5cee6806e55ec2d5bed4d5a 100644 --- a/examples/3_nondeterminism/bob.c +++ b/examples/3_nondeterminism/bob.c @@ -3,23 +3,19 @@ #include "../../reowolf.h" #include "../utility.c" -int main() { // BOB! +int main() { char * pdl = buffer_pdl("eg_protocols.pdl"); - Connector* c = connector_new(); + Connector* c = connector_new(); printf("configuring...\n"); check("config ", connector_configure(c, pdl, "sync")); - check("bind 0 ", connector_bind_active(c, 0, "127.0.0.1:7000")); check("bind 1 ", connector_bind_native(c, 1)); - printf("connecting...\n"); check("connect", connector_connect(c, 5000)); - int msg_len; + int msg_len, i; const unsigned char * msg; - - int i; srand(time(NULL)); for (i = 0; i < 10; i++) { printf("\nround %d...\n", i); diff --git a/examples/5_recovery/amy.exe b/examples/5_recovery/amy.exe deleted file mode 100644 index 1a9d5528adc9589bc3e41352c0612c49c6a5eb17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60240 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�{?qo9tu{9{WyEWimni3)S@_*BQw^B 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 diff --git a/examples/5_recovery/bob.exe b/examples/5_recovery/bob.exe deleted file mode 100644 index 17e9ec8ea6fe2dcfd47e16a5dcb82cccf3d02b28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60404 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 diff --git a/examples/6_constraint_solve/THIS IS TODO.txt b/examples/6_constraint_solve/THIS IS TODO.txt deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/examples/6_constraint_solve/main.c b/examples/6_constraint_solve/main.c index dfb5fff5279fd85a2ca37fe175d5d60fceb516b4..6084ffd933f6ca9beb1a665ce80787868127bdde 100644 --- a/examples/6_constraint_solve/main.c +++ b/examples/6_constraint_solve/main.c @@ -1,65 +1,103 @@ #include #include #include -#include +#include #include "../../reowolf.h" #include "../utility.c" +#define N 4 + +typedef struct PeerInfo { + int id; + bool puts; // true iff the channel to this peer is INCOMING. +} PeerInfo; + +// return the index of (i,j) in the lexicographic ordering of set {(i,j) : ij +int combination_index(int i, int j) { + if (i > j) { + // swap! + i ^= j; + j ^= i; + i ^= j; + } + assert(0 <= i); + assert(i < j); + assert(j < N); + + int idx_in_square = i*N + j; + int skipped = ((i+1) * (i+2)) / 2; + return idx_in_square - skipped; +} + +// initializes the given 3-element array, +// breaking symmetry with put-get direction. +void init_peer_infos(PeerInfo * peer_infos, int my_id) { + int i; + for (i = 0; i < 3; i++) { + PeerInfo * pi = &peer_infos[i]; + pi->puts = i < my_id; + pi->id = i < my_id ? i : i+1; + printf("info %d puts=%d id=%d\n", i, pi->puts, pi->id); + } +} + +const char* addrs[] = { + "127.0.0.1:7000", + "127.0.0.1:7001", + "127.0.0.1:7002", + "127.0.0.1:7003", + "127.0.0.1:7004", + "127.0.0.1:7005", +}; int main(int arg_c, char * argv[]) { - int index; + int my_id, peer_id, i; if (arg_c != 2) { printf("Expected one arg: which peer I am in 0..4"); return 1; } - index = atoi(argv[1]); - printf("I am peer %d\n", index); + my_id = atoi(argv[1]); + assert(0 <= my_id && my_id < N); + printf("I have id %d\n", my_id); - const char* addrs[] = { - "127.0.0.1:7000", - "127.0.0.1:7001", - "127.0.0.1:7002", - "127.0.0.1:7003", - "127.0.0.1:7004", - "127.0.0.1:7005", - }; - char * pdl = buffer_pdl("eg_protocols.pdl"); Connector* c = connector_new(); printf("configuring...\n"); - check("config ", connector_configure(c, pdl, "xor_three")); - int i, j; - int addr_index = 0; - int port = 0; - for (i = 0; i < 4; i++) { - for (j = i+1; j < 4; j++) { - if (i==index) { - printf("ports %d and %d are for a passive channel to peer %d over addr %s\n", port, port+1, j, addrs[addr_index]); - check("bind an ", connector_bind_native(c, port)); - port++; - check("bind a ", connector_bind_active(c, port, addrs[addr_index])); - port++; - } else if (j==index) { - printf("ports %d and %d are for an active channel to peer %d over addr %s\n", port, port+1, i, addrs[addr_index]); - check("bind p ", connector_bind_passive(c, port, addrs[addr_index])); - port++; - check("bind pn ", connector_bind_native(c, port)); - port++; - } - addr_index++; + + PeerInfo peer_infos[3]; + init_peer_infos(peer_infos, my_id); + + // for every native port, bind native and protocol port. + for (i = 0; i < 3; i++) { + PeerInfo * pi = &peer_infos[i]; + int addr_idx = combination_index(my_id, pi->id); + if (pi->puts) { + check("bind to putter ", + connector_bind_passive(c, i*2, addrs[addr_idx])); + check("bind native ", connector_bind_native(c, i*2 + 1)); + } else { + check("bind native ", connector_bind_native(c, i*2)); + check("bind to putter ", + connector_bind_active(c, i*2 + 1, addrs[addr_idx])); } } + printf("connecting...\n"); check("connect", connector_connect(c, 5000)); - for (i = 0; i < 4; i++) { - if (i == index) continue; - // another batch - for (j = 0; j < 4; j++) { - - } + // for every native port, create a singleton batch + for (i = 0; i < 3; i++) { + if (i > 0) check("next ", connector_next_batch(c)); + PeerInfo * pi = &peer_infos[i]; + check("op ", pi->puts? + connector_get(c, i): + connector_put(c, i, NULL, 0)); } - connector_sync(); + // solve! + int batch_idx = connector_sync(c, 3000); + if (batch_idx < 0) printf("Error code on sync! %d\n", batch_idx); + else printf("I was paired with peer %d\n", peer_infos[batch_idx].id); printf("destroying...\n"); connector_destroy(c); diff --git a/examples/6_constraint_solve/main.exe b/examples/6_constraint_solve/main.exe deleted file mode 100644 index 6c6966ab381560d5e532f865b648918c94b53cd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59413 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 IdB6Do0ga2OZ2$lO diff --git a/src/runtime/communication.rs b/src/runtime/communication.rs index e7595a26225f9768e0f34f37f5567810c43cd62a..09c99516ea20c2d9fa74789d4b088b30e6b68af6 100644 --- a/src/runtime/communication.rs +++ b/src/runtime/communication.rs @@ -100,8 +100,9 @@ impl Controller { if branches.contains_key(&predicate) { // TODO what do I do with redundant predicates? unimplemented!( - "Having multiple batches with the same - predicate requires the support of oracle boolean variables" + "Duplicate predicate {:#?}!\nHaving multiple batches with the same + predicate requires the support of oracle boolean variables", + &predicate, ) } let branch = BranchN { to_get: gets, gotten: Default::default(), sync_batch_index };