1

Delphi XEでのApacheメソッドapr_pool_create_exの適切な使用法は何ですか?

以前にApacheモジュールを作成しましたが、すべてハンドラーでした。現在、サービスプロバイダーの開発に取り組んでいます。スケルトンモジュールが作成され、child_initコールバックメソッドがApacheによって呼び出されています。child_initメソッドでap_pool_create_ex*を正常に呼び出します(APR_SUCCESSを返します)が、child_it呼び出しを終了した後、3番目または4番目のワーカースレッドの(httpd.exe)スポーン中にアクセス違反を受け取ります(3番目はイベントに表示されます)ログ)。

procedure provider_child_init(pchild: Papr_pool_t; s: Pserver_rec); cdecl;
var
  rv  : apr_status_t;
  mypool : Papr_pool_t;
begin
  rv := -1;
  rv := apr_pool_create_ex(@mypool,pchild,nil,nil);
end;

AVメッセージは次のとおりです。

「プロジェクトC:\ Apache2.2 \ bin \ http.exeで連続した例外が多すぎます:'0x00000000でのアクセス違反:アドレス0x00000000の読み取り'。プロセスが停止しました。ステップまたは実行を使用して続行します」</p>

イベントログ:

…
Thread Start: Thread ID: 5652. Process httpd.exe (4212)
Thread Start: Thread ID: 5132. Process httpd.exe (4212)
Thread Start: Thread ID: 5988. Process httpd.exe (4212) 

注:AVはスレッドID 5988で発生し、4212は親httpd.exeプロセスです。

  • Windowsの「libapr-1.dll」には「apr_pool_create」が含まれていないため、「_ex」バージョンを使用しています。apr_pool_createが欠落している理由はありますか?'C'で記述されていますが、apr_pool_createが他の成功したモジュールで使用されているのがわかります。

OS:Windows 7Enterprise64ビット

Apache:2.2.17.0

IDE:Delphi XE

4

1 に答える 1

2

関数の翻訳は正しいですか?Delphi XEバージョンインサイト(Subversionプラグイン)はそれを次のように宣言します:

type
  PAprPool = ^TAprPool;
  TAprPool = THandle;
  PAprAllocator = ^TAprAllocator;
  TAprAllocator = THandle;
  TAprAbortFunc = function(retcode: Integer): Integer; stdcall;

var
  apr_pool_create_ex: function(out newpool: PAprPool; parent: PAprPool; abort_fn: TAprAbortFunc;
    allocator: PAprAllocator): TAprStatus; stdcall;

また、provider_child_initコールバックが実際にとして宣言されるべきでcdeclあり、ではなく宣言されるべきかどうかを確認してくださいstdcall

また、nullポインタアクセス違反が発生したため、いくつかのアイデアがあります。4月のソースコードコメントによると:

  • (あなたの場合のように)あなたがそれにnilアロケーターを渡すと、親プールのアロケーターが使用されます。親プールがnilの場合、アロケータはnilであってはならないと思います。
  • abort_fnプールがメモリを割り当てることができない場合、コールバックされます。あなたはそれをゼロにしています。おそらく、プールはメモリを割り当てることができないため、それを呼び出そうとしていますか?
  • 異なるスレッドから同じプールにアクセスできるとは思いません。おそらく、スレッドごとに個別のプールを作成する必要があります。
于 2011-03-26T00:31:06.250 に答える