• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            XGuru's Blog

            技術(shù),是一種態(tài)度。關(guān)注:高性能后端技術(shù)/服務(wù)器架構(gòu)/C++/C/LAMP

               :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              20 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks

            公告





            twitter / xoXGuru

            feedsky
            抓虾
            google reader
            鲜果
            QQ邮箱
            九点

            常用鏈接

            留言簿(12)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            #

             

            2.1 event_base核心事件基類數(shù)據(jù)結(jié)構(gòu)



             


                  可以看出event_base是整個(gè)libevent的核心部分,它由三種結(jié)構(gòu)構(gòu)成:一個(gè)時(shí)間堆 (對(duì)應(yīng)EVLIST_TIMEOUT),一個(gè)已注冊(cè)隊(duì)列(對(duì)應(yīng)EVLIST_INSERTE),一個(gè)活躍事件隊(duì)列(對(duì)應(yīng)EVLIST_ACTIVE)。

                  時(shí)間堆采用的是min-Heap最小二叉堆,已注冊(cè)隊(duì)列和活躍事件隊(duì)列采用的都是雙向鏈表。

                  已注冊(cè)隊(duì)列對(duì)應(yīng)事件基中的eventqueue,活躍事件隊(duì)列對(duì)應(yīng)的是事件基中的activequeues[ev->ev_pri]結(jié)構(gòu)體數(shù)組。其中的ev_pri代表的是事件的優(yōu)先級(jí),數(shù)值越小代表越高的優(yōu)先級(jí)別。

                  可以通過調(diào)用event_priority_set()函數(shù)對(duì)其優(yōu)先級(jí)進(jìn)行設(shè)置,默認(rèn)插入中等優(yōu)先級(jí)(nactivequeues/2 ,即活躍隊(duì)列總數(shù)除以2)。


             

            2.2 超時(shí)隊(duì)列(min-Heap最小二叉堆)

                  在這里處理超時(shí)機(jī)制中使用了一個(gè)經(jīng)典的數(shù)據(jù)結(jié)構(gòu)min-Heap,源碼位于Min_heap.h

            libevent從1.4版本之后就開始采用min-Heap來代替RB-Tree。

            min-Heap(最小二叉堆)遵循的原則:

            1.它是一種完全二叉樹

            2.它最小的元素在頂端每個(gè)元素都比它的父節(jié)點(diǎn)大(或相等)。

            插入元素時(shí)間復(fù)雜度為O(log n),找出最小值的復(fù)雜度僅為O(1)。

            libevent實(shí)現(xiàn)的min-Heap變量名有點(diǎn)猥瑣。

            1typedef struct min_heap
            2{
            3    struct event** p;
            4    unsigned n, a;
            5}
             min_heap_t;
            6

             

             

            p可以理解成存儲(chǔ)事件指針的數(shù)組,n表示的是容量,a表示的是當(dāng)前數(shù)。

            堆的操作函數(shù)里一般e代表事件,s代表被操縱的min-Heap。

            這個(gè)min-heap作者應(yīng)該是OOP陣營的,其中出現(xiàn)有對(duì)應(yīng)構(gòu)造函數(shù)的min_heap_ctor(),和對(duì)應(yīng)析構(gòu)函數(shù)min_heap_dtor()。


             

            2.3事件隊(duì)列(雙向鏈表)

            libevent中的活躍事件隊(duì)列和已注冊(cè)隊(duì)列采用的數(shù)據(jù)結(jié)構(gòu)都是用宏來實(shí)現(xiàn)的,原在freeBSD的<sys/queue.h>中已有定義,為了對(duì)Linux跨平臺(tái)支持考慮,libevent將部分代碼集中到event_internal.h里。


            1#define TAILQ_ENTRY(type)                        \
            2struct {                                         \
            3    struct type *tqe_next;    /* 下一個(gè)元素 */         \
            4    struct type **tqe_prev;    /*上一個(gè)元素的地址*/      \
            5}

            6

             

            libevent用到的宏操作

            宏名稱

            操作

            TAILQ_INIT

            初始化隊(duì)列

            TAILQ_FOREACH

            對(duì)隊(duì)列進(jìn)行遍歷操作

            TAILQ_INSERT_BEFORE

            在指定元素之前插入元素

            TAILQ_INSERT_TAIL

            在隊(duì)列尾部插入元素

            TAILQ_EMPTY

            檢查隊(duì)列是否為空

            TAILQ_REMOVE

            從隊(duì)列中移除元素

            posted @ 2010-06-24 00:23 XGuru 閱讀(1972) | 評(píng)論 (1)編輯 收藏

            Libevent簡(jiǎn)介

            The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts. 

             

            Libevent的API提供了這樣的一套機(jī)制:
            當(dāng)指定文件描述符中一個(gè)特定的事件發(fā)生,或者超時(shí)時(shí)間到達(dá)后執(zhí)行指定的回調(diào)函數(shù)。
            此外,libevent回調(diào)功能也支持由信號(hào)或者常規(guī)的超時(shí)觸發(fā)。
            注意其許可協(xié)議為BSD-style的協(xié)議,可以在商業(yè)級(jí)產(chǎn)品中采用而不必開源。

             

            1.編譯安裝


             

            ubuntu下可以使用apt的方法直接安裝:

             

             ~$  sudo apt-get install libevent

            或者使用

            ~$  wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
            ~$  tar –xzvf  libevent-1.4.13-stable.tar.gz
            ~$  cd libevent-1.4.13-stable
            ~$  ./configure
            ~$  make
            ~$  sudo make install

            2.庫的使用
             

            可以從這幾個(gè)簡(jiǎn)單的例子中了解到libevent的基本使用方法。編譯時(shí)需加上 "-levent"參數(shù)。

             

            2.1.I/O事件(對(duì)應(yīng)EV_READ、EV_WRITE)

            下面提供了一個(gè)有所省略簡(jiǎn)單使用libevent返回系統(tǒng)時(shí)間的服務(wù)端程序片段。

             1void get_time(int fd,short event,struct event *arg)  /*獲取系統(tǒng)時(shí)間并將其往回write*/
             2{
             3……
             4    localtime_r(&now,&t);
             5    asctime_r(&t,buf);
             6    write( fd,buf,strlen(buf) );
             7……
             8}

             9void con_accept(int fd,short event,void *arg) /*提供給事件的回調(diào)函數(shù),接收一個(gè)連接*/
            10{
            11    struct sockaddr_in s_in;
            12    socklen_t len = sizeof(s_in);
            13    int ns = accept(fd,(struct sockaddr *&s_in,&len);
            14    struct event *ev = malloc(sizeof(struct event));
            15    event_set(ev,ns,EV_WRITE,(void *)get_time,ev);
            16    event_add(ev,NULL);
            17}

            18                
            19int main()
            20{
            21    int sockfd = socket(PF_INET,SOCK_STREAM,0);
            22    struct sockaddr_in s_in;
            23……
            24    bind(sockfd,(struct sockaddr*&s_in,sizeof(s_in));
            25    listen(sockfd,5);
            26    event_init(); //libevent初始化
            27
            28    struct event ev;
            29    event_set(&ev,sockfd,EV_READ|EV_PERSIST,con_accept,&ev);
            30//設(shè)置事件屬性為可讀、持續(xù),回調(diào)函數(shù)為con_accept()
            31    event_add(&ev,NULL);//添加事件,未設(shè)置超時(shí)時(shí)間
            32    event_dispatch();//進(jìn)入libevent主循環(huán)
            33    return 0;
            34}

            35

            2.2. 信號(hào)處理事件(對(duì)應(yīng)EV_SIGNAL)

             1 static void signal_cb(int fd, short eventvoid *arg)
             2{
             3    struct event *signal = arg;
             4    printf("%s: got signal %d\n", __func__, EVENT_SIGNAL(signal));
             5    if (called >= 2)
             6        event_del(signal); //如果調(diào)用了兩次以上,就刪除這個(gè)信號(hào)
             7    called++;
             8}

             9
            10int main (int argc, char **argv)
            11{
            12    struct event signal_int;
            13    event_init();//libevent初始化
            14    event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb, &signal_int); 
            15//設(shè)置事件屬性為信號(hào)觸發(fā)、持續(xù),回調(diào)函數(shù)為con_accept()
            16    event_add(&signal_int, NULL); //添加事件
            17    event_dispatch();//進(jìn)入libevent主循環(huán)
            18    return 0;
            19}

            20

            2.3.常規(guī)超時(shí)處理(對(duì)應(yīng)EV_TIMEOUT)
             1static void timeout_cb(int fd, short eventvoid *arg)
             2{
             3    struct timeval tv;
             4    struct event *timeout = arg;
             5    int newtime = time(NULL);
             6    printf("%s: called at %d: %d\n", __func__, newtime,
             7        newtime - lasttime);
             8    lasttime = newtime;
             9    evutil_timerclear(&tv);
            10    tv.tv_sec = 2;
            11    event_add(timeout, &tv);
            12}

            13
            14int main (int argc, char **argv)
            15{
            16    struct event timeout;
            17    struct timeval tv;
            18    event_init();//libevent初始化
            19    evtimer_set(&timeout, timeout_cb, &timeout);
            20//實(shí)際上該函數(shù)對(duì)應(yīng)的是event_set(timeout, -1, 0, timeout_cb,&timeout)
            21evutil_timerclear(&tv); //如果有時(shí)間清理函數(shù)則直接對(duì)應(yīng)timerclear(),如果沒有則將tv_sec和tv_usec設(shè)置為0
            22
            23    tv.tv_sec = 2;
            24    event_add(&timeout, &tv);
            25    lasttime = time(NULL);
            26    event_dispatch();
            27    return 0;
            28}

            29

            posted @ 2010-06-24 00:13 XGuru 閱讀(6056) | 評(píng)論 (0)編輯 收藏

                 摘要: 很多程序員討厭去閱讀代碼,來接受它吧。就像人人都喜歡寫代碼一樣--寫代碼很有樂趣。但閱讀代碼卻是一種困難的工作。它不僅僅繁重,而且很無聊,讓我們面對(duì)這個(gè)事實(shí),任何不是自己寫的代碼都是差勁的(嘿嘿,雖然我們沒有這樣說過,但是其實(shí)我們都是這樣想的)。甚至當(dāng)你寫完代碼后的僅僅幾個(gè)小時(shí)之后,你的那些代碼就開始變得越來越爛了,時(shí)間一長,你就會(huì)把它當(dāng)作看起來的那種差勁作品。為何我喜愛讀他人的代碼?閱讀代碼又有什么技巧和方法呢?而且你還需要去尋找代碼閱讀機(jī)會(huì)--而不是逃避它們  閱讀全文
            posted @ 2010-06-04 15:55 XGuru 閱讀(6508) | 評(píng)論 (10)編輯 收藏

                 摘要: 我讀了大量關(guān)于如何招募 卓越 開發(fā)者 的文章,但是如果你只對(duì)招聘蹩腳程序員感興趣,那又該怎么辦呢?也許你不愿意用錢去利滾利,或者你只覺得把工作完成就謝天謝地了。不管什么原因,這個(gè)蹩腳程序員系列文章就是玩這個(gè)把戲的。歡迎來到第一部分:如何招聘蹩腳程序員  閱讀全文
            posted @ 2010-04-26 15:43 XGuru 閱讀(2613) | 評(píng)論 (0)編輯 收藏

                 摘要: 數(shù)學(xué)對(duì)于一個(gè)開發(fā)者而言是否重要呢?一位不愿透露姓名的讀者寫道:“目前,大多數(shù)的編程工作的性質(zhì)就是這樣,你并不真正需要的數(shù)學(xué)技能,甚至能做得更好,畢竟線性代數(shù)對(duì)建立數(shù)據(jù)庫驅(qū)動(dòng)的網(wǎng)站是沒有任何幫助的。然而, Skorkin爭(zhēng)辯說,如果你想在軟件開發(fā)領(lǐng)域做真正令人興奮的工作,數(shù)學(xué)技能是必要的,而且它將會(huì)變得越來越重要!  閱讀全文
            posted @ 2010-04-02 00:18 XGuru 閱讀(4951) | 評(píng)論 (6)編輯 收藏

            這是一個(gè)非常有趣的,從計(jì)算機(jī)科學(xué)、軟件工程、程序設(shè)計(jì)、經(jīng)驗(yàn)、學(xué)識(shí)各方面評(píng)估程序員能力的參照表。

            如果你想看看自己的水平處在哪個(gè)層級(jí)(僅供參考),就快來看看吧~

            漢化版地址在這里


            錯(cuò)誤在所難免,如果發(fā)現(xiàn),請(qǐng)您拍磚!
            *原作者 :Sijin Joseph
            *英文原文請(qǐng)看 這里
            *感謝 bearice 提供修改意見和空間。
            posted @ 2010-03-12 21:33 XGuru 閱讀(4078) | 評(píng)論 (1)編輯 收藏

            Memcached是一個(gè)自由、源碼開放、高性能、分布式內(nèi)存對(duì)象緩存系統(tǒng),目的在于通過減輕數(shù)據(jù)庫負(fù)載來使動(dòng)態(tài)Web應(yīng)用程序提速。

            俗話說好記性不如爛筆頭。
            這個(gè)文檔是我用來記錄閱讀Memcached源碼過程中的一些經(jīng)驗(yàn),以及分析memcached的一些內(nèi)部工作機(jī)制。
            希望也能給大家?guī)矸奖恪?br>
            PDF目錄

            1. 背景 .................................................................................................................................. 3
            2. memcached的安裝 ........................................................................................................... 4
            3. memcached的配置 ........................................................................................................... 5
            4. memcached的使用 ........................................................................................................... 6
            4.1. 存儲(chǔ)命令 ............................................................................................................ 7
            4.2. 讀取命令 ............................................................................................................ 8
            4.3. 刪除命令 ............................................................................................................ 8
            4.4. 高級(jí)命令 ............................................................................................................ 9
            4.5. 其他命令 .......................................................................................................... 10
            5. Memcached內(nèi)部工作機(jī)制 ............................................................................................. 11
            5.1. Memcached基本的數(shù)據(jù)結(jié)構(gòu) .......................................................................... 11
            5.2. 基本設(shè)計(jì)概念和處理流程 .............................................................................. 12
            5.3. 內(nèi)部Hash機(jī)制 ................................................................................................ 15
            5.3.1. Hash函數(shù)及沖突解決 ............................................................................. 15
            5.3.2. HashTable主要函數(shù) ................................................................................ 15
            5.4. slab內(nèi)存處理機(jī)制 ........................................................................................... 17
            5.4.1. slab主要函數(shù) ........................................................................................... 17
            5.4.2. slab機(jī)制中所采用的LRU算法 ............................................................. 19
            5.5. 控制item各種函數(shù) ......................................................................................... 20
            5.6. 守護(hù)進(jìn)程機(jī)制 .................................................................................................. 22
            5.7. Socket處理機(jī)制 .............................................................................................. 23
            5.7.1. Unix域協(xié)議 .............................................................................................. 23
            5.7.2. TCP/UDP協(xié)議 ......................................................................................... 24
            5.8. 多線程處理機(jī)制 .............................................................................................. 25
            5.9. 事件處理機(jī)制 .................................................................................................. 25
            6. 未完善之處 ..................................................................................................................... 27
            7. 參考文獻(xiàn) ......................................................................................................................... 28

            本人水平有限,歡迎大家拍磚!
            下載PDF

            參考文獻(xiàn)

            [1].Masahiro Nagano[JP] & charlee().memcached全面剖析.2008-7-2

            [2].W.Richard Stevens & 楊繼張().UNIX 網(wǎng)絡(luò)編程(第三版).2004

            [3]. W.Richard Stevens.UNIX環(huán)境高級(jí)編程(第二版).2005

            [4]. dsallings.Memcached FAQ.2009-9

            [5]. bachmozart .Memcached源碼分析(線程模型).

            [6]. 愛寫字開發(fā)博客.Linux下啟用Wordpressmemcached支持.


            posted @ 2010-01-23 00:39 XGuru 閱讀(7290) | 評(píng)論 (10)編輯 收藏

                 摘要: by Xguru  又說階乘,這是老生常談了吧。想都不用想,一個(gè)遞歸輕松搞定! int factorial(int n){    if( n == 1)        return 1; &n...  閱讀全文
            posted @ 2009-12-30 19:02 XGuru 閱讀(1893) | 評(píng)論 (4)編輯 收藏

             

            大家對(duì)數(shù)組的使用再熟悉不過了吧?
            來看下這個(gè)程序,挺簡(jiǎn)單的。

            1#include<iostream>
            2int main()
            3{
            4    int a[] = {1,2,3,4,5};
            5    for(int i = 0 ; i < 5; i++)
            6        std::cout << i[a] << " ";
            7    return 0;
            8}


            現(xiàn)在請(qǐng)仔細(xì)看第6行。
            發(fā)現(xiàn)了什么?
            試下編譯一下看能不能通過?


            把這個(gè)程序更加簡(jiǎn)化

            1int a[5= {1,2,3,4,5};
            2int b = 1[a];

             
            再來看下產(chǎn)生的匯編代碼
            4:       int a[5] = {1,2,3,4,5};
            00401568   mov         dword ptr [ebp-14h],1
            0040156F   mov         dword ptr [ebp-10h],2
            00401576   mov         dword ptr [ebp-0Ch],3
            0040157D   mov         dword ptr [ebp-8],4
            00401584   mov         dword ptr [ebp-4],5
            5:        int b = 1[a];
            0040158B   mov         eax,dword ptr [ebp-10h]
            0040158E   mov         dword ptr [ebp-18h],eax

            你沒有看錯(cuò),此刻這個(gè)數(shù)組春哥附體,a[1]的指向地址和1[a]是一樣的,都是[ebp-10h]。

            Why?

            我們回憶一下數(shù)組和指針的關(guān)系,如何用指針來表示數(shù)組?
            *a  就是 數(shù)組 a中下標(biāo)為0的值的引用,即a[0],
            那么*(a+i) 呢?
            表示的就應(yīng)該是數(shù)組 a中下標(biāo)為i的值的引用了,即a[i],
            那么這種現(xiàn)象也不足為怪了:
            因?yàn)?*(a+i)  == *(i+a)
            所以 a[i] == i[a]

            是不是感到 啊哈!靈機(jī)一動(dòng)(aha! Insight)了呢?

            擴(kuò)展資料:《C陷阱與缺陷》p33~p38




            posted @ 2009-12-24 00:55 XGuru 閱讀(2144) | 評(píng)論 (14)編輯 收藏

                  深入學(xué)習(xí)了STL的內(nèi)部構(gòu)造以及一些C++深層次的機(jī)制與技巧以后,突然浮現(xiàn)出每個(gè)Programmer都要面對(duì)的問題。

                  Why Programming in C++?

                  比起質(zhì)樸純凈的C,靈活龐大的JAVAC#,我為什么要選擇C++?

                   在各大技術(shù)BBS和牛人的BLOG里逛,大家都在為自己喜歡的語言爭(zhēng)論,C#/JAVA的程序員說,不要重復(fù)造車輪,擁有良好的語言平臺(tái),有豐富全面的庫比較全,可以將注意力轉(zhuǎn)向更為重要的架構(gòu)方面,軟件工程方面。又何必在語言的表層基礎(chǔ)苦上苦癡迷?C++標(biāo)準(zhǔn)中連最基本的GUI庫和網(wǎng)絡(luò)庫都沒有。包括 C++創(chuàng)始人BJ本人也想將C++發(fā)展成為一個(gè)平臺(tái)(palform)。

                   C++STL庫固然不錯(cuò),但是一個(gè)新手用STL時(shí),一個(gè)小錯(cuò)誤編譯就跳出上K的錯(cuò)誤信息(就算有STLFilt,確實(shí)也以難安裝),最新的C++0x中 能改善這一問題的萬眾矚目的Concept已被取消,C++又該何去何從?C的程序員(包括Linus大叔)說,C++簡(jiǎn)直就是邪惡的語言,效率底下,語言繁雜,違反KISS原則,更無法在底層如操作系統(tǒng)中勝任。大家說的好像都有道理,難道C++就是這樣一門高不成,低不就的語言么?

                   我也用過C語言和C#語言,而且還在大學(xué)里也拿過關(guān)于這兩種語言競(jìng)賽一些小小的獎(jiǎng),最起碼能說對(duì)這兩種語言還有粗略的了解。

                   但是我最喜歡、花的時(shí)間最多的還是C++C++是我學(xué)的第一門語言,一路學(xué)來吃了不少苦,C++作為語言國度的一個(gè)聯(lián)邦[EFC++Item1],靈活,彈性大讓我著迷,它像一個(gè)精通太極的大師,容納百川,但卻深藏若拙。它有精妙的技法如SFINAEtag distributing (技法的復(fù)雜性這也是它被指責(zé)的重要原因)。

                   它有沉著老練的STL庫,其中有各種數(shù)據(jù)結(jié)構(gòu)和常用算法的靈活精巧的實(shí)現(xiàn)和高度可擴(kuò)充性,有銳意進(jìn)取的boost庫,loki庫,有超重量級(jí)的網(wǎng)絡(luò)通信開發(fā)框架ACE,還有效率較高的Blitz++科學(xué)庫等。

                   C#中的各種“高階”功能C++都能實(shí)現(xiàn)(沒有“基本”兩字,您和我說不可能?那就去看看C#的托管機(jī)制是用什么語言寫的吧),雖然您將花費(fèi)更多的時(shí)間學(xué)習(xí)與調(diào)試,但是我覺得中途的樂趣只有您自己做過才能深有體會(huì)。

                   它和C語言工作效率不分伯仲,(您說C++效率低下?請(qǐng)問您深入用過C++么?您看過SGI實(shí)做中內(nèi)存分配的實(shí)現(xiàn)么?)C++也可以毫不費(fèi)力的使用現(xiàn)有的 C代碼(所謂C-Sytle),C++STL中泛型的sort完勝C中的qsort這也是C++程序員津津樂道的話題。

                   但哪種語言不是經(jīng)過無數(shù)大牛們大師們千錘百煉的產(chǎn)物?爭(zhēng)論哪種語言的好壞只是顯出您的自卑心理。當(dāng)你去說一門語言好與不好的時(shí)候,你有想過,你有真正的深入的學(xué)過它么?你真正的了解這門語言的特性么?

                   請(qǐng)記住這句話:好手藝人從不會(huì)責(zé)怪他的工具。語言沒有好壞之分,只有在特定環(huán)境下,具備各自的優(yōu)勢(shì)。

                   對(duì)于初學(xué)者而言,學(xué)通一門語言是他叩開計(jì)算機(jī)底層原理世界的大門的鑰匙。語言的好壞不重要,關(guān)鍵是看你自身從學(xué)習(xí)這門語言中得到了什么。

                   若是單單執(zhí)著于語法細(xì)節(jié),把把你的思想全部拘束在孔乙已爭(zhēng)論茴香豆的“茴”的幾種寫法上(像貴國的等級(jí)考試這類的考察語言偏僻細(xì)節(jié)上),你將會(huì)得不償失

                   在學(xué)習(xí)的提高階段,可以通過大體學(xué)習(xí)其他的語言,來發(fā)散自己的思維;甚至還可以幫助你更好的理解你所目前熱愛的語言。

                   還有一些人執(zhí)著爭(zhēng)論哪門語言更有“錢途”的時(shí)候,我建議您嘞,改行吧。 (您說我裝清高,什么程序員也要吃飯,現(xiàn)實(shí)也很殘酷之類的。我只能說,連吃飯都成問題的,您也不適合在這個(gè)層面上討論語言的好壞,您還是繼續(xù)學(xué)吧)。

              by XGuru 09年12月

            posted @ 2009-12-20 23:10 XGuru 閱讀(2021) | 評(píng)論 (11)編輯 收藏

            僅列出標(biāo)題
            共2頁: 1 2 
            东京热TOKYO综合久久精品| 亚洲精品无码久久千人斩| 青青青青久久精品国产| 国产成人精品久久亚洲高清不卡| 久久精品国产亚洲精品| 一本色道久久综合| 久久青青草原精品国产| 91久久精品无码一区二区毛片| 久久精品国产99久久香蕉| 久久精品国产亚洲AV香蕉| 99久久人妻无码精品系列蜜桃| 久久精品亚洲乱码伦伦中文| 久久久久亚洲av综合波多野结衣 | 日产精品久久久一区二区| 狠狠色丁香久久婷婷综| 亚洲精品成人网久久久久久| 久久天天躁狠狠躁夜夜96流白浆| 国产99久久久久久免费看| 久久久亚洲欧洲日产国码是AV| 97久久久久人妻精品专区| 久久久久久一区国产精品| 久久精品国产99久久久| 色婷婷噜噜久久国产精品12p | 一本一道久久精品综合| 久久丫忘忧草产品| 青草影院天堂男人久久| 久久99热这里只有精品国产| 国产成人精品久久一区二区三区av| 99精品国产免费久久久久久下载| 亚洲嫩草影院久久精品| 少妇久久久久久被弄高潮| 久久夜色精品国产| 日本久久久久久中文字幕| 亚洲精品无码久久一线| 亚洲精品无码久久毛片| 国产ww久久久久久久久久| 久久九九精品99国产精品| 久久婷婷五月综合成人D啪| 久久人人超碰精品CAOPOREN| 久久午夜电影网| 国内精品伊人久久久久av一坑|