FWIW, I'm VERY much in agreement that this needs to be done before 1.0.

I'd prefer actually deleting the old ones if at all possible (though I
know how much headache that would be...), but at least make all our
examples do it.

There is a little additional work that would be done in the C++ layer to
deal with this, as a lot of the C++ threading decisions were to get
around the global-variable-ness of the C stack.

Finally, I'd be completely up for working on this, it seems like a fun
project, and I have a pretty good knowledge of most of the stack.

On Thu, 2015-02-19 at 16:37 +0000, Lankswert, Patrick wrote:
> Thiago,
> 
> > -----Original Message-----
> > From: iotivity-dev-bounces at lists.iotivity.org [mailto:iotivity-dev-
> > bounces at lists.iotivity.org] On Behalf Of Thiago Macieira
> > Sent: Thursday, February 19, 2015 11:22 AM
> > To: iotivity-dev at lists.iotivity.org
> > Subject: Re: [dev] Ripping out the threads
> > 
> > On Thursday 19 February 2015 07:13:45 Lankswert, Patrick wrote:
> > > > option. A simple plan that comes to mind is as follows:
> > > >
> > > > 1) create an ITVTContext struct
> > > > 2) move all global variables to the context
> > > > 3) begin duplicating the current API with calls that take the
> > > > context as a
> > > >
> > > >     parameter, while making the current API use a global, shared
> > >
> > > ITVTContext
> > >
> > > > 4) deprecate and later remove the old non-context API.
> > > >
> > > > Note on 3: this also gives us the opportunity to apply our naming
> > > > change without breaking existing codebase.
> > > >
> > > > Note on 4: we can opt to keep the context-less API as a convenience.
> > > >
> > > > Of course, no plan survives contact with the enemy, so I'm pretty
> > > > sure it won't be as simple as I suggested.
> > >
> > > Thiago,
> > 
> > > Can I assume that you are planning to do your design based on the
> > > connectivity abstraction branch?
> > 
> > After it lands, with the changes from everyone implemented. Doing
> > otherwise would mean a lot of re-work due when it finally does land.
> 
> I agree.
> 
> > > Regarding the context; are you thinking of a concrete context struct
> > > or handle to a context with a factory pattern aka "ITVTContext*
> > > createContext();"?
> > 
> > Yes, just like SSL_CTX from OpenSSL or DBusConnection from libdbus-1. It
> > should be an opaque pointer that is created and destroyed by the library
> > only.
> > 
> > We can discuss whether we should adopt refcounting or whether the user
> > needs to know when to drop the reference.
> 
> I agree.
> 
> > > Regarding keeping the context-API as convenience; are you suggesting
> > > dual stacks or a context-less API that is a fa?ade of the context API?
> > 
> > The context-less API a fa?ade of the context one, by simply using a
> shared,
> > global context that is kept inside the library.
> 
> I was hoping that you would say that.
> 
> > > What I like about the context:
> > > * It captures the stack space cost concisely versus a bunch of
> > > scattered globals
> > 
> > Heap space, since the struct will be opaque and will be allocated by
> malloc()
> > by the library.
> 
> It does not have to use malloc(). For example, two factories:
> * general: uses malloc() as you would expect
> * embedded: returns unused context from fixed pool where the pool size could
> be one and returns NULL when exceeded.
> 
> > > * May allow multiple instances of the stack to operate in the same
> > > space
> > > * It should improve re-entrancy
> > > * Even in C, this is an OO approach
> > 
> > Right, text-book OO-in-C approach.
> > 
> 
> Preferred.
> 
> > > What I am concerned about the context [to be reviewed after you
> > > initial analysis]
> > > * Cost versus benefit of the effort. Is something more important to do?
> > 
> > You or others may disagree with me, but I feel this is quite important to
> get
> > right before the 1.0 release, if we want people to use the new API and not
> > the old, thread-unsafe one.
> > 
> 
> Could not say yet... I do not know the cost.
> 
> > I also feel this is important enough to do, even for a substantially
> higher cost.
> > 
> > > * Is it solving a real problem?
> > 
> > I believe so, I wouldn't be proposing otherwise.
> > 
> > And as a maintainer in another project that loves to wrap libraries and
> > provide a nicer C++ front-end API, I can tell you we absolutely hate
> shared
> > global states. OpenGL is a contender in that list, though at the very
> least you
> > can set and unset the global context.
> > 
> > My current pet-peeve are Unix signals and how you're forced to use them
> > when launching processes with fork(). It's very hard for libraries to get
> them
> > right. A good example of this is what happens if you use gspawn (from
> glib)
> > after QProcess: glib's implementation removes Qt's SIGCHLD handler, so
> > QProcess stops working from that point on.
> > 
> > > * How will the design change impact RTOS or embedded environments?
> > 
> > Provided those OS have malloc(), the effect should be minimal: memory
> > consumption should be roughly the same (TBV), with a slight increase due
> to
> > malloc() overhead. Runtime performance may suffer a slight drop due to
> > register pressure on platforms with few general-purpose registers (namely,
> > i386).
> 
> There are many environments where malloc() is discouraged or verboten since
> heaps can be non-deterministic when small (<2kb) as a result of heap
> fragmentation. As long as I have a mandate to support the small devices, I
> need contributors designs to address these issues. At this point, I do not
> see a problem here.
> 
> Pat
> _______________________________________________
> iotivity-dev mailing list
> iotivity-dev at lists.iotivity.org
> https://lists.iotivity.org/mailman/listinfo/iotivity-dev

Reply via email to