2012-01-27 9 views
1

perlモジュールの* .XS部分の中にあるC関数内の現在のperlスレッドIDを取得する必要があります。純粋なPerlでXSコードでthreads-> tid()の値を取得するには?

(*の.pm部)I単にだろう:

$id = threads->tid(); 

しかし、XSでこの値を取得するための推奨方法は何ですか?

残念ながら、http://perldoc.perl.org/perlthrtut.htmlhttp://perldoc.perl.org/threads.htmlは、XSでのスレッドの処理については言及していません。事前に

おかげ

- KMX

答えて

2

メソッドを呼び出すには、call_methodを使用します。

UV get_tid() { 
    dSP; 
    UV tid; 

    ENTER; 
    SAVETMPS; 

    PUSHMARK(SP); 
    XPUSHs(sv_2mortal(newSVpv("threads", 0))); 
    PUTBACK; 

    count = call_method("tid", G_SCALAR|G_EVAL); 

    SPAGAIN; 
    if (SvTRUE(ERRSV) || count != 1) 
     tid = 0; 
    else 
     tid = (UV)POPi; 
    PUTBACK; 

    FREETMPS; 
    LEAVE; 

    return tid; 
} 
+0

ありがとう。これは動作しますが、私のモジュールが( "use MyModule"によって) "use threads"と共にロードされている場合にのみ有効です。スレッドがロードされていない(つまりtid = 0)ことをXSで検出するにはどうすればよいですか?今度はあなたのコードは次のようなエラーを表示します:パッケージ "スレッド"を介してオブジェクトメソッド "tid"を見つけることができません... – kmx

+0

私はそれを持っています、私はG_SCALAR | G_EVALを必要とします – kmx

+0

#ifndef USE_ITHREADS tid =オプションでPerl_load_module()を介してモジュールインポータを呼び出します。 – rurban

0

は、スレッド自体がそれをしない方法を参照してください!私はあなたがCPANからthreadsをダウンロードし、解凍して、threads.xsを見てください。あなたが必要とする部分はithread_tidと呼ばれる機能です。

+0

他のモジュールから直接アクセスできないスレッドの内部変数MY_CXT.contextを返します。 – kmx

関連する問題