下載
軟體開發
帳戶
下載
軟體開發
登入
我忘記帳戶名和密碼了
新增帳戶
語言
手冊
語言
手冊
×
登入
登入名稱
密碼
×
我忘記帳戶名和密碼了
繁體中文翻譯狀態
類別:
軟體
人
PersonalForge
Magazine
Wiki
搜尋
OSDN
>
軟體搜索
>
Internet
>
WWW/HTTP
>
Dynamic Content
>
Message Boards
>
BathyScaphe
>
Ticket List/Search
>
待辦事項 #9795
BathyScaphe
描述
專案概要
開發人員儀表板
專案的網頁
Developers
Image Gallery
List of RSS Feeds
活動
使用統計
歷史
檔案下載
發布列表
Stats
原始碼
儲存庫列表
Subversion
查看儲存庫
待辦事項
待辦事項列表
里程碑列表
類型列表
元件列表
List of frequently used tickets/RSS
新增待辦事項
新聞
待辦事項 #9795
待辦事項列表
新增待辦事項
RSS
【Starlight Breaker】既得スレッドの更新時に固まる
啟用日期:
2007-01-12 21:48
最後更新:
2009-08-16 21:32
監視
ON
OFF
回報者:
masakih
負責人:
(無)
類型:
問題回報
狀態:
關閉
元件:
(無)
里程碑:
(無)
優先權:
5 - 中
嚴重程度:
5 - 中
處理結果:
Out of Date
檔案:
1
細節
既得スレッドを更新する時、レインボーカーソルになり、完全に動作不能にな
る。
デバッグモードで2回遭遇。
2回ともメインスレッド上の同期ロック待ちと
別スレッド上(CMRThreadUpdatedHeaderTask)での -
[NSTextStorage endEditing] の待ち。
CMRThreadUpdatedHeaderTask と メインスレッド上でのNSTextView
の更新でデッドロックが掛かっているようである。
Ticket History (3/7 Histories)
Show older 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 (
1
)
Attachment File List
bug-9795-bt.txt
(3KB)
レインボーカーソル発生時の各スレッドのバックトレース
編輯
Please login to add comment to this ticket »
登入
る。
デバッグモードで2回遭遇。
2回ともメインスレッド上の同期ロック待ちと
別スレッド上(CMRThreadUpdatedHeaderTask)での -
[NSTextStorage endEditing] の待ち。
CMRThreadUpdatedHeaderTask と メインスレッド上でのNSTextView
の更新でデッドロックが掛かっているようである。