Re: [twsocket] Interestingmultithreadingissue:raceconditionwhentriggering an event handler

2006-08-07 Thread Arno Garrels
Francois Piette wrote:
> This raise the following question : Is a field variable in a class
> aligned in memory ? (OnMyEvent variable is just a field variable).

Isn't a field "properly aligned in memory" when switch {$A8} is set?

---
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html


> --
> [EMAIL PROTECTED]
> http://www.overbyte.be
> 
> - Original Message -
> From: "Arno Garrels" <[EMAIL PROTECTED]>
> To: "ICS support mailing" 
> Sent: Monday, August 07, 2006 11:27 AM
> Subject: Re: [twsocket] Interesting
> multithreadingissue:raceconditionwhentriggering an event handler
> 
> 
>> Francois Piette wrote:
 This requires atomic reading/writing of a Pointer (no thread switch
 while read/write), I'm not sure whether this is true.
>>> 
>>> I think so since pointer are 32 bits and are accessed by only one
>>> memory cycle. If you look at the Windows API InterlockedXYZ
>>> function, there is none to access a single 32 bit value. So I guess
>>> it is guaranteed to have a 32 bit access done in one chunk.
>> 
>> In order to clear myself up finally I goggled a bit and found this:
>> 
>> http://windowssdk.msdn.microsoft.com/en-us/library/ms684122.aspx
>> 
>> "Simple reads and writes to properly-aligned 32-bit variables are
>> atomic. 
> In other words, when one thread is updating a 32-bit variable, you
> will not end up with only one portion of the variable updated; all 32
> bits are updated in an atomic fashion. However, access is not
> guaranteed to be synchronized. If two threads are reading and writing
> from the same variable, you cannot determine if one thread will
> perform its read operation before the other performs its write
> operation. 
>> Simple reads and writes to properly aligned 64-bit variables are
>> atomic on 
> 64-bit Windows. Reads and writes to 64-bit values are not guaranteed
> to be atomic on 32-bit Windows. Reads and writes to variables of
> other sizes are not guaranteed to be atomic on any platform."
>> 
>> But is this also true for Unix OS? Some articles I found say that
>> atomicity is garanteed up to native int only.
>> 
>> ---
>> Arno Garrels [TeamICS]
>> http://www.overbyte.be/eng/overbyte/teamics.html
>> 
>> 
>>> 
>>> Contribute to the SSL Effort. Visit
>>> http://www.overbyte.be/eng/ssl.html --
>>> [EMAIL PROTECTED]
>>> Author of ICS (Internet Component Suite, freeware)
>>> Author of MidWare (Multi-tier framework, freeware)
>>> http://www.overbyte.be
>>> 
>>> 
>>> - Original Message -
>>> From: "Arno Garrels" <[EMAIL PROTECTED]>
>>> To: "ICS support mailing" 
>>> Sent: Monday, August 07, 2006 9:35 AM
>>> Subject: Re: [twsocket] Interesting multithreading issue:
>>> raceconditionwhentriggering an event handler
>>> 
>>> 
 Arno Garrels wrote:
> Francois PIETTE wrote:
>> I've found an interesting multithreading issue which is related
>> not The solution is to rewrite the procedure as follow:
>> 
>> Line1: procedure TMyComponent.TriggerMyEvent(MyArg : Integer);
>> Line2: var
>> Line3: TMyEventProc EventProc;
>> Line4: begin
>> Line5: EventProc := OnMyEvent;
>> Line6: if Assigned(EventProc) then
>> Line7: EventProc(Self, MyArg);
>> Line8: end;
>> Saving the event pointer in line5 make sure that it is still
>> valid in the case a thread switch between Line 6 and 7 occur and
>> the OnMyEvent is set to nil by the other thread.
>> 
>> Interesting, isn't it ?
> 
> I think it's better/faster than having critical sections for all
> triggers, do you plan to change all ICS triggers accordingly?
 
 This requires atomic reading/writing of a Pointer (no thread switch
 while read/write), I'm not sure whether this is true. Byte
 variables are written/read in one go, there's no ploblem.
 
 ---
 Arno Garrels [TeamICS]
 http://www.overbyte.be/eng/overbyte/teamics.html
 
 
 --
 To unsubscribe or change your settings for TWSocket mailing list
 please goto http://www.elists.org/mailman/listinfo/twsocket
 Visit our website at http://www.overbyte.be
>> --
>> To unsubscribe or change your settings for TWSocket mailing list
>> please goto http://www.elists.org/mailman/listinfo/twsocket
>> Visit our website at http://www.overbyte.be
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be


Re: [twsocket] Interestingmultithreadingissue:raceconditionwhentriggering an event handler

2006-08-07 Thread Arno Garrels
Francois Piette wrote:
> This raise the following question : Is a field variable in a class
> aligned in memory ? (OnMyEvent variable is just a field variable).

I don't know, and it also raises a second question: 
> Reads and writes to variables of
> other sizes are not guaranteed to be atomic on any platform."

Are i.e. reads/writes of Byte-variables not atomic in any Windows
version, and if yes what versions are they? If that was true for
32-Bit Win I would have to change plenty of code :(

---
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html

 
> --
> [EMAIL PROTECTED]
> http://www.overbyte.be
> 
> - Original Message -
> From: "Arno Garrels" <[EMAIL PROTECTED]>
> To: "ICS support mailing" 
> Sent: Monday, August 07, 2006 11:27 AM
> Subject: Re: [twsocket] Interesting
> multithreadingissue:raceconditionwhentriggering an event handler
> 
> 
>> Francois Piette wrote:
 This requires atomic reading/writing of a Pointer (no thread switch
 while read/write), I'm not sure whether this is true.
>>> 
>>> I think so since pointer are 32 bits and are accessed by only one
>>> memory cycle. If you look at the Windows API InterlockedXYZ
>>> function, there is none to access a single 32 bit value. So I guess
>>> it is guaranteed to have a 32 bit access done in one chunk.
>> 
>> In order to clear myself up finally I goggled a bit and found this:
>> 
>> http://windowssdk.msdn.microsoft.com/en-us/library/ms684122.aspx
>> 
>> "Simple reads and writes to properly-aligned 32-bit variables are
>> atomic. 
> In other words, when one thread is updating a 32-bit variable, you
> will not end up with only one portion of the variable updated; all 32
> bits are updated in an atomic fashion. However, access is not
> guaranteed to be synchronized. If two threads are reading and writing
> from the same variable, you cannot determine if one thread will
> perform its read operation before the other performs its write
> operation. 
>> Simple reads and writes to properly aligned 64-bit variables are
>> atomic on 
> 64-bit Windows. Reads and writes to 64-bit values are not guaranteed
> to be atomic on 32-bit Windows. Reads and writes to variables of
> other sizes are not guaranteed to be atomic on any platform."
>> 
>> But is this also true for Unix OS? Some articles I found say that
>> atomicity is garanteed up to native int only.
>> 
>> ---
>> Arno Garrels [TeamICS]
>> http://www.overbyte.be/eng/overbyte/teamics.html
>> 
>> 
>>> 
>>> Contribute to the SSL Effort. Visit
>>> http://www.overbyte.be/eng/ssl.html --
>>> [EMAIL PROTECTED]
>>> Author of ICS (Internet Component Suite, freeware)
>>> Author of MidWare (Multi-tier framework, freeware)
>>> http://www.overbyte.be
>>> 
>>> 
>>> - Original Message -
>>> From: "Arno Garrels" <[EMAIL PROTECTED]>
>>> To: "ICS support mailing" 
>>> Sent: Monday, August 07, 2006 9:35 AM
>>> Subject: Re: [twsocket] Interesting multithreading issue:
>>> raceconditionwhentriggering an event handler
>>> 
>>> 
 Arno Garrels wrote:
> Francois PIETTE wrote:
>> I've found an interesting multithreading issue which is related
>> not The solution is to rewrite the procedure as follow:
>> 
>> Line1: procedure TMyComponent.TriggerMyEvent(MyArg : Integer);
>> Line2: var
>> Line3: TMyEventProc EventProc;
>> Line4: begin
>> Line5: EventProc := OnMyEvent;
>> Line6: if Assigned(EventProc) then
>> Line7: EventProc(Self, MyArg);
>> Line8: end;
>> Saving the event pointer in line5 make sure that it is still
>> valid in the case a thread switch between Line 6 and 7 occur and
>> the OnMyEvent is set to nil by the other thread.
>> 
>> Interesting, isn't it ?
> 
> I think it's better/faster than having critical sections for all
> triggers, do you plan to change all ICS triggers accordingly?
 
 This requires atomic reading/writing of a Pointer (no thread switch
 while read/write), I'm not sure whether this is true. Byte
 variables are written/read in one go, there's no ploblem.
 
 ---
 Arno Garrels [TeamICS]
 http://www.overbyte.be/eng/overbyte/teamics.html
 
 
 --
 To unsubscribe or change your settings for TWSocket mailing list
 please goto http://www.elists.org/mailman/listinfo/twsocket
 Visit our website at http://www.overbyte.be
>> --
>> To unsubscribe or change your settings for TWSocket mailing list
>> please goto http://www.elists.org/mailman/listinfo/twsocket
>> Visit our website at http://www.overbyte.be
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be