|
|
@@ -22,6 +22,8 @@ extern "C" {
|
|
|
#include "subproblem.h"
|
|
|
#include "dpnode.h"
|
|
|
|
|
|
+#undef VERBOSE
|
|
|
+
|
|
|
typedef map<std::string, pair<ZZ,ZZ> > DTable;
|
|
|
|
|
|
typedef enum {
|
|
|
@@ -96,6 +98,7 @@ static void dpnode_event_cb(struct bufferevent *bev, short events,
|
|
|
void *ctx)
|
|
|
{
|
|
|
if (events & (BEV_EVENT_EOF|BEV_EVENT_ERROR)) {
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "Closing connection " << bev << " ";
|
|
|
if (events & BEV_EVENT_EOF) {
|
|
|
cerr << "EOF";
|
|
|
@@ -104,6 +107,7 @@ static void dpnode_event_cb(struct bufferevent *bev, short events,
|
|
|
cerr << "ERR (" << evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()) << ")";
|
|
|
}
|
|
|
cerr << "\n";
|
|
|
+#endif
|
|
|
DPNodeConnInfo *info = (DPNodeConnInfo*)ctx;
|
|
|
delete info;
|
|
|
dpctrlstate.workers.erase(bev);
|
|
|
@@ -154,7 +158,9 @@ static void dpnode_reader(struct bufferevent *bev, void *ctx)
|
|
|
ZZ binv;
|
|
|
if (InvModStatus(binv, bdiff, order) == 0) {
|
|
|
ZZ expon = MulMod(binv, adiff, order);
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "Collision after " << dpctrlstate.numdps << " DPs\n";
|
|
|
+#endif
|
|
|
unsigned char exponbytes[3+3*sizeof(unsigned int)];
|
|
|
exponbytes[0] = 'E';
|
|
|
memmove(exponbytes+1,
|
|
|
@@ -180,7 +186,9 @@ static void dpnode_accept_cb(struct evconnlistener *listener,
|
|
|
struct event_base *base = evconnlistener_get_base(listener);
|
|
|
struct bufferevent *bev = bufferevent_socket_new(
|
|
|
base, fd, BEV_OPT_CLOSE_ON_FREE);
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "accepted connection " << bev << "\n";
|
|
|
+#endif
|
|
|
|
|
|
bufferevent_setcb(bev, dpnode_reader, NULL,
|
|
|
dpnode_event_cb, info);
|
|
|
@@ -198,7 +206,9 @@ struct evconnlistener *dpnode_create(struct event_base *evbase,
|
|
|
struct evconnlistener *ecl = listener_create(evbase, 0,
|
|
|
dpnode_accept_cb, NULL, ip, boundport, false);
|
|
|
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "Listening at " << ecl << "\n";
|
|
|
+#endif
|
|
|
|
|
|
return ecl;
|
|
|
}
|
|
|
@@ -217,20 +227,26 @@ struct DPControllerConnInfo {
|
|
|
|
|
|
static void stop_problem(void)
|
|
|
{
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "Stopping problem\n";
|
|
|
+#endif
|
|
|
if (dpctrlstate.current_problem) {
|
|
|
delete dpctrlstate.current_problem;
|
|
|
dpctrlstate.current_problem = NULL;
|
|
|
}
|
|
|
if (dpctrlstate.listener) {
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "Closing listener " << dpctrlstate.listener << "\n";
|
|
|
+#endif
|
|
|
evconnlistener_free(dpctrlstate.listener);
|
|
|
dpctrlstate.listener = NULL;
|
|
|
}
|
|
|
std::set<struct bufferevent *>::iterator wit;
|
|
|
for (wit = dpctrlstate.workers.begin(); wit != dpctrlstate.workers.end();
|
|
|
++wit) {
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "Closing connection " << *wit << "\n";
|
|
|
+#endif
|
|
|
bufferevent_free(*wit);
|
|
|
}
|
|
|
dpctrlstate.workers.clear();
|
|
|
@@ -252,13 +268,17 @@ static void start_problem(struct bufferevent *bev,
|
|
|
|
|
|
stop_problem();
|
|
|
dpctrlstate.current_problem = new Subproblem(subproblem);
|
|
|
+#ifdef VERBOSE
|
|
|
dpctrlstate.current_problem->dump(cerr);
|
|
|
+#endif
|
|
|
|
|
|
// Create the DPNode server socket
|
|
|
dpctrlstate.listener = dpnode_create(bufferevent_get_base(bev),
|
|
|
&myip, &myport);
|
|
|
+#ifdef VERBOSE
|
|
|
struct in_addr myaddr = { myip };
|
|
|
fprintf(stderr, "Bound to %s:%d\n", inet_ntoa(myaddr), ntohs(myport));
|
|
|
+#endif
|
|
|
unsigned char idstring[7];
|
|
|
idstring[0] = 'L';
|
|
|
memmove(idstring+1, &myip, 4);
|
|
|
@@ -280,7 +300,9 @@ static void controllerconn_reader(struct bufferevent *bev, void *ctx)
|
|
|
case DPCCSTATE_AWAITCMD:
|
|
|
if (len < 1) return;
|
|
|
bufferevent_read(bev, cmd, 1);
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "Received command " << cmd[0] << "\n";
|
|
|
+#endif
|
|
|
switch(cmd[0]) {
|
|
|
case 'P':
|
|
|
info->state = DPCCSTATE_RDPROBLEM;
|
|
|
@@ -308,7 +330,9 @@ static void controllerconn_reader(struct bufferevent *bev, void *ctx)
|
|
|
// Shut down
|
|
|
delete info;
|
|
|
event_base_loopbreak(bufferevent_get_base(bev));
|
|
|
+#ifdef VERBOSE
|
|
|
cerr << "END conenction " << bev << "\n";
|
|
|
+#endif
|
|
|
dpctrlstate.workers.erase(bev);
|
|
|
bufferevent_free(bev);
|
|
|
return;
|
|
|
@@ -329,7 +353,9 @@ static void controllerconn_event_cb(struct bufferevent *bev, short events,
|
|
|
controllerconn_event_cb, new DPControllerConnInfo());
|
|
|
dpctrlstate.controller_bev = bev;
|
|
|
} else if (events & (BEV_EVENT_EOF|BEV_EVENT_ERROR)) {
|
|
|
+#ifdef VERBOSE
|
|
|
fprintf(stderr, "Closing connection to controller and exiting\n");
|
|
|
+#endif
|
|
|
event_base_loopbreak(bufferevent_get_base(bev));
|
|
|
bufferevent_free(bev);
|
|
|
}
|