BBSDirect::~BBSDirect() {
	nrnmpi_unref(sendbuf_);
	nrnmpi_unref(recvbuf_);
#if defined(HAVE_STL)
	delete keepargs_;
#endif
}
void BBSDirect::context() {
	BBSDirectServer::handle();
	nrnmpi_enddata(sendbuf_);
	BBSDirectServer::server_->context(sendbuf_);
	nrnmpi_unref(sendbuf_);
	sendbuf_ = nil;
}
void BBSDirect::pkbegin() {
#if debug
printf("%d BBSDirect::pkbegin\n", nrnmpi_myid_bbs);
#endif
	nrnmpi_unref(sendbuf_);
	sendbuf_ = nrnmpi_newbuf(100);
	nrnmpi_ref(sendbuf_);
	nrnmpi_pkbegin(sendbuf_);
}
void BBSDirect::post_result(int id) {
#if debug
	printf("%d BBSDirect::post_result %d\n", nrnmpi_myid_bbs, id);
#endif
	nrnmpi_enddata(sendbuf_);
	nrnmpi_pkint(id, sendbuf_);
	BBSDirectServer::server_->post_result(id, sendbuf_);
	nrnmpi_unref(sendbuf_);
	sendbuf_ = nil;
	BBSDirectServer::handle();
}
void BBSDirect::post_todo(int parentid) {
#if debug
	printf("%d BBSDirect::post_todo for %d\n", nrnmpi_myid_bbs, parentid);
#endif
	nrnmpi_enddata(sendbuf_);
	nrnmpi_pkint(parentid, sendbuf_);
	BBSDirectServer::server_->post_todo(parentid, nrnmpi_myid_bbs, sendbuf_);
	nrnmpi_unref(sendbuf_);
	sendbuf_ = nil;
	BBSDirectServer::handle();
}
void BBSDirect::post(const char* key) {
#if debug
	printf("%d BBSDirect::post |%s|\n", nrnmpi_myid_bbs, key);
#endif
	nrnmpi_enddata(sendbuf_);
	nrnmpi_pkstr(key, sendbuf_);
	BBSDirectServer::server_->post(key, sendbuf_);
	nrnmpi_unref(sendbuf_);
	sendbuf_ = nil;
	BBSDirectServer::handle();
}
void BBSDirect::return_args(int userid) {
#if defined(HAVE_STL)
	KeepArgs::iterator i = keepargs_->find(userid);
	nrnmpi_unref(recvbuf_);
	recvbuf_ = nil;
	if (i != keepargs_->end()) {
		recvbuf_ = (*i).second;
		keepargs_->erase(i);
		nrnmpi_upkbegin(recvbuf_);
		BBSImpl::return_args(userid);
	}
#endif
}
void BBSDirect::done() {
//printf("%d bbsdirect::done\n", nrnmpi_myid_world);
	int i;
	if (done_) {
		return;
	}
	if (nrnmpi_numprocs > 1 && nrnmpi_numprocs_bbs < nrnmpi_numprocs_world) {
		int info[2]; info[0] = -2; info[1] = -1;
//printf("%d broadcast %d %d\n", nrnmpi_myid_world, info[0], info[1]);
		nrnmpi_int_broadcast(info, 2, 0);
	}
	BBSImpl::done();
	done_ = true;
	nrnmpi_unref(sendbuf_);
	sendbuf_ = nrnmpi_newbuf(20);
#if debug
printf("done: numprocs_bbs=%d\n", nrnmpi_numprocs_bbs);
#endif
	for (i=1; i < nrnmpi_numprocs_bbs; ++i) {
		nrnmpi_bbssend(i, QUIT, sendbuf_);
//printf("kill %d\n", i);
	}
	BBSDirectServer::server_->done();
}
Exemple #9
0
void BBSDirectServer::handle1(int size, int tag, int cid) {
	bbsmpibuf* recv;
	bbsmpibuf* send;
	char* key;
	int index;
	send = nil;
	recv = nrnmpi_newbuf(size);
	nrnmpi_ref(recv);
	nrnmpi_bbsrecv(cid, recv);
	++bbs_msg_cnt_;
	if (size > 0) {
		nrnmpi_upkbegin(recv);
	}
	switch (tag) {
	case POST_TODO:
		index = nrnmpi_upkint(recv); // the parent index
#if debug
printf("handle POST_TODO from %x when cross=%g\n", cid, hoc_cross_x_);
#endif
		BBSDirectServer::server_->post_todo(index, cid, recv);
		break;
	case POST_RESULT:
		index = nrnmpi_getid(recv);
#if debug
printf("handle POST_RESULT %d from %x when cross=%g\n", index, cid, hoc_cross_x_);
#endif
		BBSDirectServer::server_->post_result(index, recv);
		break;
	case POST:
		key = nrnmpi_getkey(recv);
#if debug
printf("handle POST %s from %x when cross=%g\n", key, cid, hoc_cross_x_);
#endif
		BBSDirectServer::server_->post(key, recv);
		break;
	case LOOK:
		key = nrnmpi_getkey(recv);
#if debug
printf("handle LOOK %s from %x when cross=%g\n", key, cid, hoc_cross_x_);
#endif
		if (BBSDirectServer::server_->look(key, &send)) {
			nrnmpi_bbssend(cid, LOOK_YES, send);
			nrnmpi_unref(send);
		}else{
			nrnmpi_bbssend(cid, LOOK_NO, nil);
		}
		break;
	case LOOK_TAKE:
		key = nrnmpi_getkey(recv);
#if debug
printf("handle LOOK_TAKE %s from %x when cross=%g\n", key, cid, hoc_cross_x_);
#endif
		if (BBSDirectServer::server_->look_take(key, &send)) {
#if debug
printf("handle sending back something\n");
#endif
			nrnmpi_bbssend(cid, LOOK_TAKE_YES, send);
			nrnmpi_unref(send);
		}else{
			nrnmpi_bbssend(cid, LOOK_TAKE_NO, nil);
		}
		break;
	case TAKE:
		key = nrnmpi_getkey(recv);
#if debug
printf("handle TAKE %s from %x when cross=%g\n", key, cid, hoc_cross_x_);
#endif
		if (BBSDirectServer::server_->look_take(key, &send)) {
#if debug
printf("handle sending back something\n");
#endif
			nrnmpi_bbssend(cid, TAKE, send);
			nrnmpi_unref(send);
		}else{
#if debug
printf("handle put_pending %s for %d\n", key, cid);
#endif
			BBSDirectServer::server_->put_pending(key, cid);
		}
		break;
	case LOOK_TAKE_TODO:
#if debug
printf("handle LOOK_TAKE_TODO for cid=%x\n", cid);
#endif
		index = BBSDirectServer::server_->look_take_todo(&send);
#if debug
printf("handle sending back id=%d\n", index);
#endif
		nrnmpi_bbssend(cid, index+1, send);
		if (index) {
			nrnmpi_unref(send);
		}			
		break;
	case LOOK_TAKE_RESULT:
		index = nrnmpi_getid(recv);
#if debug
printf("handle LOOK_TAKE_RESULT for %x pid=%d\n", cid, index);
#endif
		index = BBSDirectServer::server_->look_take_result(index, &send);
#if debug
printf("handle sending back id=%d\n", index);
#endif
		nrnmpi_bbssend(cid, index+1, send);
		if (index) {
			nrnmpi_unref(send);
		}
		break;
	case TAKE_TODO:
#if debug
printf("handle TAKE_TODO for %x\n", cid);
#endif
		if (server_->remaining_context_cnt_ > 0
		    && server_->send_context(cid)) {
#if debug
printf("handle sent back a context\n");
#endif
			break;
		}
		index = BBSDirectServer::server_->look_take_todo(&send);
		if (index) {
#if debug
printf("handle sending back id=%d\n", index);
#endif
			nrnmpi_bbssend(cid, index+1, send);		
			nrnmpi_unref(send);
		}else{
#if debug
printf("handle add_looking_todo\n");
#endif
			BBSDirectServer::server_->add_looking_todo(cid);
		}
		break;
	case HELLO:
#if debug
printf("handle HELLO from %x when cross=%g\n", cid, hoc_cross_x_);
#endif
		nrnmpi_pkbegin(recv);
		nrnmpi_enddata(recv);
		nrnmpi_bbssend(cid, HELLO, recv);
		break;
	default:
printf("unknown message\n");
		break;
	}
	nrnmpi_unref(recv);
}