1

Delphi XE 中 Apache 方法 apr_pool_create_ex 的正确用法是什么?

我以前创建过 Apache 模块,但都是处理程序。现在我正在开发一个服务提供者。已经创建了一个骨架模块,Apache 正在调用我的 child_init 回调方法。在 child_init 方法中,我成功调用了 ap_pool_create_ex*(返回 APR_SUCCESS),但是在离开 child_it 调用后,我在第三个或第四个工作线程的(httpd.exe)生成期间收到访问冲突(第三个在事件中显示日志)。

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'。进程停止。使用 Step 或 Run 继续”</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 吗?我看到 apr_pool_create 正在其他成功的模块中使用,尽管它们是用“C”编写的。

操作系统:Windows 7 企业版 64 位

阿帕奇:2.2.17.0

IDE:德尔福 XE

4

1 回答 1

2

您对函数的翻译是否正确?Delphi XE Version Insight(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

此外,一些想法,因为你得到一个空指针访问冲突。根据 apr 源代码注释

  • 如果(如您的情况)您将其传递给 nil 分配器,则将使用父池的分配器。我假设如果父池为 nil,则分配器不能为 nil。
  • abort_fn如果池无法分配内存,将被回调。你没有通过它;也许池正在尝试调用它,因为它无法分配内存?
  • 我认为您不能从不同的线程访问同一个池。您可能必须为每个线程创建一个单独的池。
于 2011-03-26T00:31:06.250 回答