<p dir="ltr">Hi, actually getlasterror only applies to the calling thread, getlastOSerror is the one not to use.<br>
Anyway I think I found the solution.<br>
Just for kicks I put in a name with a / I.e /test_name and getlasterror came back with the same error.  So the API is being called somewhere with teventobject.create, anyway instead of leaving name blank I put a giud in for the name and low and behold the error stopped.  It appears there is a limit or a bug on creating unnamed events from a single process.   When you leave name blank the os must be creating a unique name somehow and it has some issue with a lot of them being created and destroyed. When I compiled as 64bit it took much longer for the error to happen.  After I used the guid for the event name I stress tested the server with 10s of thousands of connection and disconnecting and that error never happened again.</p>
<p dir="ltr">So windows limit or bug? Or could it be a bug in  FPC?</p>
<div class="gmail_extra"><br><div class="gmail_quote">On Oct 14, 2016 9:23 AM, "Jonas Maebe" <<a href="mailto:jonas.maebe@elis.ugent.be" target="_blank">jonas.maebe@elis.ugent.be</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 14/10/16 02:43, Snorkl e wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Anyway, I am using a third party SFTP server lib and it creates a thread<br>
inherited from tthread and in the create event of the tthread descendant<br>
it does this:<br>
(It uses this thread to read and write data on the socket)<br>
<br>
FDataAvailable := TEvent.Create(nil, True, False, '');  //tevent maps to<br>
teventobject<br>
<br>
{$IFDEF MSWINDOWS}<br>
  lasterr:=GetLastError;<br>
</blockquote>
<br>
GetLastError() will return the error code of the last Windows API call that has been performed. I doubt TEvent.Create() guarantees not to call any Windows API's between creating an event using a Windows event and returning. E.g., it might allocate or free memory in between, or the FPC RTL may have done that in the context of handling the constructor call.<br>
<br>
You should only call GetLastError() immediately after calling a Windows API function yourself. In any other case, you cannot know what may have transpired in between.<br>
<br>
<br>
Jonas<br>
______________________________<wbr>_________________<br>
fpc-pascal maillist  -  <a href="mailto:fpc-pascal@lists.freepascal.org" target="_blank">fpc-pascal@lists.freepascal.or<wbr>g</a><br>
<a href="http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal" rel="noreferrer" target="_blank">http://lists.freepascal.org/cg<wbr>i-bin/mailman/listinfo/fpc-pas<wbr>cal</a><br>
</blockquote></div></div>