Yes, that sounds right. Jim
> On Aug 29, 2014, at 12:30 PM, Zachary Turner <[email protected]> wrote: > > Thinking about it some more, removing SuspendThread and ResumeThread seems > reasonable. Functionality beyond what is required for dealing with > own-process threads can be in a different abstraction which is backed by a > HostThread through containment. > > > On Fri, Aug 29, 2014 at 12:12 PM, <[email protected]> wrote: > Yes, I think there's enough reason to expect we'll use HostThread in ways the > C++11 standards committee didn't think of that keeping a wrapper is useful. > Also, Hosts mostly have to have fairly good thread libraries now-a-days, but > they don't necessarily have to have good C++11 std::thread implementations, > so insulating ourselves here is probably not a bad idea. OTOH, Greg has been > making rumblings about backing the Host thread functionality by std::thread's > ever since we decided to require C++11. > > Among other teenie reasons for keeping the wrapper, std::thread's don't have > "set name". That may seem trivial, but we get crash logs from Xcode where > Xcode is running many lldb Debugger sessions simultaneously (the Swift > Playground feature is one among many causes of this.) These CrashLogs were > really hard to read till we got both Xcode and lldb to name all the threads > that belong to a given process with the PID of the process. I would not like > to lose this feature... > > Jim > > > > On Aug 29, 2014, at 11:59 AM, Zachary Turner <[email protected]> wrote: > > > > Actually, disregard my last message. I agree with you, the things you do > > when you manipulate threads in a debuggee are different. So for that you > > have some other abstraction, but that other abstraction can still be > > *backed by* a HostThread > > > > > > On Fri, Aug 29, 2014 at 11:54 AM, Zachary Turner <[email protected]> wrote: > > If that's the case, is there any reason to not just use std::thread > > directly? > > > > > > On Fri, Aug 29, 2014 at 11:51 AM, <[email protected]> wrote: > > So thread_t says: > > > > // lldb::thread_t The native thread type for spawned threads on > > the system > > > > I am pretty sure that was only ever meant to be used for threads inside of > > the running lldb. It seems to me that it will make things very confusing > > to try to use it for random threads in some other process. The way you > > manipulate your own threads, and the things you can do with them, are very > > different from the way you manipulate threads in the debugee, and what is > > desirable. Unless there's some compelling reason that I don't see right > > now, I'd like to keep these two concepts separate. > > > > Jim > > > > > > > On Aug 29, 2014, at 11:35 AM, Zachary Turner <[email protected]> wrote: > > > > > > I mentioned this a few times earlier, but admittedly the thread has grown > > > pretty long. > > > > > > HostThread is a replacement for thread_t. Anywhere you use a thread_t, > > > you can use a HostThread. This applies obviously to threads inside the > > > debugger itself, but also to any other threads on the machine. In the > > > case of debugging process P locally, for example, it might be used when > > > viewing or manipulating the threads of P. Even in remote debuggign > > > scenarios, the debugserver might use a HostThread to manipulate threads > > > in the inferior. There's already a method in Host called > > > FindProcessThreads, for example. Instead of returning a list of thread > > > ids, it could return a list of HostThreads. The size of the class should > > > not be much (if any) larger than an lldb::thread_t, it just has extra > > > methods for convenience. > > > > > > > > > On Fri, Aug 29, 2014 at 11:28 AM, <[email protected]> wrote: > > > One thing I am unclear about, I had thought that HostThread in particular > > > would be used for threads IN lldb, but not for handling threads in a > > > program lldb is debugging when on that Host. So for instance, Suspend & > > > Resume don't seem necessary or desirable when dealing with threads lldb > > > is using for implementing lldb, and Launch is possible but quite tricky > > > and not required for remote threads on the same Host. > > > > > > What is the actual story here? > > > > > > Jim > > > > > > > > > > On Aug 29, 2014, at 11:19 AM, Zachary Turner <[email protected]> wrote: > > > > > > > > What do you think about this? I implement the abstract base class. > > > > I'll give it the following methods: > > > > > > > > Pure virtual: > > > > * Launch > > > > * Join > > > > * Cancel > > > > * GetState (enumerated value : invalid, running, exited, suspended, > > > > cancelled) > > > > * Suspend > > > > * Resume > > > > * GetThreadResult > > > > > > > > Virtual with default implementations: > > > > * GetName > > > > * SetName > > > > > > > > Cancel will return an lldb::Error if cancellation is not supported (for > > > > example because we're on windows and we don't own the thread routine). > > > > If you think of any other methods that should go here, let me know. > > > > > > > > Initial patch will go in like this, with no code yet updated to use the > > > > new HostThread. In a subsequent patch, I will change thread_t's to > > > > HostThreads, updating code as necessary. We can evaluate the decision > > > > about the typedef vs. the base class at this point, when we see what > > > > (if any) impact this will have on whether specific methods will be > > > > accessed from generic code. At this point, if there's still > > > > disagreement, I can even make two separate patches - one that does it > > > > each way, so that we can compare actual code that uses both methods. > > > > > > > > > > > > On Fri, Aug 29, 2014 at 11:01 AM, <[email protected]> wrote: > > > > > > > > > On Aug 29, 2014, at 10:09 AM, Zachary Turner <[email protected]> > > > > > wrote: > > > > > > > > > > On Fri, Aug 29, 2014 at 9:54 AM, <[email protected]> wrote: > > > > > > > > > > > SystemLog > > > > > > ThreadDetach > > > > > > ThreadCancel > > > > > > > > > > There must be some way on Windows to tell a thread to exit at the > > > > > next cancellation point? Can you really not cancel a worker thread's > > > > > operation? > > > > > > > > > > Not an arbitrary thread, no. You can forcefully terminate it (with > > > > > caveats, and it may not work and/or have unexpected behavior, so it > > > > > is strongly discouraged), but generally if you want to gracefully > > > > > cancel a thread, the thread has to have specific code in its run loop > > > > > to make that possible. So it might work for threads that we create > > > > > inside the lldb process, since we control the thread routine, but it > > > > > wouldn't be meaningful for threads in other process. The reason for > > > > > this discrepancy is that there is no concept of signals on Windows, > > > > > which I assume is how thread cancellation is implemented behind the > > > > > scenes on posix platforms. > > > > > > > > I don't think thread cancellation requires signals for same process > > > > thread cancellation for pthreads, but it does use kernel support. The > > > > system defines "cancellation points" - e.g. select, read, etc. where a > > > > thread is likely to sit waiting, and pthread_cancel just marks the > > > > target thread so that if it is in a cancellation routine (they're > > > > pretty much all kernel traps) it gets killed off, otherwise the request > > > > is postponed till the thread enters a cancellation point and then it > > > > gets killed. I don't think you would need signals for this. > > > > > > > > But it is something we need to do for all our ports, since we rely on > > > > this for shutting down the Process worker threads cleanly. Since we > > > > only really care about canceling threads we create, I think it would be > > > > okay for ThreadCancel to be a no-op for other threads. > > > > > > > > > > > > > > > > > > > > GetAuxvData > > > > > > > > > > > > Before my original HostInfo refactor, it also had these methods: > > > > > > > > > > > > GetUserID > > > > > > GetGroupID > > > > > > GetEffectiveUserID > > > > > > GetEffectiveGroupID > > > > > > > > > > > > Those methods were just as accessible to anyone writing generic > > > > > > code. They are *less* accessible now, because they are on > > > > > > HostInfoPosix. And this happened without needing to introduce any > > > > > > platform specific pre-processor defines into generic LLDB. There > > > > > > was maybe one exception, which Jason Molenda pointed out earlier, > > > > > > which was the GetOSBuildString. And that only happened because > > > > > > GetOSBuildString is not a generic concept! The design worked > > > > > > exactly as intended, exposing a place where code that was intended > > > > > > to be generic actually wasn't as generic as it thought it was. > > > > > > Everywhere else, the GetUserID, GetGroupID, etc methods were only > > > > > > being called from specific code (which is how it should work), but > > > > > > after my change this is now enforced by the compiler. > > > > > > > > > > > > > > > > > > > > > > But again, if I'm writing code it seems like a real pain to have to > > > > > answer the question "is this an interface I can use in generic code" > > > > > be: > > > > > > > > > > For now you can if it exists in all the HostThreadXXX.h files, but of > > > > > course if somebody introduces another platform and decides that they > > > > > don't want to implement this function then you can't use it anymore > > > > > and have to put > > > > > > > > > > #if defined > > > > > > > > > > guards around the usage. Instead, we should look at the host > > > > > interfaces and say there are three classes of things: > > > > > > > > > > 1) Things you must implement in order to port lldb to a host > > > > > These should be pure virtual methods in HostFeature.h > > > > > 2) Things you can optionally implement, but there's a reasonable > > > > > "couldn't do that" fallback > > > > > These should be virtual methods in HostFeature.h > > > > > 3) Things that are purely host specific. > > > > > These should be methods in HostFeatureMyHost.h, and can only be > > > > > used in HostOtherFeatureMyHost.h, but never in generic code. > > > > > > > > > > This would make the job of folks working in generic code clear, and > > > > > also make it obvious to the next porter (OpenVMS, anyone?) what they > > > > > have to do. > > > > > > > > > > I'm ok with doing all of this. I'm all for having the compiler catch > > > > > things for you, and if one of the things it can catch for you is "you > > > > > need to implement this method" then that's great. That said, I'm > > > > > still rather fond of the idea of typedefing HostFeature to > > > > > HostFeatureMyHost and then having everyone use HostFeature. No > > > > > matter if you do it or don't, it's still equally easy to write > > > > > specific code from generic code. You could just do this: > > > > > > > > > > #if defined(__APPLE__) > > > > > ((HostFeatureMacOSX&)feature).AppleSpecificMethod(); > > > > > #endif > > > > > > > > > > as opposed to this > > > > > > > > > > #if defined(__APPLE__) > > > > > feature.AppleSpecificMethod(); > > > > > #endif > > > > > > > > > > > > > My feeling about this is since you'd actually have to do: > > > > > > > > #if defined(__APPLE__) > > > > #include "lldb/Host/windows/HostFeatureMacOSX.h" > > > > (((HostFeatureMacOSX&)feature).AppleSpecificMethod(); > > > > #endif > > > > > > > > I hope at that point you'd know you've gone off the reservation. > > > > > > > > Jim > > > > > > > > > > > > > > > > > In both cases though, the person has felt strongly enough about it to > > > > > put it in a pre-processor guard, so the decision has already been > > > > > made. And the second method has the benefit that when you're writing > > > > > specific code (which I anticipate to write alot of for Windows), you > > > > > just always have the type you need. > > > > > > > > > > > > > > > > > > > > > > _______________________________________________ lldb-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
