My 2 cents, wouldn't it be possible to combine the best of both world: having a
formal protocol definition, and avoiding cast by using typedef ?
class HostThreadProtocol {
virtual required_method() = 0;
}
class WindowsThread : public HostThreadProtocol {
// Window implementation
}
class OSXThread : public HostThreadProtocol {
// OS X implementation
}
And then;
typedef WindowsThread HostThread;
or
typedef OSXThread HostThread;
Then, is someone want to implements Thread for a new host, it know exactly what
it has to implements, and we don't have to cast to specific class when needed.
The drawback I see is that you can accidentally call a specific method in
generic code, but the buildbot should catch that.
Jean-Daniel
Le 29 août 2014 à 07:14, Zachary Turner <[email protected]> a écrit :
> And FWIW, I have a patch locally which actually replaces all lldb::thread_t's
> with HostThreads. No pre-processor definitions crept in. ThreadJoin,
> Launch, and SetThreadName made up more than 95% of the conversions, and those
> are all part of the common interface.
>
>
> On Thu, Aug 28, 2014 at 10:05 PM, Zachary Turner <[email protected]> wrote:
>
>
>
> On Thu, Aug 28, 2014 at 9:42 PM, Jason Molenda <[email protected]> wrote:
>
> To take one small example, HostInfo::GetOSBuildString is defined for three
> out of the four platforms. And so any generic code that might want to call
> this has to do
>
> if (IsHost())
> #if !defined(__linux__)
> return HostInfo::GetOSBuildString(s);
> #else
> return false;
> #endif
>
> But "os build string" and "os kernel version" are platform specific, by
> definition. I find it really hard to agree that we should just allow any old
> platform specific method to be exposed through a supposedly generic interface
> with different subsets of methods broken on different subsets of platforms.
> Then, you write some code to call a method like like
> HostInfo::GetRedApples(), and you have no idea under what situations it's
> even going to work. If a method isn't supported on your platform, you
> shouldn't be trying to call it. If you are, that's already a good indicator
> that you might have a layering problem.
>
>
> A call into *any* HostInfo method may similarly need to be #ifdef protected.
> And while it looks fine, to have #if !defined linux here, we know that
> eventually someone will add a method that only makes sense on Mac OS X (or so
> they think) and they'll do
>
> #if defined (__APPLE__)
> return HostInfo::GetRedApples();
> #endif
>
> And then Solaris 16 will be released and suddenly it can get red apples too -
> a maintainer of the HostInfoSolaris class adds that method but then has to go
> find all the ifdef blocks and make them defined __APPLE__ || __SOLARIS__.
>
>
> I think we need a consistent error return API for functions in
> HostInfo/HostThread to say "not available on this platform" and generic code
> can use a different approach.
> Not all methods even return Error. And the cost of making every single
> method return Error is even higher, because nobody is ever going to check for
> this return value. And what do you do when you do get the return value?
> Call exit()? If the compiler catches this for you it doesn't have to be a
> runtime decision.
>
> Again, the number of places where this is going to happen are small. As Jim
> said, most generic LLDB code isn't and shouldn't be calling into Host. You
> can search through my HostInfo patch, for example, and find that I converted
> maybe 100 pre-processor definitions into about 2 or 3. I don't think this
> problem of #ifdef'ing will be as bad as you think it will be, and certainly
> it's better than before?
>
> HostInfo has another issue, btw, which is that it is a static class. So
> there's really no other way. There's no instance of it, just as there was no
> instance of Host. I could have gone and added methods for Windows jobs, SEH,
> and plenty of other highly windows specific concepts to Host.h and grew the
> class even more than it already was, and then stubbed out all the methods on
> every other platform, but is that really what you want? More likely to break
> the build, increases code size, increases build time, all for code that is
> never going to run on the platform. And since, by definition, the code
> should never run on the platform, why not find out at compile time if some
> code path calls it?
>
> The idea of "I'll just implement this method for my platform and stub it out
> for everyone else" just shifts the burden from a compile time burden to a
> run-time burden, which is almost always a worse proposition to have to deal
> with. In the end, the "public" interface of any given Host class is likely
> to stabilize and change very infrequently. The platform specific bits, on
> the other hand, are likely to evolve quite regularly. A design where people
> can work on the platform specific bits in isolation from every other platform
> without affecting anyone else is a huge win across the board.
>
> _______________________________________________
> lldb-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits