summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Suhr Christensen <jsc@umbraculum.org>2012-04-12 15:12:18 +0200
committerJonas Suhr Christensen <jsc@umbraculum.org>2012-04-12 15:12:18 +0200
commite3c0c95f2ad3d25411c007ce4ffdb25084a1bc0d (patch)
tree6e4179bac871a91b842ccfff4aa69466f0787ad8
parentfd373d0b0f580b56f3350e92207cfa499806ca4d (diff)
Added observer id as prefix to server->client commands.
-rw-r--r--src/connectionhandler.cc15
-rw-r--r--src/connectionhandler.h3
-rw-r--r--src/munia_proto.cc23
-rw-r--r--src/tasktree.cc27
4 files changed, 52 insertions, 16 deletions
diff --git a/src/connectionhandler.cc b/src/connectionhandler.cc
index 85ae4a7..56c465f 100644
--- a/src/connectionhandler.cc
+++ b/src/connectionhandler.cc
@@ -65,18 +65,27 @@ void ConnectionHandler::unobserve(clientid_t clientid, taskid_t taskid)
connlist[clientid].erase(taskid);
}
-std::set<clientid_t> ConnectionHandler::observerlist(TaskIdList tasks)
+std::list<std::pair<clientid_t, taskid_t> >
+ConnectionHandler::observerlist(TaskIdList tasks)
{
printf("Observerlist request\n");
- std::set<clientid_t> clients;
+ std::list<std::pair<clientid_t, taskid_t> > clients;
for(TaskIdList::iterator i = tasks.begin(); i != tasks.end(); i++) {
taskid_t tid = *i;
+ // std::set<clientid_t> clientList;
+ // std::map<clientid_t, taskid_t>
+
printf("Locating observers of node %d\n", tid);
for(ConnectionList::iterator ci = connlist.begin();
ci != connlist.end(); ci++) {
std::set<taskid_t>::iterator ti = ci->second.find(tid);
- if(ti != ci->second.end()) clients.insert(ci->first);
+ if(ti != ci->second.end()) {
+ std::pair<clientid_t, taskid_t> m;
+ m.first = ci->first;
+ m.second = tid;
+ clients.push_back(m);
+ }
}
}
diff --git a/src/connectionhandler.h b/src/connectionhandler.h
index 464128b..b09e944 100644
--- a/src/connectionhandler.h
+++ b/src/connectionhandler.h
@@ -49,7 +49,8 @@ public:
void observe(clientid_t clientid, taskid_t taskid);
void unobserve(clientid_t clientid, taskid_t taskid);
- std::set<clientid_t> observerlist(TaskIdList tasklist);
+
+ std::list<std::pair<clientid_t, taskid_t> > observerlist(TaskIdList tasklist);
private:
ConnectionList connlist;
diff --git a/src/munia_proto.cc b/src/munia_proto.cc
index 3679a81..b801009 100644
--- a/src/munia_proto.cc
+++ b/src/munia_proto.cc
@@ -153,22 +153,29 @@ int callback_lws_task(struct libwebsocket_context * context,
MessageList::iterator omi = omsgs.begin();
while(omi != omsgs.end()) {
- std::string msg;
- msg.append((size_t)LWS_SEND_BUFFER_PRE_PADDING, ' ');
- msg.append(msg_tostring(*omi));
- msg.append((size_t)LWS_SEND_BUFFER_POST_PADDING, ' ');
+ std::string msgcmd = msg_tostring(*omi);
printf("%d nodes affected by command\n", omi->nodes.size());
- std::set<clientid_t> clients =
+ std::list<std::pair<clientid_t, taskid_t> > clients =
connection_handler.observerlist(omi->nodes);
printf("Writing message to %d clients\n", clients.size());
- std::set<clientid_t>::iterator ci = clients.begin();
+ std::list<std::pair<clientid_t, taskid_t> >::iterator ci = clients.begin();
while(ci != clients.end()) {
- clientid_t clientid = *ci;
+ std::string msg;
+ clientid_t clientid = (*ci).first;
+ char tidstr[32];
+ sprintf(tidstr, "%u", (*ci).second);
printf("\tAdding data to %p's queue\n", clientid);
- msgqueue[*ci].push(msg);
+
+ msg.append((size_t)LWS_SEND_BUFFER_PRE_PADDING, ' ');
+ msg.append(tidstr);
+ msg.append(" ");
+ msg.append(msgcmd);
+ msg.append((size_t)LWS_SEND_BUFFER_POST_PADDING, ' ');
+
+ msgqueue[clientid].push(msg);
ci++;
}
diff --git a/src/tasktree.cc b/src/tasktree.cc
index 0df23d6..3a72046 100644
--- a/src/tasktree.cc
+++ b/src/tasktree.cc
@@ -29,6 +29,13 @@
#include "debug.h"
+static void concatTaskIdLists(TaskIdList& pre, TaskIdList& post) {
+ pre.insert(pre.end(), post.begin(), post.end());
+ // for(TaskIdList::iterator it = post.begin();
+ // it != post.end(); it++) {
+ // pre.push_back(
+ // }
+}
TaskTree::TaskTree() {
root = NULL;
@@ -60,9 +67,11 @@ TaskIdList TaskTree::insertAsChild(taskid_t parentid, taskid_t id, task_t data)
child->data = data;
insertChild(parent, child);
- affectedNodes.push_back(parentid);
+ // affectedNodes.push_back(parentid);
affectedNodes.push_back(id);
-
+ TaskIdList ancestors = ancestorList(id);
+ concatTaskIdLists(affectedNodes, ancestors);
+
goto finish;
}
catch(std::exception& e) {
@@ -112,8 +121,11 @@ TaskIdList TaskTree::move(taskid_t id, taskid_t toid)
newparent->children.push_back(child);
affectedNodes.push_back(id);
- affectedNodes.push_back(child->parent->id);
- affectedNodes.push_back(toid);
+ // affectedNodes.push_back(child->parent->id);
+ TaskIdList ancestors = ancestorList(id);
+ concatTaskIdLists(affectedNodes, ancestors);
+ affectedNodes.push_back(toid);
+ ancestors = ancestorList(toid);
goto finish;
}
@@ -135,6 +147,8 @@ TaskIdList TaskTree::updateData(taskid_t id, task_t t)
node->data = t;
affectedNodes.push_back(id);
+ TaskIdList ancestors = ancestorList(id);
+ concatTaskIdLists(affectedNodes, ancestors);
goto finish;
}
catch(std::exception& e) {
@@ -181,6 +195,11 @@ TaskIdList TaskTree::ancestorList(taskid_t id)
}
finish:
+ printf("Collected %d ancestors to %u\n", ancestors.size(), id);
+ for(TaskIdList::iterator it = ancestors.begin();
+ it != ancestors.end(); it++) {
+ printf("\tancestor %u\n", *it);
+ }
return ancestors;
}