Gecko 內的死亡之握 – kungFuDeathGrip

在看 gecko 的 code 時無意間發現了這個神奇的區域變數:

kungFuDeathGrip
 ,乍看之下這個奇怪的區域變數在 function 內就只有被宣告,並且沒有被使用到,那麼到底為什麼要有這個變數的存在呢?為了更進一步了解這個變數的由來,我們先來看看 
kungFuDeathGrip
  字面上的意義,直接翻譯成中文的話就是:功夫死亡之握,下圖有更為生動地表示。

Death grip

死亡之握到底要握住什麼東西呢?在 gecko 的 code 搜尋 [1] 可以發現有許多地方都出現了 

kungFuDeathGrip
  變數,而且型別都是 smart pointer,例如:
nsCOMPtr
  或是
nsRefPtr
 。在 gecko 內幾乎所有的物件都是由 smart pointer 來管理的,關於smart pointer 的說明可以參照之前 kk1fff 的文章 [2]。簡單來說,smart pointer 所帶來的好處是當物件不再被使用到時,記憶體可以被自動的回收。由於常常會有多個物件共用同一個 smart pointer,所衍生出來的問題就是我們無法確切地掌握物件被刪除的時機點。在某些特殊的情況下,我們要確保某物件在特定的時間內必須要活著,不能被刪除。簡單的做法就是在 function 內多宣告一個 smart pointer 變數,並且指向該物件,其目的是為了增加 reference count ,當離開 function 的 scope 後,
kungFuDeathGrip
  變數會被刪除,也不會影響到原本的 reference count。雖然 
kungFuDeathGrip
  變數在 function 內並沒有被使用到,但是藉由這個做法,可以保證該物件在這個 function 的範圍內不會被刪除。

kungFuDeathGrip
  較為常見的用法如下 [3]:
nsCOMPtr<nsIWidget> kungFuDeathGrip(this);

可以看到 

kungFuDeathGrip
  通常都是指向 this,但是隨著 gecko 越來越複雜,也有許多的 
kungFuDeathGrip
  被用來指向其他的物件。

畢竟 

kungFuDeathGrip
  並不是一個完美的解法,而且對於 gecko 的初學者來說會造成理解上的困擾。所以在 bug 329937 內有人嘗試著想要根除
kungFuDeathGrip
 ,但是這還是有一定的困難度,畢竟根本的問題還是我們無法確切掌握物件被刪除的時機 ,所以短期內 
kungFuDeathGrip
  還是有其存在的必要性。

Reference

0 則回應

運用 Web 技術打造電視遙控器的操作環境 運用 Web 技術打造電視遙控器的操作環境 1 年前
在 Firefox 上建構 WebVR 在 Firefox 上建構 WebVR 1 年前
淺談 W3C Sensor API的發展 淺談 W3C Sensor API的發展 2 年前
解析 XPCOM 物件的 Reference Count 解析 XPCOM 物件的 Reference Count 2 年前
Mozilla 開發人員的強力小幫手 – Autolander Mozilla 開發人員的強力小幫手 – Autolander 2 年前

熱門文章

最新消息