[ros-dev] [ros-diffs] [akhaldi] 66500: [KERNEL32_VISTA] Add and export InitOnceExecuteOnce(). CORE-9246
Timo Kreuzer
timo.kreuzer at web.de
Sat Feb 28 22:57:40 UTC 2015
I think it is really time for a proper version handling.
The issue we already run into will increase with time, so we need a
proper machanism to handle this.
I'm going to post some ideas about how we can address this in a generic
and most compatible way as psoossible soon.
Timo
Am 28.02.2015 um 23:07 schrieb Alex Ionescu:
> Sure but here's the problem, there's a reason why RunOnce and SRW were
> only implemented in Vista: they require efficient keyed event
> implementation. Server 2003 keyed event implementation (which we have)
> was only done to handle out of memory scenario during critical section
> acquisition. So if there's actual dependencies on the locking
> semantics, we'd have to implement this in the kernel. Which FYI, I'm
> not against.
>
> Best regards,
> Alex Ionescu
>
> On Sat, Feb 28, 2015 at 10:18 AM, Thomas Faber
> <thomas.faber at reactos.org <mailto:thomas.faber at reactos.org>> wrote:
>
> Wine modules sometimes depend on Vista+ functions, so instead of
> adding
> our own hacks all over their code to make it work on ROS/2003, we put
> stuff in this kernel32_vista library.
>
> It's self-contained so if you want to use these modules on Win 2003,
> you can simply copy kernel32_vista.dll over to that machine and have
> our dlls work without dependency issues.
> (We could even make this a static library if we wanted to)
>
> In this particular case, we already have three modules with broken
> hacks in place to avoid using this function. This lets us restore the
> Wine-sync and get rid of the hacks.
>
>
> On 2015-02-28 18:34, Alex Ionescu wrote:
> > Why are we adding Wineisms to core binaries like kernel32? These
> functions
> > should be in NTDLL and not in kernel32, and they are badly
> written anyway.
> >
> > Best regards,
> > Alex Ionescu
> >
> > On Sat, Feb 28, 2015 at 10:46 AM, <akhaldi at svn.reactos.org
> <mailto:akhaldi at svn.reactos.org>> wrote:
> >
> >> Author: akhaldi
> >> Date: Sat Feb 28 15:46:43 2015
> >> New Revision: 66500
> >>
> >> URL: http://svn.reactos.org/svn/reactos?rev=66500&view=rev
> >> Log:
> >> [KERNEL32_VISTA] Add and export InitOnceExecuteOnce(). CORE-9246
> >>
> >> Added:
> >> trunk/reactos/dll/win32/kernel32_vista/InitOnceExecuteOnce.c
> (with
> >> props)
> >> Modified:
> >> trunk/reactos/dll/win32/kernel32_vista/CMakeLists.txt
> >> trunk/reactos/dll/win32/kernel32_vista/kernel32_vista.spec
> >>
> >> Modified: trunk/reactos/dll/win32/kernel32_vista/CMakeLists.txt
> >> URL:
> >>
> http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32_vista/CMakeLists.txt?rev=66500&r1=66499&r2=66500&view=diff
> >>
> >>
> ==============================================================================
> >> --- trunk/reactos/dll/win32/kernel32_vista/CMakeLists.txt
> >> [iso-8859-1] (original)
> >> +++ trunk/reactos/dll/win32/kernel32_vista/CMakeLists.txt
> >> [iso-8859-1] Sat Feb 28 15:46:43 2015
> >> @@ -8,15 +8,11 @@
> >> list(APPEND SOURCE
> >> DllMain.c
> >> GetTickCount64.c
> >> + InitOnceExecuteOnce.c
> >> ${CMAKE_CURRENT_BINARY_DIR}/kernel32_vista.def)
> >>
> >> add_library(kernel32_vista SHARED ${SOURCE})
> >> set_module_type(kernel32_vista win32dll HOTPATCHABLE
> ENTRYPOINT DllMain
> >> 12)
> >> -add_importlibs(kernel32_vista kernel32)
> >> -
> >> -if(MSVC)
> >> - add_importlibs(kernel32_vista ntdll)
> >> -endif()
> >> -
> >> +add_importlibs(kernel32_vista kernel32 ntdll)
> >> add_dependencies(kernel32_vista psdk)
> >> add_cd_file(TARGET kernel32_vista DESTINATION reactos/system32
> FOR all)
> >>
> >> Added: trunk/reactos/dll/win32/kernel32_vista/InitOnceExecuteOnce.c
> >> URL:
> >>
> http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32_vista/InitOnceExecuteOnce.c?rev=66500
> >>
> >>
> ==============================================================================
> >> --- trunk/reactos/dll/win32/kernel32_vista/InitOnceExecuteOnce.c
> >> (added)
> >> +++ trunk/reactos/dll/win32/kernel32_vista/InitOnceExecuteOnce.c
> >> [iso-8859-1] Sat Feb 28 15:46:43 2015
> >> @@ -0,0 +1,118 @@
> >> +
> >> +#include "k32_vista.h"
> >> +
> >> +#include <ndk/exfuncs.h>
> >> +#include <wine/config.h>
> >> +#include <wine/port.h>
> >> +
> >> +/* Taken from Wine ntdll/sync.c */
> >> +
> >> +HANDLE keyed_event = NULL;
> >> +
> >> +static DWORD WINAPI RtlRunOnceBeginInitialize( RTL_RUN_ONCE
> *once, ULONG
> >> flags, void **context )
> >> +{
> >> + if (flags & RTL_RUN_ONCE_CHECK_ONLY)
> >> + {
> >> + ULONG_PTR val = (ULONG_PTR)once->Ptr;
> >> +
> >> + if (flags & RTL_RUN_ONCE_ASYNC) return
> STATUS_INVALID_PARAMETER;
> >> + if ((val & 3) != 2) return STATUS_UNSUCCESSFUL;
> >> + if (context) *context = (void *)(val & ~3);
> >> + return STATUS_SUCCESS;
> >> + }
> >> +
> >> + for (;;)
> >> + {
> >> + ULONG_PTR next, val = (ULONG_PTR)once->Ptr;
> >> +
> >> + switch (val & 3)
> >> + {
> >> + case 0: /* first time */
> >> + if (!interlocked_cmpxchg_ptr( &once->Ptr,
> >> + (flags & RTL_RUN_ONCE_ASYNC) ?
> >> (void *)3 : (void *)1, 0 ))
> >> + return STATUS_PENDING;
> >> + break;
> >> +
> >> + case 1: /* in progress, wait */
> >> + if (flags & RTL_RUN_ONCE_ASYNC) return
> >> STATUS_INVALID_PARAMETER;
> >> + next = val & ~3;
> >> + if (interlocked_cmpxchg_ptr( &once->Ptr, (void
> >> *)((ULONG_PTR)&next | 1),
> >> + (void *)val ) ==
> (void *)val)
> >> + NtWaitForKeyedEvent( keyed_event, &next,
> FALSE, NULL );
> >> + break;
> >> +
> >> + case 2: /* done */
> >> + if (context) *context = (void *)(val & ~3);
> >> + return STATUS_SUCCESS;
> >> +
> >> + case 3: /* in progress, async */
> >> + if (!(flags & RTL_RUN_ONCE_ASYNC)) return
> >> STATUS_INVALID_PARAMETER;
> >> + return STATUS_PENDING;
> >> + }
> >> + }
> >> +}
> >> +
> >> +static DWORD WINAPI RtlpRunOnceComplete( RTL_RUN_ONCE *once,
> ULONG flags,
> >> void *context )
> >> +{
> >> + if ((ULONG_PTR)context & 3) return STATUS_INVALID_PARAMETER;
> >> +
> >> + if (flags & RTL_RUN_ONCE_INIT_FAILED)
> >> + {
> >> + if (context) return STATUS_INVALID_PARAMETER;
> >> + if (flags & RTL_RUN_ONCE_ASYNC) return
> STATUS_INVALID_PARAMETER;
> >> + }
> >> + else context = (void *)((ULONG_PTR)context | 2);
> >> +
> >> + for (;;)
> >> + {
> >> + ULONG_PTR val = (ULONG_PTR)once->Ptr;
> >> +
> >> + switch (val & 3)
> >> + {
> >> + case 1: /* in progress */
> >> + if (interlocked_cmpxchg_ptr( &once->Ptr, context,
> (void *)val
> >> ) != (void *)val) break;
> >> + val &= ~3;
> >> + while (val)
> >> + {
> >> + ULONG_PTR next = *(ULONG_PTR *)val;
> >> + NtReleaseKeyedEvent( keyed_event, (void *)val,
> FALSE,
> >> NULL );
> >> + val = next;
> >> + }
> >> + return STATUS_SUCCESS;
> >> +
> >> + case 3: /* in progress, async */
> >> + if (!(flags & RTL_RUN_ONCE_ASYNC)) return
> >> STATUS_INVALID_PARAMETER;
> >> + if (interlocked_cmpxchg_ptr( &once->Ptr, context,
> (void *)val
> >> ) != (void *)val) break;
> >> + return STATUS_SUCCESS;
> >> +
> >> + default:
> >> + return STATUS_UNSUCCESSFUL;
> >> + }
> >> + }
> >> +}
> >> +
> >> +static DWORD WINAPI RtlpRunOnceExecuteOnce( RTL_RUN_ONCE *once,
> >> PRTL_RUN_ONCE_INIT_FN func,
> >> + void *param, void **context )
> >> +{
> >> + DWORD ret = RtlRunOnceBeginInitialize( once, 0, context );
> >> +
> >> + if (ret != STATUS_PENDING) return ret;
> >> +
> >> + if (!func( once, param, context ))
> >> + {
> >> + RtlpRunOnceComplete( once, RTL_RUN_ONCE_INIT_FAILED,
> NULL );
> >> + return STATUS_UNSUCCESSFUL;
> >> + }
> >> +
> >> + return RtlpRunOnceComplete( once, 0, context ? *context :
> NULL );
> >> +}
> >> +
> >> +/* Taken from Wine kernel32/sync.c */
> >> +
> >> +/*
> >> + * @implemented
> >> + */
> >> +BOOL NTAPI InitOnceExecuteOnce( INIT_ONCE *once, PINIT_ONCE_FN
> func, void
> >> *param, void **context )
> >> +{
> >> + return !RtlpRunOnceExecuteOnce( once,
> (PRTL_RUN_ONCE_INIT_FN)func,
> >> param, context );
> >> +}
> >>
> >> Propchange:
> trunk/reactos/dll/win32/kernel32_vista/InitOnceExecuteOnce.c
> >>
> >>
> ------------------------------------------------------------------------------
> >> svn:eol-style = native
> >>
> >> Modified:
> trunk/reactos/dll/win32/kernel32_vista/kernel32_vista.spec
> >> URL:
> >>
> http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32_vista/kernel32_vista.spec?rev=66500&r1=66499&r2=66500&view=diff
> >>
> >>
> ==============================================================================
> >> --- trunk/reactos/dll/win32/kernel32_vista/kernel32_vista.spec
> >> [iso-8859-1] (original)
> >> +++ trunk/reactos/dll/win32/kernel32_vista/kernel32_vista.spec
> >> [iso-8859-1] Sat Feb 28 15:46:43 2015
> >> @@ -1,2 +1,3 @@
> >>
> >> @ stdcall -ret64 GetTickCount64()
> >> +@ stdcall InitOnceExecuteOnce(ptr ptr ptr ptr)
> >>
> >>
> >>
>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org <mailto:Ros-dev at reactos.org>
> http://www.reactos.org/mailman/listinfo/ros-dev
>
>
>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20150228/81d96220/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3683 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20150228/81d96220/attachment-0001.bin>
More information about the Ros-dev
mailing list