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);
			}
		}
	}
}
Example #3
0
 LevelorderIterator(TreeNode* root){
   queue.add(root);
   if(queue.size() < 1)
     isDone = true;
 }