lemo added inline comments.

================
Comment at: include/lldb/Core/Module.h:779
+  //------------------------------------------------------------------
+  void SetUUID(const lldb_private::UUID &uuid);
+
----------------
labath wrote:
> lemo wrote:
> > labath wrote:
> > > amccarth wrote:
> > > > Was there no SetUUID before because the UUID was considered immutable?  
> > > > I wonder if that's worth keeping.  Is the UUID always known at 
> > > > construction time?
> > > The UUID is not always know at construction time -- sometimes it can be, 
> > > if you set it on the FileSpec you use to create the module, but you don't 
> > > have to do that.
> > > 
> > > However, it is true that the UUID was constant during the lifetime of the 
> > > Module, and this changes that, which is not ideal IMO.
> > > 
> > > It seems that in the only place you call this function, you already know 
> > > the UUID. Would it be possible to do this work in the PlaceholderModule 
> > > constructor (thereby avoiding any changes to the Module API) ?
> > Good point: I agree, it's a good idea to preserve the invariant that the 
> > module UUID does not change once it's set.
> > 
> > I'd not add more complexity & arguments to the placeholder module 
> > constructor though. Moreover, even if it's technically possible to reach 
> > into the protected data members from Module I'd like to avoid doing that 
> > since Module::m_uuid is closely tied to Module::m_mutex and 
> > Module::m_did_parse_uuid (the later now renamed to m_did_set_uuid).
> > 
> > I added a check and assert to prevent Module::SetUUID from overwriting an 
> > already set UUID. (Personally I'd would've liked to have the assert be a 
> > fastfail in all builds but I remember that is somewhat against the LLDB 
> > philosophy)
> > 
> > 
> Guarding the invariant with an assert is better than nothing, but even better 
> is arranging stuff so that the invariant cannot be broken in the first place. 
> And this feels like the sort of thing that should be possible to make safe by 
> design.
> 
> How about adding a special (protected?) Module constructor, which takes a 
> UUID argument and uses it to initialize the m_uuid field. This way, it is 
> impossible by design to change the UUID mid-flight, and you still don't have 
> to reach into the protected Module fields from the other class (we could even 
> make them private if we want to).
Trying to make sure that the invariant can't be invalidated is a high bar 
considering that most Module state is protected. But I agree with the sentiment 
and here's a new iteration:

1. Made Module::SetUUID() protected
    (note that the m_uuid change is conditional, not just protected by an 
lldbassert)
2. PlaceholderModule constructor is where SetUUID is called from

I'm hesitant to add another Module constructor: that class already has 2 public 
+ 1 private constructors (even using a delegating constructor, the addition of 
a new protected constructor questionable). But if you still prefer that option 
better I'll make the change.




https://reviews.llvm.org/D46292



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to