• <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

            博客搬家了哦,請移步
            叫我abc

            常用鏈接

            留言簿(12)

            隨筆分類

            我的博客

            搜索

            •  

            積分與排名

            • 積分 - 303613
            • 排名 - 84

            最新評論

            閱讀排行榜

            cache_flush算是這個庫最糟糕的一段代碼了,總共有100多行,縮進糟糕,做很多不同的工作。我就納悶,為什么不抽些子函數出來,這樣的代碼基本上不具備維護價值,因為自己重寫一次,比搞明白這個函數有趣多了。
            由于這個函數實在太長,所以不一次全貼上來,一部分一部分的看吧。

            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);
            }
            首先,對 E.cache進行排序,比較子是cache_node_cmp。
            return cb->parent - ca->parent ,是用 cb減去ca的,因此首先根據parent_id進行降序排序。注意,在這一比較結果中,如果ca->parent = -1,那么比較結果為正,空閑節點ca往數組右邊移動;如果cb->parent = -1,那么比較結果為負,空閑節點cb還是會處在數組右邊。
            為什么要注意這個呢?因為本次排序的一個結果就是,那些空閑節點都集中到了cache數組的右邊,只要遍歷cache的過程中遇到了第一個空閑節點,那么剩下的必然都是空閑節點了。
            當然要達成這個排序結果,還需要下面的這步,if (ca->parent == -1 ) {return 0;}
            比較子的最后一句,在parent_id相同的情況下,按child_id升序排序。

            E.cache經過排序后,呈現出以下狀況:
            1.根據parent_id呈降序排序,并且parent_id相同的節點緊挨在一起
            2.空閑的cache節點全部都排在了數組的右邊
            3.parent_id相同的節點,按child_id升序排序

                while (i<CACHE_SIZE) {

                    
            if (parent==-1{
                        
            return;
                    }
            排序之后,就是遍歷有序的cache數組。可以看到排序的效果了,當parent_id = -1的時候,就只剩下空閑的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;
                    }
            這一段代碼,是統計同一parent_id下child的數目。因為有些child_id被標記了 UNSET_MASK,因此這種cache節點就不用統計到總數中了。其中UNSET_MASK_BIT是位移操作,如果child被標記了UNSET_MASK,那么位移的結果就是1,1-1=0,也就沒有統計到總數中了。

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

            FeedBack:
            # re: 垃圾收集的那點事(E) 2008-09-16 10:04 zuhd
            寫的不錯,云風這段代碼是用c實現的,讀起來確實有點晦澀,作者分析的精神很贊!  回復  更多評論
              
            久久91精品国产91| 精品久久人人做人人爽综合| 久久只有这精品99| 久久久久亚洲AV无码专区首JN| 亚洲国产成人精品91久久久| 狠狠色丁香婷婷久久综合五月| 国产成人无码精品久久久性色| 7777久久久国产精品消防器材| 国产欧美久久久精品| 精品久久久无码中文字幕天天| 亚洲愉拍99热成人精品热久久| 久久免费视频网站| 久久久久久久波多野结衣高潮| 国产精品久久久久影院嫩草| 香蕉久久夜色精品国产尤物| 久久国产亚洲精品麻豆| 久久人做人爽一区二区三区| 国产午夜福利精品久久| 久久国产劲爆AV内射—百度| 久久久久国产亚洲AV麻豆| 精品乱码久久久久久久| 国产色综合久久无码有码| 成人亚洲欧美久久久久| 国产精品对白刺激久久久| 亚洲欧美一区二区三区久久| 久久久WWW成人免费毛片| 久久综合综合久久97色| 国产精品久久久久影视不卡| 亚洲AV无码成人网站久久精品大| 久久精品视频91| 四虎影视久久久免费| 日韩电影久久久被窝网| 97精品国产97久久久久久免费| 久久香蕉国产线看观看精品yw| 久久久久久国产精品美女| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久精品青青草原伊人| 欧美粉嫩小泬久久久久久久| 久久久久久噜噜精品免费直播| 久久国产免费| 免费精品国产日韩热久久|