[ros-dev] [ros-diffs] [dchapyshev] 42012: - Samplify SwitchToThread and QueueUserWorkItem - Remove unneeded InternalWorkItemTrampoline function and QUEUE_USER_WORKITEM_CONTEXT structure - Other small changes

Jeremy Drake reactos at jdrake.com
Wed Jul 22 08:23:27 CEST 2009


I don't know if this is the same thing or not, but I just happened to read
this the other day (while looking up QueueUserWorkItem, incidentally) and
this conversation reminded me of it:
http://msdn.microsoft.com/en-us/library/ms686736(VS.85).aspx

Do not declare this callback function with a void return type and cast the
function pointer to LPTHREAD_START_ROUTINE when creating the thread. Code
that does this is common, but it can crash on 64-bit Windows.

It certainly sounds as though somebody at Microsoft actually encountered
such a crash.  I don't think it would be a problem on x64, but I know
next to nothing about Itanium, maybe it's an issue there?


On Tue, 21 Jul 2009, Alex Ionescu wrote:

> That doesn't make any sense.
> All architectures have an ABI that defines which registers are used for
> return values, and so the compiler will NEVER (under ANY circumstances)
> assume that the return register should somehow be "usable", especially for
> an external function pointer!
>
> Furthermore, this is typecasting from a ULONG to a VOID, isn't it? So the
> "real" function will never return anything in the first place, making this a
> non-issue.
>
> I challenge you to provide a test case/example on any architecture where
> this could possibly happen. It can't.
>
> Best regards,
> Alex Ionescu
>
>
> On Tue, Jul 21, 2009 at 1:11 PM, Thomas Bluemel <thomas at reactsoft.com>
> wrote:
>       On an architecture where function return values e.g. modify a
>       register
>       that would otherwise be preserved?  Or that have a different
>       return
>       method depending on whether data needs to be returned?  It's
>       like
>       typecasting a function to one with a different calling method,
>       except
>       that it may work fine for *most* but not all architectures.
>        It's still
>       bad code...
>
>       Thomas
> Alex Ionescu wrote:
> > I have no idea why typecasting would make it "crash" on another
> > architecture...
> >
> > On 21-Jul-09, at 4:02 AM, Ged wrote:
> >
> >> Dmitry do you have a reply for this?
> >> I worry that you're simply copying Windows internals without
> >> thinking about
> >> it.
> >>
> >> I agree with Thomas on this, if we can do something better then we
> >> should.
> >> There's no reason to do everything in exactly the same manner just
> >> to for
> >> the sake of copying. In fact, I would actually advise we do things
> >> slightly
> >> differently whenever possible.
> >>
> >> Ged.
> >>
> >>
> >> -----Original Message-----
> >> From: ros-dev-bounces at reactos.org [mailto:ros-dev-
> >> bounces at reactos.org] On
> >> Behalf Of Thomas Bluemel
> >> Sent: 17 July 2009 22:53
> >> To: ReactOS Development List
> >> Subject: Re: [ros-dev] [ros-diffs] [dchapyshev] 42012: - Samplify
> >> SwitchToThread and QueueUserWorkItem - Remove unneeded
> >> InternalWorkItemTrampoline function and QUEUE_USER_WORKITEM_CONTEXT
> >> structure - Other small changes
> >>
> >> Just because Wine and Windows do it that way doesn't make it any
> more
> >> correct or portable.
> >>
> >> RtlQueueWorkItem expects a function of this type:
> >> typedef VOID (NTAPI *WORKERCALLBACKFUNC)(IN PVOID Context);
> >>
> >> The supplied function is of this type:
> >> typedef ULONG (NTAPI *PTHREAD_START_ROUTINE)(PVOID Parameter);
> >>
> >> This doesn't crash on x86 and "works" because the return value is
> >> simply
> >> ignored, but it's definitely not portable and MAY crash on another
> >> architecture where it does make a difference.  I don't know if it
> >> would
> >> matter on ARM/PPC/... but the old code at least implemented it
> >> correctly/portable.  It's not really an issue but IMO a bad hack.
> >> Typecasting a function pointer to a function with a different
> >> signature
> >> is hardly ever good practice.
> >>
> >> - Thomas
> >>
> >> Dmitry Chapyshev wrote:
> >>> On Fri, 17 Jul 2009 23:03:18 +0400, Thomas Bluemel
> <thomas at reactsoft.com
> >>> wrote:
> >>>
> >>>> This explains why we are using a trampoline function and not just
> >>>> typecast there...  Is there a reason you changed this?
> >>>>
> >>>> - Thomas
> >>>>
> >>>> dchapyshev at svn.reactos.org wrote:
> >>>>> -    /* NOTE: Don't use Function directly since the callback
> >>>>> signature
> >>>>> -             differs. This might cause problems on certain
> >>>>> platforms... */
> >>>>> -    Status = RtlQueueWorkItem(InternalWorkItemTrampoline,
> >>>>> -                              WorkItemContext,
> >>>> _______________________________________________
> >>>> Ros-dev mailing list
> >>>> Ros-dev at reactos.org
> >>>> http://www.reactos.org/mailman/listinfo/ros-dev
> >>>
> >>>
> >>> Wine and Windows do so. Why we should do in another way? Other
> >>> reasons are
> >>> necessary?
> >>>
> >> _______________________________________________
> >> Ros-dev mailing list
> >> 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
> >
> > Best regards,
> > Alex Ionescu
> >
> > _______________________________________________
> > Ros-dev mailing list
> > 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
>
>
>
>

-- 
Unfair animal names:

-- tsetse fly			-- bullhead
-- booby			-- duck-billed platypus
-- sapsucker			-- Clarence
		-- Gary Larson


More information about the Ros-dev mailing list