1. 程式人生 > >定時器實現過程的bug總結

定時器實現過程的bug總結

定時器是參考linux核心定時器設計實現的. 遇到了兩個比較致命而且比較隱蔽的bug.

用了各種方法debug, 看來是確實是程式碼寫挫了.

 bug1: 

         在後一個時間輪子向前一個時間輪子遷移定時器時步驟:

         1. 移除後一個時間輪子頭指標指向的雙向連結串列表頭的定時器.

         2. 重新插入該定時器.

         3. 重複1, 2直到該雙向連結串列為空.

         問題: 移除的定時器可能會重新插入到當前的雙向連結串列, 出現這情況就會導致死迴圈.

         改進: 先把移除的定時器儲存起來, 在移除完後再一次性插入.

bug2:

        根據bug1修改後遷移定時器時步驟:

         1. 移除後一個時間輪子首指標指向的雙向連結串列表頭的定時器.

         2. 把該定時器放到快取裡.

         3. 重複1, 2直到該雙向連結串列為空.

         4. 插入快取裡的定時器.

         5. 後一個時間輪子頭指標順時針移一格, 如果頭指標回到了起始位置, 則繼續和下一個輪子重複以上動作.

         問題: 當快取裡的定時器是在原來頭指標指向的格子時, 而恰好還沒到時間遷移到前一個輪子,這時這定時器會重新插到頭指標指向的格子(這就是導致bug1發生的情況),  看起來是沒什麼問題,不過下一步頭指標移動後, 該定時器就相當於延長了一個輪子的時間, 只能等到下一次頭指標重新移到該格子上時才能觸發這定時器.

         兩個bug都是在特殊情況下才發生. 測試的時候沒測出來, 在寫定時心跳時, 才艱難地發現. 必需得繼續努力..