待辦事項 #9795

【Starlight Breaker】既得スレッドの更新時に固まる
啟用日期: 2007-01-12 21:48 最後更新: 2009-08-16 21:32

回報者:
負責人:
(無)
類型:
狀態:
關閉
元件:
(無)
里程碑:
(無)
優先權:
5 - 中
嚴重程度:
5 - 中
處理結果:
Out of Date
檔案:
1

細節

既得スレッドを更新する時、レインボーカーソルになり、完全に動作不能にな
る。

デバッグモードで2回遭遇。
2回ともメインスレッド上の同期ロック待ちと
別スレッド上(CMRThreadUpdatedHeaderTask)での -
[NSTextStorage endEditing] の待ち。

CMRThreadUpdatedHeaderTask と メインスレッド上でのNSTextView
の更新でデッドロックが掛かっているようである。

Ticket History (3/7 Histories)

2007-01-14 17:19 Updated by: masakih
  • 優先權 Update from 5 - 中 to 7
2007-01-22 02:18 Updated by: masakih
  • File 1708: bug-9795-bt.txt is attached
評語
Logged In: YES
user_id=2881

同様の状態に陥ったのでとりあえずバックトレースをした。
関係するのはおそらく Thread 1 と Thread 2。
2007-01-22 03:24 Updated by: masakih
評語
Logged In: YES
user_id=2881

NSTextStorage に(おそらく隠された)インスタンス変数の
NSViewHierarchyLock のインスタンスが存在する。
NSViewHierarchyLockは最下部で示す通り Read-Write Lock を実現するク
ラスである。
-[NSTextStorage beginEditing] は NSViewHierarchyLock を使い、
Write Lock を取得し、
-[NSTextStorage endEditing] でそれを返す。
(もちろんその他の編集でもそれを取得する。)

また、NSLayoutManager のインスタンス変数 _extraData は、
NSExtraLMData のインスタンスで それはインスタンス変数として、
NSRecursiveLock を持つ。
NSLayoutManager はほとんどの処理でこのロックを取得する。

Thread 1での処理は
1-a, NSLayoutManager が _extraData のロックを取得。
1-b, NSTextStorage が NSViewHierarchyLock の Read Lock を取
得。

Thread 2での処理は
2-a, NSTextStorage が NSViewHierarchyLock の Write Lock を取
得。
2-b, NSLayoutManager が _extraData のロックを取得。

となっている。

つまり、
2-a -> 1-a の順に処理が行われた場合、デッドロックが生じる。
これは、mutable なオブジェクトであるNSTextStorageを非同期に扱う限り
逃れられないものと考えられる。


# NSViewHierarchyLock のdescription を示す。
# NSViewHierarchyLock(0x563efa0) {
# readers: 1
# waiting readers: 0
# writers: 0
# waiting writers: 0
# thread id 1
# thread_entry (0x563eda0) {
# read recursion: 1
# write recursion: 0
# topOfStack: 1
# stack: 0x563e750 [ ?]
# }
# }
2007-01-24 22:03 Updated by: masakih
評語
Logged In: YES
user_id=2881

application/source/thread/CMRThreadLayout.m 内。
worker = [[CMXWorkerContext alloc]
initWithUsingDrawingThread : YES];

worker = [[CMXWorkerContext alloc]
initWithUsingDrawingThread : NO];
に変更したときの排他処理をみる。

結果。
排他処理は全く変わらない。
また、デバッグ一回目に全く同様のデッドロックが発生した。(これは単なる偶然
でしょう)

2007-01-24 22:08 Updated by: masakih
評語
Logged In: YES
user_id=2881

完全ではないが、デッドロックが掛かるであろう部分を探してみた。
今のところ CMRThreadUpdatedHeaderTask 以外に発見されない。
この処理を
-[NSObject
performSelectorOnMainThread:withObject:waitUntilDone:];
でMainThread上でやらせるようにして様子見中。
2007-02-13 04:39 Updated by: tsawada2
  • 優先權 Update from 7 to 5 - 中
評語
Logged In: YES
user_id=5983

様子見中ということで、少し重要度を落としておきます。

BathyScaphe~CocoMonar 時代からレイアウト部分の
コードは何度読んでも構造がよくわからん… orz
2009-08-16 21:32 Updated by: tsawada2
  • 處理結果 Update from to Out of Date
  • 狀態 Update from 開啟 to 關閉
  • Ticket Close date is changed to 2009-08-16 21:32

Attachment File List

  • bug-9795-bt.txt(3KB)
    • レインボーカーソル発生時の各スレッドのバックトレース

編輯

Please login to add comment to this ticket » 登入