• <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>
            隨筆 - 119  文章 - 290  trackbacks - 0

            博客搬家了哦,請(qǐng)移步
            叫我abc

            常用鏈接

            留言簿(12)

            隨筆分類

            我的博客

            搜索

            •  

            積分與排名

            • 積分 - 304348
            • 排名 - 84

            最新評(píng)論

            閱讀排行榜

            cache_flush算是這個(gè)庫最糟糕的一段代碼了,總共有100多行,縮進(jìn)糟糕,做很多不同的工作。我就納悶,為什么不抽些子函數(shù)出來,這樣的代碼基本上不具備維護(hù)價(jià)值,因?yàn)樽约褐貙懸淮危雀忝靼走@個(gè)函數(shù)有趣多了。
            由于這個(gè)函數(shù)實(shí)在太長(zhǎng),所以不一次全貼上來,一部分一部分的看吧。

            qsort(E.cache,CACHE_SIZE,sizeof(struct cache_node),cache_node_cmp);

            //----------------------------------------
            static int
            cache_node_cmp(
            const void *a,const void *b)
            {
                
            const struct cache_node *ca=(const struct cache_node *)a;
                
            const struct cache_node *cb=(const struct cache_node *)b;
                
            if (ca->parent != cb->parent) {
                    
            return cb->parent - ca->parent;
                }

                
            if (ca->parent == -1 ) {
                    
            return 0;
                }

                
            return (ca->child & ~ UNSET_MASK) - (cb->child & ~UNSET_MASK);
            }
            首先,對(duì) E.cache進(jìn)行排序,比較子是cache_node_cmp。
            return cb->parent - ca->parent ,是用 cb減去ca的,因此首先根據(jù)parent_id進(jìn)行降序排序。注意,在這一比較結(jié)果中,如果ca->parent = -1,那么比較結(jié)果為正,空閑節(jié)點(diǎn)ca往數(shù)組右邊移動(dòng);如果cb->parent = -1,那么比較結(jié)果為負(fù),空閑節(jié)點(diǎn)cb還是會(huì)處在數(shù)組右邊。
            為什么要注意這個(gè)呢?因?yàn)楸敬闻判虻囊粋€(gè)結(jié)果就是,那些空閑節(jié)點(diǎn)都集中到了cache數(shù)組的右邊,只要遍歷cache的過程中遇到了第一個(gè)空閑節(jié)點(diǎn),那么剩下的必然都是空閑節(jié)點(diǎn)了。
            當(dāng)然要達(dá)成這個(gè)排序結(jié)果,還需要下面的這步,if (ca->parent == -1 ) {return 0;}
            比較子的最后一句,在parent_id相同的情況下,按child_id升序排序。

            E.cache經(jīng)過排序后,呈現(xiàn)出以下狀況:
            1.根據(jù)parent_id呈降序排序,并且parent_id相同的節(jié)點(diǎn)緊挨在一起
            2.空閑的cache節(jié)點(diǎn)全部都排在了數(shù)組的右邊
            3.parent_id相同的節(jié)點(diǎn),按child_id升序排序

                while (i<CACHE_SIZE) {

                    
            if (parent==-1{
                        
            return;
                    }
            排序之后,就是遍歷有序的cache數(shù)組。可以看到排序的效果了,當(dāng)parent_id = -1的時(shí)候,就只剩下空閑的cache_node,因此可以退出遍歷。

                    head=&E.cache[i];
                    next
            =head;
                    sz
            =0;

                    
            while (next->parent == parent && i<CACHE_SIZE) {
                        sz 
            += 1 - UNSET_MASK_BIT(next->child);
                        
            ++next;
                        
            ++i;
                    }
            這一段代碼,是統(tǒng)計(jì)同一parent_id下child的數(shù)目。因?yàn)橛行ヽhild_id被標(biāo)記了 UNSET_MASK,因此這種cache節(jié)點(diǎn)就不用統(tǒng)計(jì)到總數(shù)中了。其中UNSET_MASK_BIT是位移操作,如果child被標(biāo)記了UNSET_MASK,那么位移的結(jié)果就是1,1-1=0,也就沒有統(tǒng)計(jì)到總數(shù)中了。

            struct node *node=&E.pool[parent];
            children
            =node->u.n.children;
            統(tǒng)計(jì)了parent擁有的child之后,接下來就是要把這些child記錄到parent的數(shù)據(jù)結(jié)構(gòu)上了。這里不得不回顧一下struct node的定義,上次看的時(shí)候,并沒有探討struct link *children是做什么的,現(xiàn)在可以看看link的定義
            struct link {
                
            int number;
                
            int children[1];
            }
            ;
            這個(gè)結(jié)構(gòu)就是parent用來記錄其所有child_id的地方。其中number用來記錄child的總數(shù)量,而children則是一個(gè)整數(shù)數(shù)組,用來記錄所有的child_id。
            cache_flush剩下的操作,就是把新的child_id添加到children中去,當(dāng)然其中包含其他一些細(xì)節(jié)處理。這里先把這些東西交代清楚,因?yàn)槠浜蟮拇a將是比較難以理解的,我仍不是十分的明白。
            posted on 2008-09-15 21:34 LOGOS 閱讀(2140) 評(píng)論(1)  編輯 收藏 引用

            FeedBack:
            # re: 垃圾收集的那點(diǎn)事(E) 2008-09-16 10:04 zuhd
            寫的不錯(cuò),云風(fēng)這段代碼是用c實(shí)現(xiàn)的,讀起來確實(shí)有點(diǎn)晦澀,作者分析的精神很贊!  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久久久人妻一区精品性色av| 久久久久99精品成人片试看| 99久久国产主播综合精品| 色综合久久最新中文字幕| A级毛片无码久久精品免费| 久久久久亚洲AV综合波多野结衣 | 久久久久久国产精品美女| 久久精品国产亚洲5555| 精品国产99久久久久久麻豆| 高清免费久久午夜精品| 久久伊人色| 久久99热只有频精品8| 久久久久国产一区二区| 久久久久亚洲av无码专区喷水 | 久久人妻少妇嫩草AV蜜桃| 久久99中文字幕久久| 久久综合精品国产二区无码| 无遮挡粉嫩小泬久久久久久久| 久久精品国产亚洲av水果派| 欧美激情精品久久久久久久| 精品国产乱码久久久久久呢| 一本一本久久a久久综合精品蜜桃| 久久久国产精品亚洲一区| 一级做a爱片久久毛片| 久久WWW免费人成一看片| 无码国内精品久久综合88| 精品免费tv久久久久久久| 模特私拍国产精品久久| 久久av无码专区亚洲av桃花岛| 精品久久久久久无码人妻蜜桃| MM131亚洲国产美女久久| 久久午夜福利无码1000合集| 久久精品无码一区二区日韩AV| 免费精品99久久国产综合精品| 日产精品久久久久久久性色| 久久精品综合网| 国产精品女同久久久久电影院| 国产99精品久久| 色欲久久久天天天综合网| 久久精品中文无码资源站| 一本久久a久久精品亚洲|