Re: [fpc-pascal] threads, memory barriers and RTLeventSetEvent / RTLeventWaitFor

2019-10-01 Thread Sven Barth via fpc-pascal
Martin  schrieb am Di., 1. Okt. 2019, 17:19:

> I am currently looking at a strange issue in FpDebug.
>
> The main thread loads a lot of data from a file, and creates various
> objects.
>
> Then some code is executed in a sub-thread. The timing of that
> (start/stop of the 2 threads) is handled by RTLeventSetEvent /
> RTLeventWaitFor.
> This code does not seem to find (some of/ all?) the data. (for
> comparison, on windows the same code continues to run in the main
> thread, and finds the data).
>
> So the suspicion arises that maybe the thread has older data cached?
>
> Therefore my question:
> Does RTLeventSetEvent / RTLeventWaitFor make sure memory is synchronized
> between threads?
>
> //MAIN thread
> procedure TFpDebugDebugger.ExecuteInDebugThread(AMethod:
> TFpDbgAsyncMethod);
> begin
>assert(not assigned(FFpDebugThread.AsyncMethod));
>FFpDebugThread.AsyncMethod:=AMethod;
>RTLeventSetEvent(FFpDebugThread.StartDebugLoopEvent);
>RTLeventWaitFor(FFpDebugThread.DebugLoopStoppedEvent);
>RTLeventResetEvent(FFpDebugThread.DebugLoopStoppedEvent);
>FFpDebugThread.AsyncMethod:=nil;
> end;
>
> // OTHER thread
> procedure TFpDebugThread.Execute;
> begin
> ...
>  repeat
>  RTLeventWaitFor(FStartDebugLoopEvent);
>  RTLeventResetEvent(FStartDebugLoopEvent);
>if assigned(FAsyncMethod) then
>  begin
>  try
>FAsyncMethod();
>  finally
>RTLeventSetEvent(FDebugLoopStoppedEvent);
>  end;
>  end;
>  until Terminated;
> end;
>

The functions themselves AFAIK don't have any memory barriers, so it would
depend solely on the OS primitives.

Regards,
Sven

>
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


[fpc-pascal] threads, memory barriers and RTLeventSetEvent / RTLeventWaitFor

2019-10-01 Thread Martin

I am currently looking at a strange issue in FpDebug.

The main thread loads a lot of data from a file, and creates various 
objects.


Then some code is executed in a sub-thread. The timing of that 
(start/stop of the 2 threads) is handled by RTLeventSetEvent / 
RTLeventWaitFor.
This code does not seem to find (some of/ all?) the data. (for 
comparison, on windows the same code continues to run in the main 
thread, and finds the data).


So the suspicion arises that maybe the thread has older data cached?

Therefore my question:
Does RTLeventSetEvent / RTLeventWaitFor make sure memory is synchronized 
between threads?


//MAIN thread
procedure TFpDebugDebugger.ExecuteInDebugThread(AMethod: TFpDbgAsyncMethod);
begin
  assert(not assigned(FFpDebugThread.AsyncMethod));
  FFpDebugThread.AsyncMethod:=AMethod;
  RTLeventSetEvent(FFpDebugThread.StartDebugLoopEvent);
  RTLeventWaitFor(FFpDebugThread.DebugLoopStoppedEvent);
  RTLeventResetEvent(FFpDebugThread.DebugLoopStoppedEvent);
  FFpDebugThread.AsyncMethod:=nil;
end;

// OTHER thread
procedure TFpDebugThread.Execute;
begin
...
    repeat
    RTLeventWaitFor(FStartDebugLoopEvent);
    RTLeventResetEvent(FStartDebugLoopEvent);
  if assigned(FAsyncMethod) then
    begin
    try
  FAsyncMethod();
    finally
  RTLeventSetEvent(FDebugLoopStoppedEvent);
    end;
    end;
    until Terminated;
end;

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal