CancellationHandler* setCancellationHandler (CancellationHandler* handler) { CancellationHandlerWrapper &wrapper = cancellation_handler.getLocalCopy(); CancellationHandler* prev = wrapper.handler; wrapper.handler = handler; return prev; }
std::unique_ptr<CancellationHandler> resetCancellationHandler (CancellationHandler* handler) { CancellationHandlerWrapper &wrapper = cancellation_handler.getLocalCopy(); std::unique_ptr<CancellationHandler> prev (wrapper.handler.release()); wrapper.handler.reset(handler); return prev; }
IndigoInchi &indigoInchiGetInstance () { return indigo_inchi_self.getLocalCopy(); }
CancellationHandler* getCancellationHandler () { CancellationHandlerWrapper &wrapper = cancellation_handler.getLocalCopy(); return wrapper.handler; }
namespace indigo { // // TimeoutCancellationHandler // TimeoutCancellationHandler::TimeoutCancellationHandler (int mseconds) { reset(mseconds); } TimeoutCancellationHandler::~TimeoutCancellationHandler () { } bool TimeoutCancellationHandler::isCancelled () { qword dif_time = nanoClock() - _currentTime; if (_mseconds > 0 && nanoHowManySeconds(dif_time) * 1000 > _mseconds) { ArrayOutput mes_out(_message); mes_out.printf("The operation timed out: %d ms", _mseconds); mes_out.writeChar(0); return true; } return false; } const char* TimeoutCancellationHandler::cancelledRequestMessage () { return _message.ptr(); } void TimeoutCancellationHandler::reset (int mseconds) { _mseconds = mseconds; _currentTime = nanoClock(); } // // Global thread-local cancellation handler // class CancellationHandlerWrapper { public: CancellationHandlerWrapper () : handler(0) {} CancellationHandler* handler; }; static _SessionLocalContainer<CancellationHandlerWrapper> cancellation_handler; CancellationHandler* getCancellationHandler () { CancellationHandlerWrapper &wrapper = cancellation_handler.getLocalCopy(); return wrapper.handler; } CancellationHandler* setCancellationHandler (CancellationHandler* handler) { CancellationHandlerWrapper &wrapper = cancellation_handler.getLocalCopy(); CancellationHandler* prev = wrapper.handler; wrapper.handler = handler; return prev; } AutoCancellationHandler::AutoCancellationHandler(CancellationHandler& hand) { _prev = setCancellationHandler(&hand); } AutoCancellationHandler::~AutoCancellationHandler() { setCancellationHandler(_prev); } }