[fpc-devel] Lazarus Apache module crashes during concurrent requests

ABorka fpc-devel at aborka.com
Tue Sep 23 03:11:08 CEST 2008


After some more debugging the result is even stranger:

If I reduce the code to the bare minimum there is still a crash most of 
the time.

1. works always for 2 concurrent requests:
procedure TCustomApacheApplication.HandleRequest(ARequest: TRequest; 
AResponse: TResponse);
Var
   MC : TCustomHTTPModuleClass;
   M  : TCustomHTTPModule;
   MN : String;
   MI : TModuleItem;
i:Integer;

begin
       MI:=ModuleFactory[0];
       MC:=MI.ModuleClass;
       M:=MC.Create(Self);
       M.Name := '';
aresponse.content := '<html>Hello</html>';
       for i := 0 to Maxint do;//time wasting loop, about 5 secs
end;

2. crashes randomly:
begin
       MI:=ModuleFactory[0];
       MC:=MI.ModuleClass;
       M:=MC.Create(Self);
       M.Name := '';
M.HandleRequest(ARequest,AResponse);
       for i := 0 to Maxint do;//time wasting loop, about 5 secs
end;//<= sometimes crash after here but before returning to caller function

3. always crashes:
begin
   try
       MI:=ModuleFactory[0];
       MC:=MI.ModuleClass;
       M:=MC.Create(Self);
       M.Name := '';
aresponse.content := '<html>Hello</html>';
       for i := 0 to Maxint do;//time wasting loop, about 5 secs
   except
     On E : Exception do
       ShowRequestException(AResponse,E);
   end;
end;//<= guaranteed crash after here but before returning to caller function


When M.HandleRequest(ARequest,AResponse); is used instead of 
aresponse.content := '<html>Hello</html>'; the crash is random at 
procedure return for the 2nd simultaneous caller.

When the procedure contains any try/except it is guaranteed not 
returning (crashing) after the work is finished for the 2nd caller (2nd 
simultaneaous request).

The first simultaneous caller always works without a problem.

Any suggestions?


ABorka wrote:
> win32, latest Lazarus and FPC
> Any single web request call works OK, returning the content.
> When 2 browsers are open and calling the web module at the same time 
> there is a crash happening after the 2nd one finishes working (just made 
> a loop in the web action which lasts a few seconds to have both requests 
> inside the server at the same time).
> Details:
> in /fpc/packages/fcl-web/src/fpapache.pp
> 
> Function TCustomApacheApplication.ProcessRequest(P: PRequest_Rec) : 
> Integer;
> 
> Var
>   Req : TApacheRequest;
>   Resp : TApacheResponse;
> 
> begin
>   Req:=TApacheRequest.CreateReq(Self,P);
>   Try
>     Resp:=TApacheResponse.CreateApache(Req);
>     Try
>       HandleRequest(Req,Resp);   <== call happens here OK but 2nd 
> concurrent request does not return, gets lost in the ether
>     Finally
>       Result:=OK;
>       Resp.Free;
>     end;
>   Finally
>     Req.Free;
>   end;
> end;
> 
> 
> procedure TCustomApacheApplication.HandleRequest(ARequest: TRequest; 
> AResponse: TResponse);
> 
> Var
>   MC : TCustomHTTPModuleClass;
>   M  : TCustomHTTPModule;
>   MN : String;
>   MI : TModuleItem;
> 
> begin
>   try
>     MC:=Nil;
>     If (OnGetModule<>Nil) then
>       OnGetModule(Self,ARequest,MC);
>     If (MC=Nil) then
>       begin
>       MN:=GetModuleName(ARequest);
>       If (MN='') and Not AllowDefaultModule then
>         Raise EFPApacheError.Create(SErrNoModuleNameForRequest);
>       MI:=ModuleFactory.FindModule(MN);
>       If (MI=Nil) and (ModuleFactory.Count=1) then
>         MI:=ModuleFactory[0];
>       if (MI=Nil) then
>         begin
>         Raise EFPApacheError.CreateFmt(SErrNoModuleForRequest,[MN]);
>         end;
>       MC:=MI.ModuleClass;
>       end;
>     M:=FindModule(MC); // Check if a module exists already
>     If (M=Nil) then
>       begin
>         M:=MC.Create(Self);
>         M.Name := '';//without this there's a crash due to same name
>       end;
>     M.HandleRequest(ARequest,AResponse);//calls the web action here, 
> works OK for both concurrent requests
>   except
>     On E : Exception do
>       ShowRequestException(AResponse,E);
>   end;
> end;  <== everything works, but the 2nd concurrent request crashes after 
> here but before returning to the caller function
> 
> 
> A little bit strange that this happens. The return content is prepared 
> in both simultaneous calls properly. Any thoughts what could be the cause?
> 
> AB
> 
> 
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
> 




More information about the fpc-devel mailing list