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

ABorka fpc-devel at aborka.com
Mon Sep 22 04:20:45 CEST 2008


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





More information about the fpc-devel mailing list