void* scheduler(void *t) { if(!DEBUG_MODE) { sleep(sleept); } struct requests r; int size=0; if (sched==FCFS) { while(1) { if(!q.empty()) { q.get(r,size); pthread_mutex_lock(&exec_queue); tqueue.add(r,size); pthread_mutex_unlock(&exec_queue); } } } else { while(1) { if(!q.empty()) { q.getshrt(r,size); pthread_mutex_lock(&exec_queue); tqueue.add(r,size); pthread_mutex_unlock(&exec_queue); } } } return NULL; }
void handlerq(int n, std::string log){ char msg[1000], *headers[3]; char c; int rcvd,fsize; int i=0; int flag=0; struct requests req; do { rcvd=read(n, &c, 1); msg[i]=c; if(msg[i]== '\n'&& msg[i-1] == '\r') { flag++; } else if(msg[i]!='\r')flag=0; if(i==2) { if((msg[0]!='G')&&(msg[1]!='E')&&(msg[2]!='T')) { msg[2]='\0'; break; } } else if(i==3) { if((msg[0]!='H')&&(msg[1]!='E')&&(msg[2]!='A')&&(msg[3]!='D')) { msg[3]='\0'; break; } } if (flag==2) { msg[i+1]='\0'; break; } i++; }while(1); if (rcvd<0) { std::cerr<<"some error in recv()"<<std::endl; close(n); } else if (rcvd==0) { std::cerr<<"Client disconnected unexpectedly"<<std::endl; } else { log.append(" - ["); log.append(get_timestamp()); log.erase(log.length()-1); req.log=log; headers[0] = strtok (msg, " \t\n"); headers[1] = strtok (NULL, " \t"); headers[2] = strtok (NULL, " \t\n"); if ((headers[0]==NULL)||(headers[1]==NULL)||(headers[2]==NULL)) { shutdown (n, SHUT_RDWR); close(n); } else { int hlength=0; char fullpath[200]; strcpy(fullpath,root); if ( strncmp(headers[0], "GET\0", 4)==0 ) { req.is_dir=false; req.path_found=true; if(headers[1][1]=='~') { headers[1]+=2; strcat(fullpath,headers[1]); } else { strcpy(fullpath,headers[1]); } hlength=strlen(fullpath); if(fullpath[hlength-1]=='/') { req.is_dir=true; } else { if((fsize=get_fsize(fullpath))==-1) { req.path_found=false; } } strcpy(req.request_type,headers[0]); strcpy(req.path,fullpath); req.sockfd=n; strcpy(req.http_ver,headers[2]); q.add(req,fsize); } else if ( strncmp(headers[0], "HEAD\0", 4)==0) { req.is_dir=false; req.path_found=true; if(headers[1][1]=='~') { headers[1]+=2; strcat(fullpath,headers[1]); } else { strcpy(fullpath,headers[1]); } hlength=strlen(fullpath); if(fullpath[hlength-1]=='/') { req.is_dir=true; } else { if((fsize=get_fsize(fullpath))==-1) { req.path_found=false; } } strcpy(req.request_type,headers[0]); strcpy(req.path,fullpath); req.sockfd=n; strcpy(req.http_ver,headers[2]); q.add(req,0); } else { shutdown (n, SHUT_RDWR); close(n); } } } }
LevelorderIterator(TreeNode* root){ queue.add(root); if(queue.size() < 1) isDone = true; }