« Emacs Threads 20161231 | Main | Emacs Threads 20170115 »

January 03, 2017

Emacs Threads 20170103

大晦日にEmacscondvarについて書いた。その後、mutexのオーナーが自スレッドかどうかのチェックを、mutexの作成者かどうかのチェックと勘違いしていたため、それを踏まえて再確認した。

Ws000093

これが今囘使用するテストプログラム。自前のタスクライブラリを使用して、condition-waitを呼び出すだけの無名關數をスレッドとして起動する。

Ws000094

上記のテストプログラムをgdbから起動したEmacsで動かすことにする。その方がクラッシュしたり、知らないうちにスレッドがexitしてしまったりしても、すぐに氣付くことが出來る。

Ws000095

pop-to-bufferのところまで實行してみた。ログにはcondition-waitを呼び出す手前のメッセージが出ており、condition-waitの中で止まっているようである。この部分は事前に詳細に追いかけてみたが、實際にはpthread_cond_waitの中でブロックされている。

Ws000096

gdbの畫面を見るとスレッド(LWP 6279)が1個增えているのが分かる。

Ws000097

その後、condition-notifyを呼び出すと同時にスレッドが1exitする。この部分も事前にステップ實行しているが、なにせスパゲッティコードのような動き方をするので、よく分からない。正常に動作したのであれば「Recieve Notify」というメッセージがログに表示されるはずであるが、その前にスレッドがexitしてしまっている。何となくではあるが、pthread_cond_waitからリターンしてきたあと、longjmpし、cleanup處理(unwind-protectのような動き)をして、run_thread關數を終わっているようだ。つまり、何らかの囘復可能なエラーが起きたものと思われる。

Ws000098

上のソースはcondition-wait關數の中でpthread_cond_waitsys_cond_wait)を呼び出している部分である。その少し手前でcondvarに關連するmutexをアンロックし? pthread_cond_waitには別のロック(src/thread.cの中のstatic變數)を渡している。これはpthreadライブラリを直接使用する、他のCプログラムサンプルとかなり異なる手順に見える。まあ、それでもちゃんと動いてくれれば良いのだが。というか、そもそもcondition-waitってexit待ちじゃないよね?(笑)

|

« Emacs Threads 20161231 | Main | Emacs Threads 20170115 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/64715725

Listed below are links to weblogs that reference Emacs Threads 20170103:

« Emacs Threads 20161231 | Main | Emacs Threads 20170115 »