>  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

Reply via email to