Nikolay Sivov <nsi...@codeweavers.com> writes: > +DWORD NTAPI RtlRunOnceExecuteOnce(PRTL_RUN_ONCE initonce, > PRTL_RUN_ONCE_INIT_FN callback, void *parameter, void **ctxt) > +{ > +#ifdef __linux__ > + if (!use_futexes()) return FALSE; > + > + for (;;) > + { > + DWORD_PTR val = (DWORD_PTR)interlocked_cmpxchg_ptr( &initonce->Ptr, > (void*)1, NULL ); > + switch (val & 0x3) > + { > + case 0: > + { > + DWORD ret = callback(initonce, parameter, ctxt); > + if (ret) > + { > + DWORD_PTR context = ctxt ? (DWORD_PTR)*ctxt : 0; > + context = (context & ~0x3) | 0x2; > + interlocked_cmpxchg_ptr( &initonce->Ptr, (void*)context, > (void*)1 ); > + } > + else > + interlocked_cmpxchg_ptr( &initonce->Ptr, NULL, (void*)1 > ); > + futex_wake( (int *)&initonce->Ptr, 1 ); > + return ret; > + } > + case 1: > + /* blocked by another thread */ > + futex_wait( (int *)&initonce->Ptr, 1, NULL ); > + break; > + case 2: > + /* already initialized */ > + return TRUE; > + } > + }
It's supposed to return an NTSTATUS, not a boolean. Also you have to always return the context, and you should try to do a generic implementation first. -- Alexandre Julliard julli...@winehq.org