📄 webtraf.cc
字号:
return a;}Node* WebTrafPool::picksrc() { int n = int(floor(Random::uniform(0, nClient_))); assert((n >= 0) && (n < nClient_)); return client_[n];}Node* WebTrafPool::pickdst() { int n = int(floor(Random::uniform(0, nServer_))); assert((n >= 0) && (n < nServer_)); return(server_[n].get_node());}// pick end points for a new TCP connectionvoid WebTrafPool::pick_ep(TcpAgent** tcp, Agent** snk) { // Choose source *tcp = picktcp(); // Choose destination if (fulltcp_) { *snk = picktcp(); } else { *snk = picksink(); }}// Launch a request for a particular objectvoid WebTrafPool::launchReq(Node *src_, void* ClntData, int obj, int size) { TcpAgent *ctcp; Agent *csnk; // Allocation new TCP connections for both directions pick_ep(&ctcp, &csnk); WebPage* pg = (WebPage*)ClntData; // Setup TCP connection and done Tcl::instance().evalf("%s launch-req %d %d %s %s %s %s %d %d", name(), obj, pg->id(), src_->name(), pg->dst()->name(), ctcp->name(), csnk->name(), size, ClntData); // Debug only // $numPacket_ $objectId_ $pageId_ $sessionId_ [$ns_ now] src dst#if 0 printf("%d \t %d \t %d \t %d \t %g %d %d\n", size, obj, pg->id(), id_, Scheduler::instance().clock(), src_->address(), pg->dst()->address()); printf("** Tcp agents %d, Tcp sinks %d\n", nTcp(),nSink());#endif}// Launch a request for a particular objectvoid WebTrafPool::launchResp(int obj_id, Node *svr_, Node *clnt_, Agent *tcp, Agent* snk, int size, void *ClntData) { int pid; pid = obj_id; // Get webpage (client data) if any if (ClntData) { WebPage* pg = (WebPage*)ClntData; pid = pg->id(); } // Setup TCP connection and done Tcl::instance().evalf("%s launch-resp %d %d %s %s %s %s %d %d", name(), obj_id, pid, svr_->name(), clnt_->name(), tcp->name(), snk->name(), size, ClntData); // Debug only // $numPacket_ $objectId_ $pageId_ $sessionId_ [$ns_ now] src dst#if 0 printf("%d \t %d \t %d \t %d \t %g %d %d\n", size, obj, pg->id(), id_, Scheduler::instance().clock(), src_->address(), pg->dst()->address()); printf("** Tcp agents %d, Tcp sinks %d\n", nTcp(),nSink());#endif}// Given sever's node id, find serverint WebTrafPool::find_server(int sid) { int n = 0; while (server_[n].get_nid() != sid && n < nServer_) { n++; } return(n);} int WebTrafPool::command(int argc, const char*const* argv) { // Debojyoti Dutta ... for asim if (argc == 2){ if (strcmp(argv[1], "use-asim") == 0) { asimflag_ = 1; //Tcl::instance().evalf("puts \"Here\""); return (TCL_OK); } } else if (argc == 3) { if (strcmp(argv[1], "set-num-session") == 0) { if (session_ != NULL) { for (int i = 0; i < nSession_; i++) delete session_[i]; delete []session_; } nSession_ = atoi(argv[2]); session_ = new WebTrafSession*[nSession_]; memset(session_, 0, sizeof(WebTrafSession*)*nSession_); return (TCL_OK); } else if (strcmp(argv[1], "set-num-server") == 0) { nServer_ = atoi(argv[2]); if (server_ != NULL) delete []server_; server_ = new WebServer[nServer_]; for (int i = 0; i < nServer_; i++) { server_[i] = WebServer(this); }; return (TCL_OK); } else if (strcmp(argv[1], "set-num-client") == 0) { nClient_ = atoi(argv[2]); if (client_ != NULL) delete []client_; client_ = new Node*[nClient_]; return (TCL_OK); } else if (strcmp(argv[1], "set-interPageOption") == 0) { int option = atoi(argv[2]); if (session_ != NULL) { for (int i = 0; i < nSession_; i++) { WebTrafSession* p = session_[i]; p->set_interPageOption(option); } } return (TCL_OK); } else if (strcmp(argv[1], "doneObj") == 0) { WebPage* p = (WebPage*)atol(argv[2]); // printf("doneObj for Page id: %d\n", p->id()); p->doneObject(); return (TCL_OK); } else if (strcmp(argv[1], "set-server-mode") == 0) { // <obj> set-server-mode <mode> int mode = atoi(argv[2]); for (int n = 0; n < nServer_; n++) { server_[n].set_mode(mode); } return (TCL_OK); } else if (strcmp(argv[1], "set-server-rate") == 0) { // <obj> set-server-rate <rate> int rate = atoi(argv[2]); for (int n = 0; n < nServer_; n++) { server_[n].set_rate(rate); } return (TCL_OK); } else if (strcmp(argv[1], "set-server-qlimit") == 0) { // <obj> set-server-qlimit <qlimit> int qlimit = atoi(argv[2]); for (int n = 0; n < nServer_; n++) { server_[n].set_queue_limit(qlimit); } return (TCL_OK); } } else if (argc == 4) { if (strcmp(argv[1], "set-server") == 0) { Node* s = (Node*)lookup_obj(argv[3]); if (s == NULL) return (TCL_ERROR); int n = atoi(argv[2]); if (n >= nServer_) { fprintf(stderr, "Wrong server index %d\n", n); return TCL_ERROR; } server_[n].set_node(s); return (TCL_OK); } else if (strcmp(argv[1], "set-client") == 0) { Node* c = (Node*)lookup_obj(argv[3]); if (c == NULL) return (TCL_ERROR); int n = atoi(argv[2]); if (n >= nClient_) { fprintf(stderr, "Wrong client index %d\n", n); return TCL_ERROR; } client_[n] = c; return (TCL_OK); } else if (strcmp(argv[1], "recycle") == 0) { // <obj> recycle <tcp> <sink> // // Recycle a TCP source/sink pair Agent* tcp = (Agent*)lookup_obj(argv[2]); Agent* snk = (Agent*)lookup_obj(argv[3]); if ((tcp == NULL) || (snk == NULL)) return (TCL_ERROR); if (fulltcp_) { delete tcp; delete snk; } else if (!dont_recycle_) { // PS: hmm.. who deletes the agents? // PS: plain delete doesn't seem to work // Recyle both tcp and sink objects nTcp_++; // XXX TBA: recycle tcp agents insertAgent(&tcpPool_, tcp); nSink_++; insertAgent(&sinkPool_, snk); //printf("R# %d\n", dbTcp_r++); } return (TCL_OK); } else if (strcmp(argv[1], "set-server-rate") == 0) { // <obj> set_rate <server> <size> int sid = atoi(argv[2]); int rate = atoi(argv[3]); int n = find_server(sid); if (n >= nServer_) return (TCL_ERROR); server_[n].set_rate(rate); return (TCL_OK); } else if (strcmp(argv[1], "set-server-mode") == 0) { // <obj> set-mode <server> <mode> int sid = atoi(argv[2]); int mode = atoi(argv[3]); int n = find_server(sid); if (n >= nServer_) return (TCL_ERROR); server_[n].set_mode(mode); return (TCL_OK); } else if (strcmp(argv[1], "set-server-qlimit") == 0) { // <obj> set-server-qlimit <server> <qlimit> int sid = atoi(argv[2]); int qlimit = atoi(argv[3]); int n = find_server(sid); if (n >= nServer_) return (TCL_ERROR); server_[n].set_queue_limit(qlimit); return (TCL_OK); } } else if (argc == 9) { if (strcmp(argv[1], "create-session") == 0) { // <obj> create-session <session_index> // <pages_per_sess> <launch_time> // <inter_page_rv> <page_size_rv> // <inter_obj_rv> <obj_size_rv> int n = atoi(argv[2]); if ((n < 0)||(n >= nSession_)||(session_[n] != NULL)) { fprintf(stderr,"Invalid session index %d\n",n); return (TCL_ERROR); } int npg = (int)strtod(argv[3], NULL); double lt = strtod(argv[4], NULL); WebTrafSession* p = new WebTrafSession(this, picksrc(), npg, n, fulltcp_, recycle_page_); int res = lookup_rv(p->interPage(), argv[5]); res = (res == TCL_OK) ? lookup_rv(p->pageSize(), argv[6]) : TCL_ERROR; res = (res == TCL_OK) ? lookup_rv(p->interObj(), argv[7]) : TCL_ERROR; res = (res == TCL_OK) ? lookup_rv(p->objSize(), argv[8]) : TCL_ERROR; if (res == TCL_ERROR) { delete p; fprintf(stderr, "Invalid random variable\n"); return (TCL_ERROR); } p->sched(lt); session_[n] = p; // Debojyoti added this for asim if(asimflag_){ // Asim stuff. Added by Debojyoti Dutta // Assumptions exist //Tcl::instance().evalf("puts \"Here\""); double lambda = (1/(p->interPage())->avg())/(nServer_*nClient_); double mu = ((p->objSize())->value()); //Tcl::instance().evalf("puts \"Here\""); for (int i=0; i<nServer_; i++){ for(int j=0; j<nClient_; j++){ // Set up short flows info for asim Tcl::instance().evalf("%s add2asim %d %d %lf %lf", this->name(),server_[i].get_nid(),client_[j]->nodeid(),lambda, mu); } } //Tcl::instance().evalf("puts \"Here\""); } return (TCL_OK); } else if (strcmp(argv[1], "job_arrival") == 0) { //$self job_arrival $id $clnt $svr $tcp $snk $size $pobj int obj_id = atoi(argv[2]); Node* clnt_ = (Node*)lookup_obj(argv[3]); Node* svr_ = (Node*)lookup_obj(argv[4]); // TCP source and sink pair Agent* tcp = (Agent*)lookup_obj(argv[5]); Agent* snk = (Agent*)lookup_obj(argv[6]); int size = atoi(argv[7]); void* data = (void *)atol(argv[8]); int sid = svr_->nodeid(); int n = find_server(sid); if (n >= nServer_) return (TCL_ERROR); double delay = server_[n].job_arrival(obj_id, clnt_, tcp, snk, size, data); Tcl::instance().resultf("%f", delay); return (TCL_OK); } } return PagePool::command(argc, argv);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -