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;
};