2007-11-10

setitimer on leopard

POSIX系OSでプロファイラなどを作る際にsetitimer関数を利用します。以下のようにするとタイマを設定することが出来ます。

struct itimer value, ovalue;

value.it_interval.tv_sec = 0;
value.it_interval.tv_usec = 1;
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 1;
if (setitimer(ITIMER_PROF, &value, &ovalue) != 0)
{ error_code; }

ここで設定した秒数ごとにSIGPROFシグナルが投げられますので、プロファイラをsigactionでSIGPROFに設定しておきます。

struct sigaction old;
struct sigaction new;

memset(&new, 0, sizeof(new));
new.sa_handler = プロファイラ関数;
if (sigaction(SIGPROF, &new, &old) != 0)
{ error_code; }

ところでプロファイラを起動する間隔ですが、これは先ほど設定したSIGPROFを投げるインターバルに依存しますから、上の例のように気軽に1マイクロ秒とかには出来ないわけです。基本的には。でもLinuxなどでは適当な値に丸められるので、上記のようなコードが放置されるケースが見受けられます。

さて先頃リリースされたLeopardにコレといった不具合も出てないようだったので喜んでインストールした私です。そして色々とソフト入れてて上の問題にぶつかったわけです(SWI-Prologでしたが)。なんとLeopardは1マイクロ秒でもタイマが起動しちゃようです、ビビりました。そんな間隔で起動されたら他のプロセスにちっともスイッチされなくなります。そういうわけなので統計クロックから適切な値を設定してやるようにしましょう。

value.it_interval.tv_usec = 1000000/(int)sysconf(_SC_CLK_TCK);

0 件のコメント: