2010/8/17 Ozkan Sezer <seze...@gmail.com>: > On Tue, Aug 17, 2010 at 4:08 PM, Kai Tietz <ktiet...@googlemail.com> wrote: >> 2010/8/17 Ozkan Sezer <seze...@gmail.com>: >>> On Tue, Aug 17, 2010 at 3:50 PM, Kai Tietz <ktiet...@googlemail.com> wrote: >>>> 2010/8/17 Pete Batard <pbat...@gmail.com>: >>>>> On 2010.08.17 12:55, Kai Tietz wrote: >>>>>> Pete, >>>>>> >>>>>> could you provide us a list of the Interlock* API, which has stdcall >>>>>> calling convention by our findings? Please just list names of those >>>>>> functions and don't copy from VC's header-set. So we can adjust things >>>>>> for win32 more easily without violating EULA. >>>>> >>>>> Thanks for the speedy replies. >>>>> >>>>> As far as we are concerned, we only had InterlockedExchange and >>>>> InterlockedIncrement being a problem, as these are the only 2 call from >>>>> Interlocked API we use. >>>>> >>>>> The following is copied from MinGW32's winbase.h [1] which should work >>>>> with your EULA. It looks like you might need to add some #ifdefs as well: >>>>> >>>>> #if !(__USE_NTOSKRNL__) >>>>> /* CAREFUL: These are exported from ntoskrnl.exe and declared in winddk.h >>>>> as __fastcall functions, but are exported from kernel32.dll as >>>>> __stdcall */ >>>>> #if (_WIN32_WINNT >= 0x0501) >>>>> WINBASEAPI VOID WINAPI InitializeSListHead(PSLIST_HEADER); >>>>> #endif >>>>> #ifndef __INTERLOCKED_DECLARED >>>>> #define __INTERLOCKED_DECLARED >>>>> LONG WINAPI InterlockedCompareExchange(LONG volatile *,LONG,LONG); >>>>> /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ >>>>> #define InterlockedCompareExchangePointer(d,e,c) \ >>>>> (PVOID)InterlockedCompareExchange((LONG volatile >>>>> *)(d),(LONG)(e),(LONG)(c)) >>>>> LONG WINAPI InterlockedDecrement(LONG volatile *); >>>>> LONG WINAPI InterlockedExchange(LONG volatile *,LONG); >>>>> /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ >>>>> #define InterlockedExchangePointer(t,v) \ >>>>> (PVOID)InterlockedExchange((LONG volatile *)(t),(LONG)(v)) >>>>> LONG WINAPI InterlockedExchangeAdd(LONG volatile *,LONG); >>>>> #if (_WIN32_WINNT >= 0x0501) >>>>> PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER); >>>>> #endif >>>>> LONG WINAPI InterlockedIncrement(LONG volatile *); >>>>> #if (_WIN32_WINNT >= 0x0501) >>>>> PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER); >>>>> PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY); >>>>> #endif >>>>> #endif /* __INTERLOCKED_DECLARED */ >>>>> #endif /* __USE_NTOSKRNL__ */ >>>>> >>>>> Regards, >>>>> >>>>> /Pete >>>>> >>>>> [1] >>>>> http://cygwin.com/cgi-bin/cvsweb.cgi/src/winsup/w32api/include/winbase.h?rev=1.98&content-type=text/x-cvsweb-markup&cvsroot=src >>>> >>>> Ozkan, >>>> >>>> do you remember the issue we had about _Interlocked and the >>>> Interlocked... API? As more as I think about it as more it seems to me >>>> that the leading underscore variant has cdecl, and the none-underscore >>>> variant has stdcall convention. >>> >>> Can't remember. Let me try and dig old stuff and see if I can find anything >>> >>>> Fridrich: Could you try to enlight us here? >>>> >>>> Kai >>>> >> >> Yeah, this could make sense that Interlocked... is for x86 stdcall, >> and _Interlocked... is cdecl. As you can see in winbase.h that for >> ia64 and x64 the Interlocked... API is treated like the >> _Interlocked... API (as here no calling convention differences are >> used). But for x86 this doesn't happen. >> >> So I am pretty sure that this is the jumping point we misinterpreted here. >> >> Kai >> >> -- >> | (\_/) This is Bunny. Copy and paste >> | (='.'=) Bunny into your signature to help >> | (")_(") him gain world domination >> > > These are the ones that are exported from kernel32.dll > acc. to trunk's kernel32.def: > > interlockedcompareexchang...@20 > interlockedcompareexcha...@12 > interlockeddecrem...@4 > interlockedexcha...@8 > interlockedexchange...@8 > interlockedflushsl...@4 > interlockedincrem...@4 > > These are the ones that are exported from ntoskrnl.exe > acc.to trunk's ntoskrnl.def: > @interlockedcompareexcha...@12 > @interlockeddecrem...@4 > @interlockedexcha...@8 > @interlockedexchange...@8 > @interlockedincrem...@4 > > So there are no _Interlocked* here, which means that > all those _Interlocked* are ms intrinsics *and* they must > always be inlines, ie. not just _CRT_INLINE but FORCEINLINE > for us. When they are inlines, I guess __cdecl or __stdcall > doesn't matter. that must be where we started to err. > This is uglier that it looks... >
See intrin.h and the definitions of those intrinsic. They have here cdecl convention. So _Interlocked... is cdecl and Interlocked... is for x86 stdcall. This change affects winnt.h and winbase.h. And of course we need to do here special casing for stdcall variant for 32-bit (the aliasing) in our crt libmingwex. Kai -- | (\_/) This is Bunny. Copy and paste | (='.'=) Bunny into your signature to help | (")_(") him gain world domination ------------------------------------------------------------------------------ This SF.net email is sponsored by Make an app they can't live without Enter the BlackBerry Developer Challenge http://p.sf.net/sfu/RIM-dev2dev _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public