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






















看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升序排序




























cache_flush剩下的操作,就是把新的child_id添加到children中去,當然其中包含其他一些細節處理。這里先把這些東西交代清楚,因為其后的代碼將是比較難以理解的,我仍不是十分的明白。