00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "webserver.h"
00033
00034 WebServer::WebServer(WebTrafPool *webpool) {
00035 web_pool_ = webpool;
00036
00037
00038 busy_ = 0;
00039
00040
00041
00042
00043
00044 set_mode(0);
00045
00046
00047 set_rate(1);
00048
00049
00050 head = tail = NULL;
00051 queue_size_ = 0;
00052 queue_limit_ = 0;
00053
00054
00055 }
00056
00057
00058 void WebServer::set_rate(double s_rate) {
00059 rate_ = s_rate;
00060 }
00061
00062
00063 void WebServer::set_mode(int s_mode) {
00064 mode_ = s_mode;
00065 }
00066
00067
00068 void WebServer::set_queue_limit(int limit) {
00069 queue_limit_ = limit;
00070 }
00071
00072
00073
00074 int WebServer::get_nid() {
00075 return(node->nodeid());
00076 }
00077
00078
00079 void WebServer::set_node(Node *n) {
00080 node = n;
00081 }
00082
00083 Node* WebServer::get_node() {
00084 return(node);
00085 }
00086
00087 double WebServer::job_arrival(int obj_id, Node *clnt, Agent *tcp, Agent *snk, int size, void *data) {
00088
00089 if (! mode_) {
00090 web_pool_->launchResp(obj_id, node, clnt, tcp, snk, size, data);
00091
00092 return 1;
00093 }
00094
00095
00096 if (!queue_limit_ || queue_size_ < queue_limit_) {
00097
00098 job_s *new_job = new(job_s);
00099 new_job->obj_id = obj_id;
00100 new_job->clnt = clnt;
00101 new_job->tcp = tcp;
00102 new_job->snk = snk;
00103 new_job->size = size;
00104 new_job->data = data;
00105 new_job->next = NULL;
00106
00107
00108 if (tail)
00109 tail->next = new_job;
00110 else
00111 head = new_job;
00112 tail = new_job;
00113
00114 queue_size_++;
00115 } else {
00116
00117
00118 return 0;
00119 }
00120
00121
00122 if (!busy_)
00123 schedule_next_job();
00124
00125 return 1;
00126 }
00127
00128
00129 double WebServer::job_departure() {
00130 if (head) {
00131 web_pool_->launchResp(head->obj_id, node, head->clnt, head->tcp, head->snk, head->size, head->data);
00132
00133
00134 job_s *p = head;
00135 if (head->next)
00136 head = head->next;
00137 else
00138 head = tail = NULL;
00139
00140 delete(p);
00141 queue_size_--;
00142 }
00143
00144
00145 schedule_next_job();
00146 return 0;
00147 }
00148
00149 void WebServer::schedule_next_job() {
00150 job_s *p, *q;
00151
00152 if (head) {
00153
00154 if (mode_ == STF_DELAY) {
00155
00156 p = q = head;
00157 while (q) {
00158 if (p->size > q->size)
00159 p = q;
00160
00161 q = q->next;
00162 }
00163
00164
00165 int obj_id = p->obj_id;
00166 Node *clnt = p->clnt;
00167 int size = p->size;
00168 void *data = p->data;
00169
00170 p->obj_id = head->obj_id;
00171 p->clnt = head->clnt;
00172 p->size = head->size;
00173 p->data = head->data;
00174
00175 head->obj_id = obj_id;
00176 head->clnt = clnt;
00177 head->size = size;
00178 head->data = data;
00179 }
00180
00181
00182 double delay_ = head->size / rate_;
00183 resched(delay_);
00184 busy_ = 1;
00185
00186 } else
00187 busy_ = 0;
00188 }
00189
00190
00191 void WebServer::expire(Event *e) {
00192 job_departure();
00193 }