/* * Copyright 2002-2019 Intel Corporation. * * This software is provided to you as Sample Source Code as defined in the accompanying * End User License Agreement for the Intel(R) Software Development Products ("Agreement") * section 1.L. * * This software and the related documents are provided as is, with no express or implied * warranties, other than those that are expressly stated in the License. */ /*! @file * Runnable and function objects. */ #ifndef RUNNABLE_H #define RUNNABLE_H #include #include #if defined(TARGET_LINUX) || defined(TARGET_BSD) # include /* gcc4.3.x required */ #endif using namespace std; /*! * Abstract interface of a runnable object. */ class RUNNABLE_OBJ { public: virtual void Run() = 0; virtual ~RUNNABLE_OBJ() {} }; /*! * Abstract function object. */ class FUNC_OBJ : public RUNNABLE_OBJ { public: // Execute the function. // @return object that contains result of the function invocation. virtual FUNC_OBJ & Execute() = 0; // Execute the function and return to the caller even if the function threw an // exception. // The function is NOT thread-safe. // @return object that contains result of the function invocation. virtual FUNC_OBJ & ExecuteSafe(); // Implementation of the RUNNABLE_OBJ::Run() function. void Run() {Execute();} // Return boolean status of the last Execute() invocation. // @return TRUE - the function succeeded and returned an expected result // FALSE - the function failed or returned an unexpected result virtual bool Status() const = 0; // Return human-readable string representation of the status of the last // Execute() invocation. virtual string ErrorMessage() const { if (Status()) { return "Success"; } else { return "Failure"; } } // Check the status of the last Execute() invocation. Print error message and // exit abnormally if the function failed. void AssertStatus() { if (!Status()) { cerr << Name() << ": " << ErrorMessage() << endl; exit(1); } } // Return name of the function. virtual string Name() const = 0; // Create a copy of this object. virtual FUNC_OBJ * Clone() const = 0; // Virtual destructor virtual ~FUNC_OBJ() {} protected: // Handle exception. // @param[in] exceptIp address of the instruction that caused the exception // @return object that contains result of the exception handling. virtual FUNC_OBJ & HandleException(void * exceptIp) {return *this;} }; /*! * Class that represents a position-independent function. */ class PI_FUNC : public FUNC_OBJ { public: // Copy the function body into specified buffer. // @return object that represents the function in the new location. virtual PI_FUNC & Copy(void * buffer) = 0; // Base address of the function's code range. virtual void * Start() const = 0; // Size of the function's code range. virtual size_t Size() const = 0; // Max. size of the function's code range static const size_t MAX_SIZE = 8192; }; #endif //RUNNABLE_H /* ===================================================================== */ /* eof */ /* ===================================================================== */