Comm job callbacks need job's cbdata pointer, not a job pointer. Otherwise, in complex inheritance hierarchies, some [inner] classes will hit cbdata cookie assertions when scheduling Comm calls with callbacks. === modified file 'src/CommCalls.h' --- src/CommCalls.h 2013-10-25 00:13:46 +0000 +++ src/CommCalls.h 2014-01-14 02:12:00 +0000 @@ -159,41 +159,41 @@ public: // Get comm params of an async comm call template Params &GetCommParams(AsyncCall::Pointer &call) { typedef CommDialerParamsT DialerParams; DialerParams *dp = dynamic_cast(call->getDialer()); assert(dp); return dp->params; } // All job dialers with comm parameters are merged into one since they // all have exactly one callback argument and differ in Params type only template class CommCbMemFunT: public JobDialer, public CommDialerParamsT { public: typedef Params_ Params; typedef void (C::*Method)(const Params &io); CommCbMemFunT(const CbcPointer &aJob, Method aMeth): JobDialer(aJob), - CommDialerParamsT(aJob.get()), + CommDialerParamsT(aJob->toCbdata()), method(aMeth) {} virtual bool canDial(AsyncCall &c) { return JobDialer::canDial(c) && this->params.syncWithComm(); } virtual void print(std::ostream &os) const { os << '('; this->params.print(os); os << ')'; } public: Method method; protected: virtual void doDial() { ((&(*this->job))->*method)(this->params); } };