久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Android nativePollOnce函數解析

瀏覽:2日期:2022-09-20 09:52:16

nativePollOnce的實現函數是android_os_MessageQueue_nativePollOnce,代碼如下:

android_os_MessageQueue.cpp

static void android_os_MessageQueue_nativePollOnce(JNIEnv*env, jobject obj, jintptr, jint timeoutMillis) NativeMessageQueue*nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); //取出NativeMessageQueue對象,并調用它的pollOnce nativeMessageQueue->pollOnce(timeoutMillis);}//分析pollOnce函數void NativeMessageQueue::pollOnce(inttimeoutMillis) { mLooper->pollOnce(timeoutMillis); //重任傳遞到Looper的pollOnce函數}

Looper的pollOnce函數如下:

Looper.cpp

inline int pollOnce(int timeoutMillis) { return pollOnce(timeoutMillis, NULL, NULL, NULL);}

上面的函數將調用另外一個有4個參數的pollOnce函數,這個函數的原型如下:int pollOnce(int timeoutMillis, int* outFd, int*outEvents, void** outData)其中:

timeOutMillis參數為超時等待時間。如果為-1,則表示無限等待,直到有事件發生為止。如果值為0,則無需等待立即返回。 outFd用來存儲發生事件的那個文件描述符。 outEvents用來存儲在該文件描述符[[1]上發生了哪些事件,目前支持可讀、可寫、錯誤和中斷4個事件。這4個事件其實是從epoll事件轉化而來。后面我們會介紹大名鼎鼎的epoll。 outData用于存儲上下文數據,這個上下文數據是由用戶在添加監聽句柄時傳遞的,它的作用和pthread_create函數最后一個參數param一樣,用來傳遞用戶自定義的數據。

另外,pollOnce函數的返回值也具有特殊的意義,具體如下:

當返回值為ALOOPER_POLL_WAKE時,表示這次返回是由wake函數觸發的,也就是管道寫端的那次寫事件觸發的。 返回值為ALOOPER_POLL_TIMEOUT表示等待超時。 返回值為ALOOPER_POLL_ERROR,表示等待過程中發生錯誤。

返回值為ALOOPER_POLL_CALLBACK,表示某個被監聽的句柄因某種原因被觸發。這時,outFd參數用于存儲發生事件的文件句柄,outEvents用于存儲所發生的事件。上面這些知識是和epoll息息相關的。提示查看Looper的代碼會發現,Looper采用了編譯選項(即#if和#else)來控制是否使用epoll作為I/O復用的控制中樞。鑒于現在大多數系統都支持epoll,這里僅討論使用epoll的情況。

1.epoll基礎知識介紹

epoll機制提供了Linux平臺上最高效的I/O復用機制,因此有必要介紹一下它的基礎知識。從調用方法上看,epoll的用法和select/poll非常類似,其主要作用就是I/O復用,即在一個地方等待多個文件句柄的I/O事件。下面通過一個簡單例子來分析epoll的工作流程。

epoll工作流程分析案例

/*使用epoll前,需要先通過epoll_create函數創建一個epoll句柄。下面一行代碼中的10表示該epoll句柄初次創建時候分配能容納10個fd相關信息的緩存。對于2.6.8版本以后的內核,該值沒有實際作用,這里可以忽略。其實這個值的主要目的是確定分配一塊多大的緩存?,F在的內核都支持動態拓展這塊緩存,所以該值就沒有意義了*/ int epollHandle = epoll_create(10);/* 得到epoll句柄后,下一步就是通過epoll_ctl把需要監聽的文件句柄加入到epoll句柄中。 除了指定文件句柄本身的fd值外,同時還需要指定在該fd上等待什么事件。epoll支持四類事件, 分別是EPOLLIN(句柄可讀)、EPOLLOUT(句柄可寫),EPOLLERR(句柄錯誤)、EPOLLHUP(句柄斷)。 epoll定義了一個結構體struct epoll_event來表達監聽句柄的訴求。 假設現在有一個監聽端的socket句柄listener,要把它加入到epoll句柄中。 */ structepoll_event listenEvent; //先定義一個event /* EPOLLIN表示可讀事件,EPOLLOUT表示可寫事件,另外還有EPOLLERR,EPOLLHUP表示 系統默認會將EPOLLERR加入到事件集合中 */ listenEvent.events= EPOLLIN;//指定該句柄的可讀事件 //epoll_event中有一個聯合體叫data,用來存儲上下文數據,本例的上下文數據就是句柄自己 listenEvent.data.fd= listenEvent;/* EPOLL_CTL_ADD將監聽fd和監聽事件加入到epoll句柄的等待隊列中; EPOLL_CTL_DEL將監聽fd從epoll句柄中移除; EPOLL_CTL_MOD修改監聽fd的監聽事件,例如本來只等待可讀事件,現在需要同時等待可寫事件,那么修改listenEvent.events 為EPOLLIN|EPOLLOUT后,再傳給epoll句柄 */ epoll_ctl(epollHandle,EPOLL_CTL_ADD,listener,&listenEvent); /* 當把所有感興趣的fd都加入到epoll句柄后,就可以開始坐等感興趣的事情發生了。 為了接收所發生的事情,先定義一個epoll_event數組 */struct epoll_eventresultEvents[10]; inttimeout = -1; while(1) { /* 調用epoll_wait用于等待事件,其中timeout可以指定一個超時時間, resultEvents用于接收發生的事件,10為該數組的大小。 epoll_wait函數的返回值有如下含義: nfds大于0表示所監聽的句柄上有事件發生; nfds等于0表示等待超時; nfds小于0表示等待過程中發生了錯誤 */ int nfds= epoll_wait(epollHandle, resultEvents, 10, timeout); if(nfds== -1) { // epoll_wait發生了錯誤 } elseif(nfds == 0) { //發生超時,期間沒有發生任何事件 } else { //resultEvents用于返回那些發生了事件的信息 for(int i = 0; i < nfds; i++) { struct epoll_event & event =resultEvents[i]; if(event & EPOLLIN) { /* 收到可讀事件。到底是哪個文件句柄發生該事件呢?可通過event.data這個聯合體取得 之前傳遞給epoll的上下文數據,該上下文信息可用于判斷到底是誰發生了事件。 */ } .......//其他處理 } }}

epoll整體使用流程如上面代碼所示,基本和select/poll類似,不過作為Linux平臺最高效的I/O復用機制,這里有些內容供讀者參考,epoll的效率為什么會比select高?其中一個原因是調用方法。每次調用select時,都需要把感興趣的事件復制到內核中,而epoll只在epll_ctl進行加入的時候復制一次。另外,epoll內部用于保存事件的數據結構使用的是紅黑樹,查找速度很快。而select采用數組保存信息,不但一次能等待的句柄個數有限,并且查找起來速度很慢。當然,在只等待少量文件句柄時,select和epoll效率相差不是很多,但筆者還是推薦使用epoll。epoll等待的事件有兩種觸發條件,一個是水平觸發(EPOLLLEVEL),另外一個是邊緣觸發(EPOLLET,ET為Edge Trigger之意),這兩種觸發條件的區別非常重要。讀者可通過man epoll查閱系統提供的更為詳細的epoll機制。最后,關于pipe,還想提出一個小問題供讀者思考討論:為什么Android中使用pipe作為線程間通訊的方式?對于pipe的寫端寫入的數據,讀端都不感興趣,只是為了簡單的喚醒。POSIX不是也有線程間同步函數嗎?為什么要用pipe呢?關于這個問題的答案,可參見筆者一篇博文“隨筆之如何實現一個線程池”。

2. pollOnce函數分析

下面分析帶4個參數的pollOnce函數,代碼如下:

Looper.cpp

int Looper::pollOnce(int timeoutMillis, int*outFd, int* outEvents,void** outData) { intresult = 0; for (;;){ //一個無限循環 //mResponses是一個Vector,這里首先需要處理response while (mResponseIndex < mResponses.size()) { const Response& response = mResponses.itemAt(mResponseIndex++); ALooper_callbackFunc callback = response.request.callback; if (!callback) {//首先處理那些沒有callback的Responseint ident = response.request.ident; //ident是這個Response的idint fd = response.request.fd;int events = response.events;void* data = response.request.data;......if (outFd != NULL) *outFd = fd;if (outEvents != NULL) *outEvents = events;if (outData != NULL) *outData = data;//實際上,對于沒有callback的Response,pollOnce只是返回它的 //ident,并沒有實際做什么處理。因為沒有callback,所以系統也不知道如何處理return ident; } } if(result != 0) { if (outFd != NULL) *outFd = 0; if (outEvents != NULL) *outEvents = NULL; if (outData != NULL) *outData = NULL; return result; } //調用pollInner函數。注意,它在for循環內部 result = pollInner(timeoutMillis); }}

初看上面的代碼,可能會讓人有些丈二和尚摸不著頭腦。但是把pollInner函數分析完畢,大家就會明白很多。pollInner函數非常長,把用于調試和統計的代碼去掉,結果如下:

Looper.cpp

int Looper::pollInner(int timeoutMillis) { if(timeoutMillis != 0 && mNextMessageUptime != LLONG_MAX) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); ......//根據Native Message的信息計算此次需要等待的時間 timeoutMillis= messageTimeoutMillis; } intresult = ALOOPER_POLL_WAKE; mResponses.clear(); mResponseIndex = 0;#ifdef LOOPER_USES_EPOLL //我們只討論使用epoll進行I/O復用的方式 structepoll_event eventItems[EPOLL_MAX_EVENTS]; //調用epoll_wait,等待感興趣的事件或超時發生 inteventCount = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);#else ......//使用別的方式進行I/O復用#endif //從epoll_wait返回,這時候一定發生了什么事情 mLock.lock(); if(eventCount < 0) { //返回值小于零,表示發生錯誤 if(errno == EINTR) { goto Done; } //設置result為ALLOPER_POLL_ERROR,并跳轉到Done result = ALOOPER_POLL_ERROR; gotoDone; } //eventCount為零,表示發生超時,因此直接跳轉到Done if(eventCount == 0) { result = ALOOPER_POLL_TIMEOUT; gotoDone; }#ifdef LOOPER_USES_EPOLL //根據epoll的用法,此時的eventCount表示發生事件的個數 for (inti = 0; i < eventCount; i++) { intfd = eventItems[i].data.fd; uint32_t epollEvents = eventItems[i].events; /* 之前通過pipe函數創建過兩個fd,這里根據fd知道是管道讀端有可讀事件。 讀者還記得對nativeWake函數的分析嗎?在那里我們向管道寫端寫了一個”W”字符,這樣 就能觸發管道讀端從epoll_wait函數返回了 */ if(fd == mWakeReadPipeFd) { if (epollEvents & EPOLLIN) {//awoken函數直接讀取并清空管道數據,讀者可自行研究該函數awoken(); } ...... }else { /* mRequests和前面的mResponse相對應,它也是一個KeyedVector,其中存儲了 fd和對應的Request結構體,該結構體封裝了和監控文件句柄相關的一些上下文信息, 例如回調函數等。我們在后面的小節會再次介紹該結構體 */ ssize_t requestIndex = mRequests.indexOfKey(fd); if (requestIndex >= 0) {int events = 0;//將epoll返回的事件轉換成上層LOOPER使用的事件if (epollEvents & EPOLLIN) events |= ALOOPER_EVENT_INPUT;if (epollEvents & EPOLLOUT) events |= ALOOPER_EVENT_OUTPUT;if (epollEvents & EPOLLERR) events |= ALOOPER_EVENT_ERROR;if (epollEvents & EPOLLHUP) events |= ALOOPER_EVENT_HANGUP;//每處理一個Request,就相應構造一個ResponsepushResponse(events, mRequests.valueAt(requestIndex)); } ...... } }Done: ;#else ......#endif //除了處理Request外,還處理Native的Message mNextMessageUptime = LLONG_MAX; while(mMessageEnvelopes.size() != 0) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); const MessageEnvelope& messageEnvelope =mMessageEnvelopes.itemAt(0); if(messageEnvelope.uptime <= now) { {sp<MessageHandler> handler = messageEnvelope.handler;Message message = messageEnvelope.message;mMessageEnvelopes.removeAt(0);mSendingMessage = true;mLock.unlock();//調用Native的handler處理Native的Message//從這里也可看出NativeMessage和Java層的Message沒有什么關系handler->handleMessage(message); } mLock.lock(); mSendingMessage = false; result = ALOOPER_POLL_CALLBACK; }else { mNextMessageUptime = messageEnvelope.uptime; break; } } mLock.unlock(); //處理那些帶回調函數的Response for(size_t i = 0; i < mResponses.size(); i++) { const Response& response = mResponses.itemAt(i); ALooper_callbackFunc callback = response.request.callback; if(callback) {//有了回調函數,就能知道如何處理所發生的事情了 int fd = response.request.fd; int events = response.events; void* data = response.request.data; //調用回調函數處理所發生的事件 int callbackResult = callback(fd, events, data); if (callbackResult == 0) {//callback函數的返回值很重要,如果為0,表明不需要再次監視該文件句柄removeFd(fd); } result = ALOOPER_POLL_CALLBACK; } } returnresult;}

看完代碼了,是否還有點模糊?那么,回顧一下pollInner函數的幾個關鍵點:

首先需要計算一下真正需要等待的時間。 調用epoll_wait函數等待。 epoll_wait函數返回,這時候可能有三種情況:

發生錯誤,則跳轉到Done處。超時,這時候也跳轉到Done處。epoll_wait監測到某些文件句柄上有事件發生。

假設epoll_wait因為文件句柄有事件而返回,此時需要根據文件句柄來分別處理:

如果是管道讀這一端有事情,則認為是控制命令,可以直接讀取管道中的數據。如果是其他FD發生事件,則根據Request構造Response,并push到Response數組中。

真正開始處理事件是在有Done標志的位置。

首先處理Native的Message。調用Native Handler的handleMessage處理該Message。處理Response數組中那些帶有callback的事件。上面的處理流程還是比較清晰的,但還是有個一個攔路虎,那就是mRequests,下面就來清剿這個攔路虎。

3.添加監控請求

添加監控請求其實就是調用epoll_ctl增加文件句柄。下面通過從Native的Activity找到的一個例子來分析mRequests。

android_app_NativeActivity.cpp

static jintloadNativeCode_native(JNIEnv* env, jobject clazz,jstring path, jstring funcName,jobject messageQueue, jstring internalDataDir, jstring obbDir, jstring externalDataDir, int sdkVersion, jobject jAssetMgr, jbyteArraysavedState){ ...... /* 調用Looper的addFd函數。第一個參數表示監聽的fd;第二個參數0表示ident; 第三個參數表示需要監聽的事件,這里為只監聽可讀事件;第四個參數為回調函數,當該fd發生 指定事件時,looper將回調該函數;第五個參數code為回調函數的參數*/ code->looper->addFd(code->mainWorkRead,0, ALOOPER_EVENT_INPUT,mainWorkCallback, code); ......}

Looper的addFd代碼如下所示:

Looper.cpp

int Looper::addFd(int fd, int ident, int events, ALooper_callbackFunccallback, void* data) { if (!callback) { //判斷該Looper是否支持不帶回調函數的文件句柄添加。一般不支持,因為沒有回調函數 //Looper也不知道如何處理該文件句柄上發生的事情 if(! mAllowNonCallbacks) { return -1; } ...... } #ifdefLOOPER_USES_EPOLL intepollEvents = 0; //將用戶的事件轉換成epoll使用的值 if(events & ALOOPER_EVENT_INPUT) epollEvents |= EPOLLIN; if(events & ALOOPER_EVENT_OUTPUT) epollEvents |= EPOLLOUT; { AutoMutex _l(mLock); Request request; //創建一個Request對象 request.fd = fd; //保存fd request.ident = ident; //保存id request.callback = callback; //保存callback request.data = data; //保存用戶自定義數據 struct epoll_event eventItem; memset(& eventItem, 0, sizeof(epoll_event)); eventItem.events = epollEvents; eventItem.data.fd = fd; //判斷該Request是否已經存在,mRequests以fd作為key值 ssize_t requestIndex = mRequests.indexOfKey(fd); if(requestIndex < 0) { //如果是新的文件句柄,則需要為epoll增加該fd int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, & eventItem); ...... //保存Request到mRequests鍵值數組 mRequests.add(fd, request); }else { //如果之前加過,那么就修改該監聽句柄的一些信息 int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_MOD, fd, &eventItem); ...... mRequests.replaceValueAt(requestIndex, request); } }#else ......#endif return1;}4.處理監控請求

我們發現在pollInner函數中,當某個監控fd上發生事件后,就會把對應的Request取出來調用。pushResponse(events, mRequests.itemAt(i));此函數如下:

Looper.cpp

void Looper::pushResponse(int events, constRequest& request) { Responseresponse; response.events = events; response.request = request; //其實很簡單,就是保存所發生的事情和對應的Request mResponses.push(response); //然后保存到mResponse數組}

根據前面的知識可知,并不是單獨處理Request,而是需要先收集Request,等到Native Message消息處理完之后再做處理。這表明,在處理邏輯上,Native Message的優先級高于監控FD的優先級。下面我們來了解如何添加Native的Message。

5. Native的sendMessage

Android 2.2中只有Java層才可以通過sendMessage往MessageQueue中添加消息,從4.0開始,Native層也支持sendMessage了[2]。sendMessage的代碼如下:

Looper.cpp

void Looper::sendMessage(constsp<MessageHandler>& handler, constMessage& message) { //Native的sendMessage函數必須同時傳遞一個Handler nsecs_tnow = systemTime(SYSTEM_TIME_MONOTONIC); sendMessageAtTime(now, handler, message); //調用sendMessageAtTime}void Looper::sendMessageAtTime(nsecs_t uptime, const sp<MessageHandler>& handler, const Message& message) { size_t i= 0; { //acquire lock AutoMutex _l(mLock); size_t messageCount = mMessageEnvelopes.size(); //按時間排序,將消息插入到正確的位置上 while (i < messageCount &&uptime >= mMessageEnvelopes.itemAt(i).uptime) { i += 1; }MessageEnvelope messageEnvelope(uptime, handler, message); mMessageEnvelopes.insertAt(messageEnvelope, i, 1); //mSendingMessage和Java層中的那個mBlocked一樣,是一個小小的優化措施 if(mSendingMessage) { return; } } //喚醒epoll_wait,讓它處理消息 if (i ==0) { wake(); }}

1.注意,以后文件描述符也會簡寫為文件句柄。 ↩︎

2.我們這里略過了Android2.2到Android 4.0之間幾個版本中的代碼變化。 ↩︎

以上就是Android nativePollOnce函數解析的詳細內容,更多關于Android nativePollOnce函數的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 久久久精品影院 | 精品一区二区免费视频 | 日日操夜夜 | 在线观看国产精品一区二区 | 亚洲久久久| 亚洲精品视频在线 | 青草视频在线免费观看 | 97色综合 | 亚洲精品国产剧情久久9191 | 最新午夜| 激情毛片 | 日本亚洲精品成人欧美一区 | 中文字幕日韩久久 | 中文字幕视频在线播放 | 欧美日韩久久精品 | 91久久精品日日躁夜夜躁欧美 | 天天久久 | 日韩超级大片免费看国产国产播放器 | 久久免费精品 | 欧美一二三四成人免费视频 | 伊人国产精品 | 草草影院ccyycom | 欧美日韩国产一区二区三区不卡 | 不卡一二 | 日韩在线1 | 看亚洲a级一级毛片 | 99re在线| 美女视频一区 | 国产精品一区二区不卡 | 精品一二三区 | 九九成人 | 97色在线观看免费视频 | 欧美日韩黄色一级片 | 亚洲欧美少妇 | 成人影视网址 | 国产成人99 | 久草观看 | 日本中文字幕在线播放 | 久久一区 | 91精品国产免费 | 久久久美女 | 婷婷成人在线 | 激情网五月天 | 五月婷婷丁香婷婷 | 龙珠z普通话国语版在线观看 | 久久6 | 一区二区三区不卡视频 | 亚洲一区视频在线 | 亚洲www永久成人夜色 | 国产精品手机在线 | 噜噜噜在线| 久久精品国产亚洲精品 | 色婷婷一区二区三区 | 日韩久久久久久 | 久久精品欧美一区二区三区麻豆 | 久久亚洲国产视频 | 国产午夜精品一区二区三区嫩草 | 国产一区免费在线观看 | 成人精品在线视频 | 毛片视频观看 | 国产成人一区二区 | 男人的天堂在线视频 | 久久精品欧美一区二区三区不卡 | 亚洲欧美日韩国产综合 | 亚洲精品视频在线免费 | 日韩精品一区二区在线观看视频 | 国产免费一级特黄录像 | 99免费精品 | 色综合久久久久 | 黄色国产 | 91无吗| 日韩精品在线一区 | 亚洲一区二区视频 | 久久精品二区亚洲w码 | 国产精品久久久久久久久久10秀 | 视频一区在线播放 | 成人欧美一区二区三区视频xxx | 国产专区在线 | 日韩欧美在线视频 | 欧美在线a | 91亚洲一区| 日韩在线国产精品 | 女男羞羞视频网站免费 | 五月天中文字幕 | 综合婷婷| 五月婷婷综合网 | 天天干天天插天天 | 欧美精品一二三 | 久草久| 久热精品视频 | 亚洲午夜精品a | 国产视频福利一区 | 免费三级黄色 | 成人av福利 | 日日干狠狠干 | 国产精品久久久久久久久久10秀 | 中文字幕在线视频网站 | 天堂av一区 | 成人精品在线视频 | 91视频在线| 一级a毛片 | 午夜夜 | 国产精品伊人影院 | 99精品久久久久久久免费看蜜月 | 久久ri资源网 | 国产综合精品 | 国产伊人99 | 一区二区视频在线 | 日韩三级视频 | 日日干日日操 | www在线视频| 在线观看91 | 日韩欧美在线观看一区二区三区 | 欧美日韩亚洲视频 | 天天澡天天狠天天天做 | 成人精品视频一区二区三区 | 午夜视频免费 | 在线观看免费毛片视频 | 亚洲国产高清视频 | 日本一级毛片免费看 | 欧美成人影院在线 | 久久av一区二区三区 | 日本一区二区三区中文字幕 | 亚洲成人福利在线观看 | 欧美精品1区2区3区 精品国产欧美一区二区 | 久久久久亚洲一区二区三区 | 日本在线观看视频一区 | 精品国产31久久久久久 | 成人久久久 | 中文字幕亚洲在线观看 | 性色av一二三杏吧传媒 | 毛片真人毛毛片毛片 | 91一区二区 | 午夜国产一区 | 玖玖操| 国产精品久久久久久久久免费软件 | 一区二区久久 | 国产日韩一区 | 国产精品视频久久久 | 国产精品九九九 | 日日操夜夜操天天操 | 欧美亚洲视频 | 日本一区二区高清不卡 | 久久av网 | 久草成人 | 波多野结衣福利电影 | 午夜精 | 久久成人18免费网站 | 日韩视频在线观看 | 久久久久久极品 | 亚洲高清在线观看 | 99久久免费看视频 | 成人综合在线观看 | 国产成人精品电影 | 一级黄色片欧美 | 99久久这里只有精品 | 香蕉夜色| 久久精品伊人 | 岛国一区| 一区二区三区久久久久久 | 日韩毛片免费看 | 黑人巨大精品欧美黑白配亚洲 | h小视频| 99久久这里只有精品 | 在线视频91| 欧美成人免费 | 久久麻豆视频 | 国产激情网站 | 亚洲乱码国产乱码精品精98午夜 | 免费国产一区二区 | 日本不卡一区二区 | 日韩色av | 久久成人精品一区二区三区 | 亚洲国产精品久久久 | 一区二区三区久久 | 国产综合久久 | 国产精品久久久久久福利一牛影视 | 亚洲国产精品成人综合色在线婷婷 | 精品久久久久久久久久久下田 | 久久777 | 成人亚洲视频在线观看 | 亚洲色图第八页 | 亚洲欧洲一区二区 | 精品国产免费久久久久久尖叫 | 国产精品美女久久久 | 一区二区三区免费在线观看 | 日本在线视频观看 | 一区视频在线 | 久久久久久久99精品免费观看 | 天天天天天天天天干 | 国产精品看片 | 91欧美| 国产一区二区三区在线免费观看 | 久久av在线 | 亚洲精品久久久久久一区二区 | 精品国产31久久久久久 | 日韩精品一区二区三区四区五区 | 嫩草影院网站入口 | 国产精品久久久久久久久免费桃花 | 亚洲精品视频在线 | 亚洲视频在线播放 | 国产欧美精品区一区二区三区 | 91视频在线 | 精品二区视频 | 欧美a√| 色av综合| 日韩国产欧美精品 | 亚洲精品一区二区三区四区高清 | 另类天堂av| 国产精品视频一区二区三区不卡 | 国产精品久久久久久久久久妇女 | 国产精品久久久久久久久久久新郎 | 精品一区二区在线观看 | 日本黄色免费大片 | 国产色 | 欧美二区精品 | 一区二区免费在线观看 | 久热久热 | 性视频网站免费 | 一级毛片免费看 | 日韩一区二区三区精品 | 国产91色| 欧美在线综合视频 | 国产电影一区二区 | av在线免费观看一区二区 | 色av一区| 国产三级一区二区 | 欧美亚洲激情 | 日韩资源| 日韩激情欧美 | 欧美大成色www永久网站婷 | 99精品欧美一区二区三区综合在线 | 超碰av在线 | 午夜激情影院 | 草樱av | 台湾av在线 | 国产黄色免费小视频 | 日本黄色大片免费观看 | 国产片侵犯亲女视频播放 | 欧美日韩成人在线视频 | 操操操日日日 | 国产欧美日韩综合精品一区二区 | 成人欧美一区二区 | 日韩毛片 | 一区二区三区国产 | 亚洲网在线 | 久久线视频 | 后进极品白嫩翘臀在线视频 | 久久久久久免费精品 | 成人在线免费视频 | 亚洲伦理一区 | 久久激情视频 | 最新免费视频 | 中文字幕 在线观看 | 成人在线播放器 | 亚洲国产成人av好男人在线观看 | 精品久久久久久久 | 国产福利片在线观看 | 久久精品一二三四 | 特级淫片女子高清视频在线观看 | 波多野结衣在线网址 | 久久久久无码国产精品一区 | 岛国一区 | 免费在线精品视频 | 亚洲激情在线 | 国产成人精品一区二区三区在线 | 欧美日韩一区二区三区不卡视频 | 亚洲国产天堂久久综合 | 国产香蕉视频在线播放 | 成人亚洲视频在线观看 | 一级毛片免费观看 | 国产精品一二三区视频 | 国产aaaaav久久久一区二区 | 国产精品精品 | av黄色一级 | 欧美日韩视频 | 日韩人体在线 | 久久中文字幕一区 | 亚洲欧洲一区二区 | 伊人网在线视频免费观看 | 免费无遮挡www小视频 | 日日操夜夜操免费视频 | 黄桃av| 成人午夜在线观看 | 国产精品久久久久久av公交车 | 日韩在线免费观看网站 | 日韩精品久久久久久 | 国产区日韩区欧美区 | 可以看的毛片网站 | 国产成人精品一区二区 | 欧美久久一区二区三区 | 麻豆精品一区二区 | 91精品免费 | 99re视频在线播放 | 亚洲欧美日韩在线一区二区 | 欧美精品在线一区 | www.久久久 | 久久久久久亚洲一区二区三区蜜臀 | 成人在线高清视频 | 亚洲欧洲久久 | www久久久| 亚州av| 天天干狠狠操 | 伊人一区二区三区 | 日韩在线播放一区 | 久久9视频| 亚洲欧美日韩精品久久奇米色影视 | av在线综合网 | 国产精品视频一区二区三区 | 成人免毛片| 国产午夜精品一区二区三区免费 | 操操操夜夜操 | 中文字幕在线亚洲 | 在线中文字幕视频 | 精品国产一区二区三区成人影院 | 国产精品色哟哟哟 | 亚洲久久久久久 | 亚洲成人一区二区 | 国产大片久久久 | 91精品国产高清一区二区三区 | 日韩三级视频 | 天天曰天天干 | 国产不卡视频在线观看 | hsck成人网| 久久久精 | 99日韩 | 亚洲精品在线视频 | 日穴视频在线观看 | 狠狠亚洲| 黄色操视频 | 美女超碰 | 欧美日韩黄色一区二区 | 91久久爽久久爽爽久久片 | 高清视频一区 | 干狠狠| 成年人在线看 | 国产精品色在线网站 | 在线观看亚洲精品视频 | 午夜免费视频 | 1区2区视频 | 国产精品无码久久久久 | 91精品中文字幕一区二区三区 | 中文字幕一区二区在线观看 | 国产毛片精品 | 精品久久久久久久久久 | 热久久这里只有精品 | 日韩一区二区三区在线观看 | 精品国产乱码久久久久久久软件 | 农村少妇kkkk7777 | 欧美一区免费 | 午夜视频在线 | 日日摸夜夜添夜夜添高潮视频 | 天天艹逼| 99久久久无码国产精品 | 午夜影院免费 | 搞黄免费视频 | 午夜激情在线免费观看 | 中文字幕日韩欧美 | 国产小视频在线观看 | 91资源在线| 精品亚洲自拍 | 二区影院 | 精品国产黄a∨片高清在线 日韩一区二 | 丰满少妇久久久久久久 | 国产综合亚洲精品一区二 | 亚洲一区二区三区中文字幕 | 亚洲精美视频 | 久久国产一区二区 | 亚洲国产精品va在线看黑人 | 美女又黄又免费 | 欧美日韩一区二区在线观看 | 三级av在线 | 国产一区二区三区在线免费 | 亚洲高清一区二区三区 | 日韩超级大片免费看国产国产播放器 | 日本免费一区二区视频 | 伊人久久综合 | 欧美日韩国产一区二区三区 | 午夜视频 | 一区二区三区国产 | 亚洲一区二区三区福利 | 黄网免费 | 国产亚州av | 完全免费av | 欧美视频三级 | 亚洲精品久久久久久久久久久久久 | 国产精品视频一区二区三区 | 久久在线播放 | 亚洲精区 | 在线观看免费av网站 | 欧美精品久久久 | 欧美一区二区三区免费 | 日本精品一区二区三区在线观看 | 中文字幕一级 | 日韩欧美网址 | 日韩成人一区二区 | 国产视频一区二区 | 日本一区二区不卡 | 日韩一二区 | 成人av影院 | 2019亚洲日韩新视频 | 蜜臀av在线播放一区二区三区 | 欧美性18| 国产亚洲精品美女久久久久久久久久 | 国产激情在线视频 | 色播久久 | 久久综合色视频 | 五月婷婷丁香在线 | 久久久久久国产 | 北条麻妃一区二区三区在线观看 | 日韩成人影院 | 91精品视频在线播放 | 国产精品久久久久久久久久 | 欧美成人性生活 | 中文在线一区 | 91午夜精品一区二区三区 | 一区二区三区国产 | 日韩成人精品在线 | 91免费在线看 | 久久国产成人 | 国产www| 欧美精品区 | 日本a在线 | 日韩综合网 | 日本欧美在线 | 国产一区91 | 成人免费毛片嘿嘿连载视频 | 亚洲一区在线视频 | 久草成人 | 九九热这里都是精品 | 亚洲最大av网站 | 成人免费看黄 | 91久久久久久久久 | t66y最新地址一地址二69 | 亚洲成人精品网 | 欧美一级淫片免费看 | 亚洲成人一区二区三区 | 日本1区2区 | 欧美成人性生活视频 | 黄色毛片在线观看 | 精品久久久久久久 | 精品国产黄色片 | 视频一区 中文字幕 | 国产97色在线 | 亚洲 | 一区二区三区免费 | 亚洲综合大片69999 | 久久久美女 | 精品久久久久久久久久久久久久久久久久 | 最新高清无码专区 | 国产成人综合一区二区三区 | 欧美成人精品一区二区三区 | 在线成人 | 99精品国产高清一区二区麻豆 | 亚洲欧洲视频 | 99国内精品久久久久久久 | 国内精品视频一区国产 | 一级片| 欧美日韩在线视频观看 | 欧美激情在线播放 | 99久久久久国产精品免费 | 最新日韩一区 | 久久久久亚洲精品 | 国产精品视屏 | 国产精品美女久久久久久久网站 | 99久久免费看视频 | 天天操天天玩 | 日韩三级黄 | 五月婷婷激情 | 久久成人国产视频 | 午夜www| 亚洲国产精品一区 | 久久久蜜臀| 国产成人精品a视频一区www | 欧美一级淫片免费视频黄 | 干片网| 久久精品国产99精品国产亚洲性色 | 毛片a片| 资源av| 99草草| 国产精品毛片久久久久久久 | 日日操夜夜操免费视频 | 色黄网站| 日韩中文字幕在线 | 成人av观看 | 日韩精品一区二区三区四区视频 | 国产色视频网站 | 国产欧美日韩综合精品一区二区 | 免费激情网站 | 韩国三级午夜理伦三级三 | 久热热热 | 九九热热九九 | 免费看男女www网站入口在线 | 天天操综 | 欧美日韩免费一区二区三区 | 最新中文字幕在线资源 | 伊人av成人 | 久久777 | 国产一区影院 | 国产精品久久久久久久久福交 | 久久久久久久久99精品 | 一区二区三区在线免费观看 | 一区二区视频 | 日韩成人一区 | m豆传媒在线链接观看 | 亚洲国产日韩一区 | 亚洲午夜成激人情在线影院 | 久久精品一区二区三区四区 | 欧美国产日韩一区 | 一a级毛片| 91.成人天堂一区 | 亚洲aaa | 99精品在线观看 | 91麻豆精品国产91久久久资源速度 | 午夜男人天堂 | 黄色影片免费在线观看 | 国产综合久久 | 亚洲欧洲无码一区二区三区 | 精品中文字幕在线观看 | 日本三级国产 | 91性高湖久久久久久久久网站 | 精品一区视频 | 国产视频1区 | 国产中文字幕在线观看 | 国产精品自拍视频 | 天堂资源网 | 国产在线第一页 | 国产91极品 | 国产成人综合在线观看 | 欧美成人一区二区三区片免费 | 久久国产精品视频一区 | 九色影院 | 久久精品麻豆 | 中文字幕在线看第二 | 久操视频在线观看 | 欧美日韩国产一区二区 | 九九视频在线 | 爱操在线 | 国产精品www | 欧美一区二区三区精品 | 日韩二区精品 | 国产成人精品免费视频大全最热 | 欧美精品欧美极品欧美激情 | 蜜桃视频在线观看www社区 | 日韩欧美在线综合 | 欧美成人黄色小说 | 亚洲美女在线视频 | 亚洲国产精品精华液com | igao视频 | 国产精品国色综合久久 | 一区二区三区在线 | 欧 | 日韩中文字幕无码一区二区三区 | 欧美日韩一区二区在线观看 | 亚洲国产一二区 | 日韩成人在线一区 | 在线碰| 91麻豆精品国产91久久久更新资源速度超快 | 夜夜av | 精品一二三区 | 黄色免费在线观看 | 久久99精品久久久久婷婷暖91 | 性高湖久久久久久久久aaaaa | 九九r热 | 国产精品久久久一区 | 国产免费av在线 | 99国产精品久久久久久久成人热 | 国产精品中文字幕在线播放 | 福利三区| 久久精品网| 国产精品国产三级国产aⅴ9色 | 欧美自拍视频 | 亚洲一区二区伦理 | 另类天堂 | 凹凸日日摸日日碰夜夜爽孕妇 | 国产精品亚洲一区二区三区在线 | 中文字幕视频 | 亚洲成人中文字幕 | 国产成人av一区 | 久久久久久精 | 国产一区二区黑人欧美xxxx | 国产日韩欧美综合 | 视频1区2区 | 精品久久久久久亚洲精品 | 亚洲毛片在线 | 一级黄色录像毛片 | 欧美精品导航 | 2021狠狠干| 99久久婷婷国产综合精品电影 | 91中文字幕一区 | 亚洲第一福利视频 | 亚洲精品久久久久久久久久久久久 | 国产精品久久免费视频在线 | 亚洲电影一区二区三区 | 精品一区二区三区蜜桃 | 97国产资源 | av一区二区三区四区 | 久久久久久久久久一区二区 | 精品99久久久久久 | 久久久www成人免费精品 | 日韩欧美一区二区三区 | 免费在线观看av的网站 | 亚洲动漫在线观看 | 成人精品视频99在线观看免费 | 欧美黄色一级 | 日韩视频在线免费观看 | 亚洲av毛片一级二级在线 | 91精品国产一区二区 | 成人久久久精品国产乱码一区二区 | 国产精品99久久久久久动医院 | 久久国产精品久久久久久 | 久久69精品久久久久久久电影好 | 欧美一级电影 | 亚洲第一免费网站 | 婷婷毛片 | 影音先锋亚洲资源 | 久久成人一区二区 |