I might be missing the connection to the proposed Continuation constructor behavior with regard to the mutex.
If there is a good reason to change this behavior, we should consider it. Otherwise it's probably best to keep consistency with the existing API. On Mon, Mar 19, 2018 at 10:16 AM, Walt Karas <wka...@oath.com.invalid> wrote: > The current C interface is bad because resources are not freed in > destructors, and the use of raw void pointers is necessary. > > On Mon, Mar 19, 2018 at 10:09 AM, Derek Dagit <der...@oath.com.invalid> > wrote: > > OK, so I am in favor of consistency with the existing C API, if possible > > and only if there is not good reason to break with the way the C API is > > doing it. > > > > On Mon, Mar 19, 2018 at 9:58 AM, Walt Karas <wka...@oath.com.invalid> > wrote: > > > >> yes > >> > >> > >> On Mon, Mar 19, 2018 at 9:54 AM, Derek Dagit <der...@oath.com.invalid> > >> wrote: > >> >> Continuation(TSMutex mutexp = TSMutexCreate()) : > >> > > >> > Not every continuation requires a mutex. To get behavior similar to > the > >> > current C API we would need to pass a `nullptr` to the constructor, > >> right? > >> > > >> > On Fri, Mar 16, 2018 at 6:39 PM, Walt Karas <wka...@oath.com.invalid> > >> wrote: > >> > > >> >> Does this seem like a good wrapper class for continuations in the C++ > >> API? > >> >> > >> >> class Continuation > >> >> { > >> >> public: > >> >> Continuation(TSMutex mutexp = TSMutexCreate()) : > >> >> _cont(TSContCreate(_generalEventFunc, mutexp)) > >> >> { > >> >> TSContDataSet(_cont, static_cast<void *>(this)); > >> >> } > >> >> > >> >> TSCont > >> >> asTSCont() const > >> >> { > >> >> return _cont; > >> >> } > >> >> > >> >> void > >> >> destroy() > >> >> { > >> >> if (_cont) { > >> >> TSContDestroy(_cont); > >> >> _cont = nullptr; > >> >> } > >> >> } > >> >> > >> >> ~Continuation() > >> >> { > >> >> if (_cont) { > >> >> TSContDestroy(_cont); > >> >> } > >> >> } > >> >> > >> >> // No copying. > >> >> Continuation(const Continuation &) = delete; > >> >> Continuation &operator=(const Continuation &) = delete; > >> >> > >> >> // Moving allowed. > >> >> Continuation(Continuation &&that) > >> >> { > >> >> _cont = that._cont; > >> >> that._cont = nullptr; > >> >> } > >> >> Continuation & > >> >> operator=(Continuation &&that) > >> >> { > >> >> if (&that != this) { > >> >> if (_cont) { > >> >> TSContDestroy(_cont); > >> >> } > >> >> _cont = that._cont; > >> >> that._cont = nullptr; > >> >> } > >> >> return *this; > >> >> } > >> >> > >> >> explicit operator bool() const { return _cont != nullptr; } > >> >> > >> >> private: > >> >> // Distinct continuation behavior is achieved by overriding this > >> >> function in a derived continuation type. > >> >> // > >> >> virtual int _run(TSEvent event, void *edata) = 0; > >> >> > >> >> // This is the event function for all continuations in C++ plugins. > >> >> // > >> >> static int _generalEventFunc(TSCont cont, TSEvent event, void > *edata); > >> >> > >> >> TSCont _cont; > >> >> }; > >> >> > >> > > >> > > >> > > >> > -- > >> > Derek > >> > > > > > > > > -- > > Derek > -- Derek