亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? procpool.cpp

?? 自動(dòng)調(diào)整大小的進(jìn)程池類的實(shí)現(xiàn)。 一個(gè)運(yùn)用進(jìn)程池的server類。 一個(gè)socket類。
?? CPP
字號:
#include "procpool.h"

//全局變量,應(yīng)用程序需用extern聲明此值進(jìn)行程序控制
volatile sig_atomic_t  QuitFlag=0;

SimpleLog *ProcPool::__logfile=NULL;

ProcPool::ProcPool(SimpleLog &logfile,int& max,int& init,int &low,int& high,int& inc,int& dec)
{
	__logfile= &logfile;
	if(max<=0||max<init||low<high||inc<=0||dec<=0)
		warn();
	MaxNum=max;
	InitNum=init;
	FreeLowNum=low;
	FreeHighNum=high;
	IncNum=inc;
	DecNum=dec;
	chld_num=0;
	chld_avail=0;
	selectTimeOut=0;
	if(MaxNum>0)
	{
		CldInfo=new ChildInfo[MaxNum];
		assert(CldInfo!=NULL);
	}
	else
	{
		CldInfo=NULL;
	}
	_acceptlock=new semaphore( );
	assert(_acceptlock!=NULL);
	__logfile->Userlog(DEBUG,"ProcPool Constructor with 7 param,Max[%d],Init[%d],FreeLow[%d],FreeHigh[%d],Inc[%d], \
	Dec[%d]",MaxNum,InitNum,FreeLowNum,FreeHighNum,IncNum,DecNum);
	
}
ProcPool::ProcPool(SimpleLog &logfile,int& max,int& init,int &low,int& high,int& inc,int& dec,int &timeout)
{
	__logfile= &logfile;
	if(max<=0||max<init||low<high||inc<=0||dec<=0)
		warn();
	MaxNum=max;
	InitNum=init;
	FreeLowNum=low;
	FreeHighNum=high;
	IncNum=inc;
	DecNum=dec;
	chld_num=0;
	chld_avail=0;
	selectTimeOut=timeout;
	if(MaxNum>0)
	{
		CldInfo=new ChildInfo[MaxNum];
		assert(CldInfo!=NULL);
	}
	else
	{
		CldInfo=NULL;
	}
	_acceptlock=new semaphore( );
	assert(_acceptlock!=NULL);
	__logfile->Userlog(DEBUG,"ProcPool Constructor with 8 param,Max[%d],Init[%d],FreeLow[%d],FreeHigh[%d],Inc[%d], \
	Dec[%d],TimeOut[%d]",MaxNum,InitNum,FreeLowNum,FreeHighNum,IncNum,DecNum,selectTimeOut);
}

ProcPool::ProcPool(SimpleLog &logfile)
{
	__logfile= &logfile;
	MaxNum=DEFAULT_MAXNUM;
	InitNum=DEFAULT_INITNUM;
	FreeLowNum=DEFAULT_FREELOWNUM;
	FreeHighNum=DEFAULT_FREEHIGHNUM;
	IncNum=DEFAULT_INCNUM;
	DecNum=DEFAULT_DECNUM;
	chld_num=0;
	chld_avail=0;
	selectTimeOut=0;
	if(MaxNum>0)
	{
		CldInfo=new ChildInfo[MaxNum];
		assert(CldInfo!=NULL);
	}
	else
	{
		CldInfo=NULL;
	}
	_acceptlock=new semaphore( );
	assert(_acceptlock!=NULL);
	__logfile->Userlog(DEBUG,"ProcPool Constructor with default param");
}

ProcPool::~ProcPool()
{
	KillAll();
	sleep(2);
	delete CldInfo;
	CldInfo=NULL;
	__logfile->Userlog(DEBUG,"ProcPool destructor,PID[%ld]",getpid());
}

int ProcPool::ScanChild()
{
	fd_set rds;
	int maxfd=0;
	struct timeval timeout;
	struct timeval *TV=NULL;
	
	FD_ZERO(&rds);
	timeout.tv_sec  = 0;
  timeout.tv_usec = 0;
	if(selectTimeOut>0)
	{
		timeout.tv_usec = selectTimeOut*1000;
		TV=&timeout;
	}
	//cout<<"IN scan,chld_avail="<<chld_avail<<endl;
	//遍歷子進(jìn)程狀態(tài)類,重置讀集合
	for(int i=0,j=0;i<MaxNum&&j<chld_num;i++)
	{
		if( (CldInfo+i)->pid>0 )
		{
			j++;
			FD_SET( (CldInfo+i)->pfd,&rds);
    	maxfd=maxfd>(CldInfo+i)->pfd?maxfd:(CldInfo+i)->pfd;
		}
	}
	
	int result=select(maxfd+1,&rds,NULL,NULL,TV);
	
	if(result==0)
	{
		__logfile->Userlog(INFO,"select timeout");
		return 0;//超時(shí)
	}
	if(result<0)
	{
		__logfile->Userlog(ERROR,"select error[%s]",strerror(errno));
		return -1;
	}
		
	for(int i=0,j=0;i<MaxNum&&j<chld_num;i++)
  {
    if( (CldInfo+i)->pid>0&&FD_ISSET( (CldInfo+i)->pfd,&rds ) )
    {
    	CHILD_STATUS status=CS_UNKNOWN;
    	int n=read( (CldInfo+i)->pfd,&status,sizeof(status));
    	if(n==0)//如果空閑子進(jìn)程退出
    	{
    		if( (CldInfo+i)->state==CS_WAITING )
    		{
    			//cout<<"n==0,avail --"<<endl;
					chld_avail--;
				}
				__logfile->Userlog(INFO,"child proc [%ld] exit",(CldInfo+i)->pid);
				(CldInfo+i)->pid=-1;
				close((CldInfo+i)->pfd);
				(CldInfo+i)->state=CS_UNKNOWN;
				chld_num--;
    	}
    	else if(n>0)
    	{
    		if(status==CS_PROCESSING)
    		{
    			//cout<<"status==PRO,avail --"<<endl;
    			(CldInfo+i)->state=CS_PROCESSING;
    			chld_avail--;
    			__logfile->Userlog(DEBUG,"child proc [%ld] busy",(CldInfo+i)->pid);
    		}
    		else
    		{
    			(CldInfo+i)->state=CS_WAITING;
    			chld_avail++;
    			__logfile->Userlog(DEBUG,"child proc [%ld] free",(CldInfo+i)->pid);
    		}
    	}
    	else/*如果出錯(cuò),則程序退出*/
    	{
    		__logfile->Userlog(FATAL,"pipe read error[%s]",strerror(errno));
    		return -2;
    	}
    }
    if( (CldInfo+i)->pid>0 )
    	j++;
   }
   //判斷空閑進(jìn)程數(shù)是多還是少,并由此增加或是減少進(jìn)程
   if( chld_avail > FreeHighNum )
   	{
   		__logfile->Userlog(INFO,"kill free child");
   		KillIdle();
   	}
   else if( chld_avail < FreeLowNum )
   	{
   		//cout<<"chld_avail="<<chld_avail<<endl;
   		__logfile->Userlog(INFO,"increase child");
   		IncreaseChld(IncNum);
   	}
		return 0;
}

bool ProcPool::IncreaseChld(int &num)
{
	//cout<<"will create "<<num<<" child"<<endl;
	int pfd[2];
	for(int i=0,idx=0;i<num;i++)
	{
		for( ; (CldInfo+i)->pid > 0;idx++ )
			if( idx == MaxNum-1 )
				return true;
		int result=pipe(pfd);
		//if(result <0 )
		//	cout<<"創(chuàng)建管道失敗"<<endl;
		
		(CldInfo+i)->pid=fork();
		
		if( (CldInfo+i)->pid > 0 )/*父進(jìn)程*/
		{
			(CldInfo+i)->state=CS_WAITING;
			(CldInfo+i)->pfd=pfd[0];
			chld_num++;
			chld_avail++;
			//cout<<"chld_avail= "<<chld_avail<<endl;
			close(pfd[1]);
			__logfile->Userlog(INFO,"increase child [%ld]",(CldInfo+i)->pid);
		}
		else if( (CldInfo+i)->pid == 0 )/*子進(jìn)程*/
		{
			//修改子進(jìn)程中相應(yīng)類的信息
			//子進(jìn)程繼承了該類的所有信息,但是一些信息需要修改
			close(pfd[0]);
			(CldInfo+i)->pid=getpid();
			(CldInfo+i)->pfd=pfd[1];
			ChildProc(i);
		}
		else
		{
			__logfile->Userlog(FATAL,"fork error[%s]",strerror(errno));
    	return false;
		}
	}
	return true;
}

void ProcPool::KillChld(pid_t &pid,int idx)
{
	kill(pid,SIGINT);
	pid_t cpid=waitpid( pid,NULL,0 );
	cout<<cpid<<"exit"<<endl;
	__logfile->Userlog(INFO,"kill pid [%ld]",pid);
	if( idx >= 0 )
	{
		if( (CldInfo+idx)->pid == pid )
		{
			chld_avail--;
			chld_num--;
			close( (CldInfo+idx)->pfd );
			(CldInfo+idx)->pid = -1;
			(CldInfo+idx)->pfd = -1;
			(CldInfo+idx)->state = CS_UNKNOWN;
		}
	}
	else
	{
		for(int i=0;i < MaxNum;i++)
		{
			if( (CldInfo+i)->pid == pid )
			{
				chld_avail--;
				chld_num--;
				close( (CldInfo+i)->pfd );
				(CldInfo+i)->pid = -1;
				(CldInfo+i)->pfd = -1;
				(CldInfo+i)->state = CS_UNKNOWN;
				break;
			}
		}
	}
	return;
}

void ProcPool::KillIdle()
{
	//cout<<"in killidle"<<endl;
	for(int i=0;i<MaxNum;i++)
	{
		if( (CldInfo+i)->state == CS_WAITING&&(CldInfo+i)->pid >1&&chld_avail>FreeLowNum )
		{
			__logfile->Userlog(INFO,"pid [%ld] idle,will kill it",(CldInfo+i)->pid);
			KillChld((CldInfo+i)->pid,i);
		}
		if( chld_avail==FreeLowNum )
			break;
	}
	return;
}

void ProcPool::KillAll()
{
	__logfile->Userlog(DEBUG,"in kill all");
	for(int i=0;i<MaxNum;i++)
	{
		if( (CldInfo+i)->pid >1 )
		{
			KillChld((CldInfo+i)->pid,i);
		}
	}
	return;
}

int ProcPool::ClearUp()
{
	__logfile->Userlog(DEBUG,"in clear up");
	KillAll();
	return 0;
}

bool ProcPool::Init()
{
	__logfile->Userlog(DEBUG,"in ProcPool init");
	return IncreaseChld(InitNum);
}

void ProcPool::warn()
{
	__logfile->Userlog(ERROR,"初始化參數(shù)不滿足下列條件之一[最大進(jìn)程數(shù)>0,最大進(jìn)程數(shù)>=初始進(jìn)程數(shù),最大空閑數(shù)>最小空閑數(shù),最大空閑數(shù)>0,最小空閑數(shù)>0]");
}


void ProcPool::ChildProc(int& idx)
{
	__logfile->Userlog(DEBUG,"in child proc[%ld]",getpid());
	while(!QuitFlag)
	{
		//cout<<"child in"<<endl;
		void *task=NULL;
		if(!(task=WaitTask()))
			continue;
		(CldInfo+idx)->NotifyBusy();
		__logfile->Userlog(DEBUG,"[%ld] get task over,will do",getpid());
		doTask(task);
		__logfile->Userlog(DEBUG,"[%ld] do task over,now free",getpid());
		(CldInfo+idx)->NotifyFree();
	}
	//cout<<"child out"<<endl;
	close((CldInfo+idx)->pfd);
	exit(0);
}

void ProcPool::PrintPool()
{
	//打印到屏幕
	cout<<"最大進(jìn)程數(shù)目			["<<MaxNum<<"]"<<endl;
	cout<<"初始子進(jìn)程數(shù)目		["<<InitNum<<"]"<<endl;
	cout<<"最低空閑進(jìn)程數(shù)目	["<<FreeLowNum<<"]"<<endl;
	cout<<"最高空閑進(jìn)程數(shù)目	["<<FreeHighNum<<"]"<<endl;
	cout<<"每次增加的進(jìn)程數(shù)	["<<IncNum<<"]"<<endl;
	cout<<"每次減少的進(jìn)程數(shù)	["<<DecNum<<"]"<<endl;
	cout<<"總的進(jìn)程數(shù)				["<<chld_num<<"]"<<endl;
	cout<<"總的空閑進(jìn)程數(shù)		["<<chld_avail<<"]"<<endl;
	cout<<"select的超時(shí)時(shí)間	["<<selectTimeOut<<"]毫秒"<<endl;
	for(int i=0;i<MaxNum;i++)
	{
		if((CldInfo+i)->pid>0)
		{
			if((CldInfo+i)->state==CS_WAITING)
				cout<<"進(jìn)程["<<(CldInfo+i)->pid<<"],狀態(tài)[空閑]"<<endl;
			else
				cout<<"進(jìn)程["<<(CldInfo+i)->pid<<"],狀態(tài)[忙碌]"<<endl;
		}
	}
	//打印到日志
	__logfile->Userlog(FATAL,"MaxNum        [%d]",MaxNum);
	__logfile->Userlog(FATAL,"InitNum       [%d]",InitNum);
	__logfile->Userlog(FATAL,"FreeLowNum    [%d]",FreeLowNum);
	__logfile->Userlog(FATAL,"FreeHighNum   [%d]",FreeHighNum);
	__logfile->Userlog(FATAL,"IncNum        [%d]",IncNum);
	__logfile->Userlog(FATAL,"DecNum        [%d]",DecNum);
	__logfile->Userlog(FATAL,"chld_num      [%d]",chld_num);
	__logfile->Userlog(FATAL,"chld_avail    [%d]",chld_avail);
	__logfile->Userlog(FATAL,"selectTimeOut [%d]",selectTimeOut);
	for(int i=0;i<MaxNum;i++)
	{
		if((CldInfo+i)->pid>0)
		{
			if((CldInfo+i)->state==CS_WAITING)
				__logfile->Userlog(FATAL,"進(jìn)程[%ld],狀態(tài)[空閑]",(CldInfo+i)->pid);
			else
				__logfile->Userlog(FATAL,"進(jìn)程[%ld],狀態(tài)[忙碌]",(CldInfo+i)->pid);
		}
	}
}


ProcPool::semaphore::semaphore( key_t& keyval,int& numsems )
{
	_sid=0;
	_semnum=numsems;
	_keyval=keyval;
	
}

ProcPool::semaphore::semaphore( )
{
	_sid=0;
	_semnum=1;
	_keyval=IPC_PRIVATE;
	__logfile->Userlog(DEBUG,"in semaphore default constructor,will create()");
	create( );
	__logfile->Userlog(DEBUG,"in semaphore default constructor,create() over,will init");
	init(0,1);
	__logfile->Userlog(DEBUG,"in semaphore default constructor,init over");
}


bool ProcPool::semaphore::create( )
{
	if( _semnum <= 0)
		return false;
	if( (_sid=semget(_keyval,_semnum,IPC_CREAT|0660))==-1 )
	{
		__logfile->Userlog(ERROR,"create semaphore error[%s]",strerror(errno));
		return false;
	}
	__logfile->Userlog(INFO,"create semaphore[%ld]",_sid);
	return true;
}

union semun
{
	int val;
	struct semid_ds *buf;
	unsigned short *array;
};

bool ProcPool::semaphore::init(int seq ,int value)
{
	if( seq < 0||(seq+1) >_semnum )
		return false;
	union semun semopts;
	semopts.val=value;
	if( semctl(_sid,seq,SETVAL,semopts)<0 )
	{
		__logfile->Userlog(ERROR,"set semaphore value error[%s]",strerror(errno));
		return false;
	}
	__logfile->Userlog(DEBUG,"set semaphore value");
	return true;
	
}
bool ProcPool::semaphore::lock( int seq )
{
	__logfile->Userlog(DEBUG,"pid [%ld] in semaphore lock",getpid());
	struct sembuf sem_lock;/*={member,-1,SEM_UNDO}	*/
	memset(&sem_lock,0,sizeof(struct sembuf));
	//if (member<0||member>MAXSEMNUM)
	if ( seq<0 )
		return false;	
	sem_lock.sem_num=seq;
	sem_lock.sem_op=-1;
	sem_lock.sem_flg=SEM_UNDO;
	
	if( semop( _sid,&sem_lock,1 )<0 )
	{
		__logfile->Userlog(ERROR,"pid [%ld] semaphore lock error[%s]",getpid(),strerror(errno));
		return false;
	}
	__logfile->Userlog(DEBUG,"pid [%ld] out semaphore lock",getpid());
	return true;
}

bool ProcPool::semaphore::unlock( int seq )
{
	__logfile->Userlog(DEBUG,"pid [%ld] in semaphore unlock",getpid());
	struct sembuf sem_lock;/*={member,-1,SEM_UNDO}	*/
	memset(&sem_lock,0,sizeof(struct sembuf));
	//if (member<0||member>MAXSEMNUM)
	if ( seq<0 )
		return false;	
	sem_lock.sem_num=seq;
	sem_lock.sem_op=1;
	sem_lock.sem_flg=SEM_UNDO;
	if( semop( _sid,&sem_lock,1 )<0 )
	{
		__logfile->Userlog(ERROR,"pid [%ld] semaphore unlock error[%s]",getpid(),strerror(errno));
		return false;
	}
	__logfile->Userlog(DEBUG,"pid [%ld] out semaphore lock",getpid());
	return true;
}

void ProcPool::semaphore::remove( )
{
	__logfile->Userlog(DEBUG,"pid [%ld] in semaphore remove",getpid());
	semctl( _sid,0,IPC_RMID,0 );
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久国产字幕高潮| 精品人伦一区二区色婷婷| 日本一区中文字幕| 国产精品麻豆视频| 日韩午夜在线播放| 欧美久久婷婷综合色| 国产黄色精品网站| 肉肉av福利一精品导航| 亚洲欧洲精品成人久久奇米网| 欧美三级午夜理伦三级中视频| 成人丝袜高跟foot| 美女任你摸久久| 午夜欧美视频在线观看 | 欧美一区二区在线看| 不卡av电影在线播放| 日韩国产欧美在线播放| 一区二区三区鲁丝不卡| 国产欧美一区二区精品性色| 日韩精品一区二区三区在线| 色综合一区二区| 狠狠网亚洲精品| 蜜臀久久99精品久久久画质超高清| 亚洲三级在线播放| 国产性天天综合网| 欧美一区二区视频在线观看2022| 99re免费视频精品全部| 国产白丝网站精品污在线入口| 日韩不卡免费视频| 偷拍日韩校园综合在线| 亚洲乱码日产精品bd| 亚洲欧美色综合| 国产欧美日韩亚州综合 | 91麻豆精品国产无毒不卡在线观看 | 91女厕偷拍女厕偷拍高清| 精品一区二区久久久| 水野朝阳av一区二区三区| 国产在线看一区| 国产乱色国产精品免费视频| hitomi一区二区三区精品| 国产v综合v亚洲欧| 日本aⅴ免费视频一区二区三区| 亚洲国产你懂的| 一区二区三区精品| 一区二区三区**美女毛片| 成人免费小视频| 中文字幕永久在线不卡| 国产精品久久久久久久裸模| 亚洲国产岛国毛片在线| 国产女主播一区| 国产区在线观看成人精品| 亚洲精品在线观看网站| 久久日韩精品一区二区五区| 精品国产污污免费网站入口| 日韩欧美精品三级| 久久在线观看免费| 久久综合久久鬼色| 欧美激情一区二区三区| 国产精品第四页| 一区二区三区中文字幕在线观看| 亚洲一区二区三区四区不卡| 天天综合色天天综合色h| 久久精品国产77777蜜臀| 国产精品一卡二| 97久久超碰精品国产| 欧美亚一区二区| 日韩视频123| 欧美国产精品久久| 一区二区三区日韩在线观看| 石原莉奈在线亚洲三区| 国产一区激情在线| 一本久久精品一区二区| 日韩丝袜情趣美女图片| 中文字幕不卡在线| 亚洲制服丝袜一区| 国产综合一区二区| 91视频国产观看| 日韩午夜在线影院| 亚洲欧美激情小说另类| 老司机精品视频一区二区三区| 成人性生交大片| 欧美性videosxxxxx| 欧美精品一区二区高清在线观看| 18成人在线观看| 美脚の诱脚舐め脚责91| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 2020国产成人综合网| ...xxx性欧美| 蜜乳av一区二区| 91麻豆国产在线观看| 精品国产三级电影在线观看| 亚洲欧美日韩中文播放 | 91最新地址在线播放| 91精品国产aⅴ一区二区| 中文一区一区三区高中清不卡| 亚洲国产视频一区| 粉嫩13p一区二区三区| 欧美日韩亚洲综合在线 | 99久久精品国产一区| 欧美一区二区三区不卡| 亚洲国产高清在线观看视频| 日韩国产高清影视| 成人18视频在线播放| 91 com成人网| 一区二区国产盗摄色噜噜| 国内精品视频666| 欧美日韩极品在线观看一区| 国产精品免费aⅴ片在线观看| 午夜国产不卡在线观看视频| 国产精品中文字幕一区二区三区| 欧美疯狂做受xxxx富婆| 最新欧美精品一区二区三区| 狠狠色2019综合网| 欧美一区二区三区免费在线看| 一区二区三区中文字幕| 国产不卡免费视频| 久久久久久亚洲综合| 久久狠狠亚洲综合| 欧美午夜影院一区| 国产精品成人一区二区艾草| 国产在线精品一区二区不卡了| 91精品国产麻豆国产自产在线| 亚洲一区二区欧美日韩| 成人性生交大片免费看中文网站| 久久精品亚洲国产奇米99| 久久www免费人成看片高清| 欧洲生活片亚洲生活在线观看| 亚洲视频电影在线| 成人av网站在线观看| 久久麻豆一区二区| 国产在线日韩欧美| 日韩欧美国产午夜精品| 日韩av一级片| 欧美精品色一区二区三区| 亚洲影院在线观看| 色婷婷久久久亚洲一区二区三区 | 成人性生交大合| 国产午夜精品久久久久久久| 麻豆国产精品视频| 欧美色窝79yyyycom| 一区二区成人在线视频| 国产超碰在线一区| 久久精品日韩一区二区三区| 青青国产91久久久久久 | 91在线精品秘密一区二区| 国产欧美va欧美不卡在线| 国产a视频精品免费观看| 日韩三级av在线播放| 国产精品一色哟哟哟| 精品国产1区二区| 美女视频免费一区| 久久久久久亚洲综合影院红桃| 丝袜美腿成人在线| 91精品国产色综合久久不卡电影| 亚洲成人av电影| 欧美精品久久一区二区三区| 玉米视频成人免费看| 欧美日韩大陆一区二区| 日韩av网站在线观看| 精品国产伦理网| 国产精品夜夜嗨| 26uuu色噜噜精品一区二区| 国产另类ts人妖一区二区| 国产无人区一区二区三区| 国产成a人亚洲精| 1000部国产精品成人观看| 欧美日韩日本视频| 久久国产精品露脸对白| 欧美性猛片aaaaaaa做受| 亚洲欧洲综合另类| 欧美精品丝袜中出| 麻豆精品久久精品色综合| 久久久久久久久免费| a在线欧美一区| 一区二区三区在线视频播放| 91精品国产入口在线| 国产成人啪午夜精品网站男同| 亚洲日本青草视频在线怡红院 | 国产大片一区二区| 欧美国产丝袜视频| 欧美高清一级片在线| 国产99久久久国产精品免费看 | 麻豆国产欧美日韩综合精品二区 | 国产电影一区在线| 一区二区三区四区不卡在线| 欧美精品乱码久久久久久按摩| 国产mv日韩mv欧美| 亚洲综合小说图片| 久久久久久久综合日本| 欧美视频中文字幕| 玖玖九九国产精品| 一区二区三区中文字幕| 久久人人97超碰com| 日本黄色一区二区| 国产一区二区美女诱惑| 亚洲国产美国国产综合一区二区| 久久精品免费在线观看| 7777精品伊人久久久大香线蕉超级流畅 | 日本精品视频一区二区| 国产一二三精品| 午夜视频一区在线观看|