(toppers-users 2405) Re: lsAlloc,TlsSetValueについて

Naoto Yamashita n-yama @ systemdesign.co.jp
2006年 4月 14日 (金) 14:17:47 JST


こんにちは。
山下です。

小南様アドバイスありがとうございます。
今回、質問させていただきましたのはJSPカーネル上に構築した
アプリケーションを英語版Windows200Proで動作させた場合に
異常終了し、その要因となっているのがTlsSetValues実行箇所
となっていたことが起因となっています。
但し、日本語版の2000 ProおよびXP pro環境では問題無く(?)
動作しています。
やはり、TlsAllocの返すインデックスを使用してTlsSetValues
およびTlsGetValuesを使うように改修しようと思います。
また、何か分かりましたらメーリングリストにご報告いたします。

> こんばんは。
> 小南と申します。
> 
> 
> > こんにちは。
> > 山下と申します。
> > 
> > Windows APIのTlsAlloc,TlsSetValueについてご教授をお願いします。
> > 
> >  Toppers/JSPカーネル1.4のconfig/primary_thread.cでTLS用APIを
> >  以下のように使用している箇所があります。
> > 
> >     TlsAlloc();
> > 
> >     TlsSetValue(TLS_LOGMASK, (LPVOID)1);
> >     TlsSetValue(TLS_THREADHANDLE, (LPVOID)CurrentRunningThreadHandle);
> > 
> >  TlsAlloc,TlsSetValueを参考文献などは、TlsAllocを実行した結果として
> >  返される値(インデックス)をTlsSetValueの第一引数として与えると
> >  記載されていました。
> >  Toppers/JSPカーネルでは、TlsSetValueの第一引数のインデックスに
> >  固定の値(TLS_LOGMASK、TLS_THREADHANDLE)を設定していますが、
> >  このような使い方で問題ないのでしょうか。
> > 
> >  ちなみに、当方環境で、TlsAllocを実行したところ戻り値として21が
> >  返されました。
> >  TLS_LOGMASK、TLS_THREADHANDLEについては、以下の値として
> >  定義されています。
> > #define TLS_LOGMASK         0x00000001      //ログ出力マスク
> > #define TLS_THREADHANDLE    0x00000002      //CreateThreadしたときのハンドル
> > 
> > アドバイスの程、よろしくお願い致します。
> 
> 私はWindows版のシミュレータは試しに動かしてみた程度です。
> Windowsのスレッドのプログラミングは大分前に経験したことがあるぐらいです。
> ですのでその点を割り引いて読んでください。
> 
> JSP1.4.2の該当部分をみてみたところ、おっしゃる通りの使われかたを
> しています。
> TLSの使いかたとしては,TlsAlloc()で確保して,返されるインデックスで
> TlsSetValue()で設定,TlsGetValue()で取得、TlsFree()で開放になります。
> インデックスを保持する変数が関数のスコープを越える場合は、スレッド間で共有さ
> れるます。しかしインデックスが指すTLS領域の値は、スレッド毎に異なることが
> 保証されます。
> 
> このため、2個の変数を使用するなら、それぞれの変数に対応するインデックスを
> 取得する必要があります。
> 
> ところがソースはそうなっていません。
> TlsAlloc()でスレッド毎に欲しいだけのTLSの領域が確保されるかの
> ような書き方です。
> 
> これはWindowsのTLSの使いかたとしては間違っていると思います。
> ただし今回の場合、どういう影響があるのかまでは分かりません。
> 同じプログラムでも、起動する毎に挙動が異なるかもしれません。
> 
> ----------------------------------- 
> 小南 ykominami @ nifty.com
>