1 #include <../../nrnconf.h>
12 #include "utils/logger.hpp"
14 void nrnbbs_context_wait();
23 #define MessageList MpiMessageList
24 #define WorkItem MpiWorkItem
25 #define WorkList MpiWorkList
26 #define ReadyList MpiReadyList
27 #define ResultList MpiResultList
28 #define PendingList MpiPendingList
29 #define LookingToDoList MpiLookingToDoList
43 bool operator()(
const char* s1,
const char* s2)
const {
44 return strcmp(s1, s2) < 0;
50 return w1->todo_less_than(
w2);
54 static char*
newstr(
const char*
s) {
55 char* s1 =
new char[strlen(
s) + 1];
62 printf(
"WorkItem %d\n",
id);
79 while (
w1->parent_ !=
w2->parent_) {
80 if (
w1->id_ <
w2->id_) {
87 printf(
"todo_less_than %d < %d return %d\n", this->
id_, w->
id_,
w1->id_ <
w2->id_);
89 return w1->id_ <
w2->id_;
92 class MessageList:
public std::multimap<const char*, bbsmpibuf*, ltstr> {};
93 class PendingList:
public std::multimap<const char*, const int, ltstr> {};
95 class LookingToDoList:
public std::set<int> {};
96 class ReadyList:
public std::set<const WorkItem*, ltWorkItem> {};
97 class ResultList:
public std::multimap<int, const WorkItem*> {};
116 printf(
"~BBSLocalServer not deleting everything\n");
126 printf(
"DirectServer::look_take |%s|\n",
key);
136 char*
s = (
char*) ((*m).first);
141 printf(
"DirectServer::look_take |%s| recv=%p return %d\n",
key, (*recv), b);
148 printf(
"DirectServer::look |%s|\n",
key);
162 printf(
"DirectServer::look |%s| recv=%p return %d\n",
key, (*recv), b);
169 printf(
"put_pending |%s| %d\n",
key, cid);
181 printf(
"take_pending |%s| %d\n",
key, *cid);
183 char*
s = (
char*) ((*p).first);
194 printf(
"DirectServer::post |%s| send=%p\n",
key, send);
197 nrnmpi_bbssend(cid,
TAKE, send);
210 printf(
"BBSDirectServer::post_todo pid=%d cid=%d send=%p\n", pid, cid, send);
214 WorkList::iterator
p =
work_->find(pid);
227 nrnmpi_bbssend(cid, w->
id_ + 1, send);
242 for (
j = 0;
j < 1000; ++
j) {
249 Printf(
"some workers did not receive previous context\n");
263 printf(
"sending context to already waiting %d\n", cid);
265 nrnmpi_bbssend(cid,
CONTEXT + 1, send);
278 void nrnbbs_context_wait() {
297 printf(
"sending context to %d\n", cid);
311 printf(
"DirectServer::post_result id=%d send=%p\n",
id, send);
313 WorkList::iterator
i =
work_->find(
id);
316 nrnmpi_unref(w->buf_);
323 printf(
"DirectServer::look_take_todo\n");
327 ReadyList::iterator
i =
todo_->begin();
333 printf(
"DirectServer::look_take_todo recv %p with keypos=%d return %d\n",
347 printf(
"DirectServer::look_take_result pid=%d\n", pid);
351 ResultList::iterator
i =
results_->find(pid);
357 WorkList::iterator
j =
work_->find(
id);
361 printf(
"DirectServer::look_take_result recv=%p return %d\n", *recv,
id);
static char * newstr(const char *s)
int look_take_result(int parentid)
void add_looking_todo(int cid)
bool look(const char *key)
void context(int ncid, int *cids)
bool look_take(const char *key)
MpiLookingToDoList * looking_todo_
void post_todo(int parentid, int cid)
void post(const char *key)
void put_pending(const char *key, int cid)
MpiLookingToDoList * send_context_
virtual ~BBSDirectServer()
static BBSDirectServer * server_
MpiMessageList * messages_
MpiPendingList * pending_
bool send_context(int cid)
bool take_pending(const char *key, int *cid)
int remaining_context_cnt_
bool todo_less_than(const WorkItem *) const
WorkItem(int id, MessageValue *)
static double map(void *v)
bool operator()(const WorkItem *w1, const WorkItem *w2) const
bool operator()(const char *s1, const char *s2) const
int Printf(const char *fmt, Args... args)