/* * Copyright Onix Solutions Limited [OnixS]. All rights reserved. * * This software owned by Onix Solutions Limited [OnixS] and is protected by copyright law * and international copyright treaties. * * Access to and use of the software is governed by the terms of the applicable OnixS Software * Services Agreement (the Agreement) and Customer end user license agreements granting * a non-assignable, non-transferable and non-exclusive license to use the software * for it's own data processing purposes under the terms defined in the Agreement. * * Except as otherwise granted within the terms of the Agreement, copying or reproduction of any part * of this source code or associated reference material to any other location for further reproduction * or redistribution, and any amendments to this copyright notice, are expressly prohibited. * * Any reproduction or redistribution for sale or hiring of the Software not in accordance with * the terms of the Agreement is a violation of copyright law. */ #pragma once #if defined (_WIN32) // The Windows platform. #if !defined (STRICT) #define STRICT #endif #if !defined (WIN32_LEAN_AND_MEAN) #define WIN32_LEAN_AND_MEAN #endif #include #else // The Linux platform. #include #endif // The Platform Selector. #include #include #include namespace OnixS { namespace Threading { #if defined (_WIN32) /// Type alias for the thread identifier. typedef DWORD ThreadId; #else /// Type alias for thread identifier. typedef pthread_t ThreadId; #endif /// The infinite timeout value. enum { InfiniteTimeout = -1 }; /// The base class for custom items which can be stored in thread-safe containers. class ONIXS_FIXENGINE_API ItemBase { public: /// Initializes the instance. ItemBase() : next_() {} /// Destructs the instance. virtual ~ItemBase() ONIXS_FIXENGINE_DEFAULT; /// Returns the next item. ItemBase * next() const { return next_; } /// Sets the next item. void setNext(ItemBase * nextNode) { next_ = nextNode; } /// Performs a required processing of the item. virtual void process() = 0; private: // The pointer to the next item. ItemBase * volatile next_; }; typedef PtrTraits::UniquePtr ItemBaseUniquePtr; /// The base class for a custom pool allocator to provide /// a strategy to create/destroy items for the thread-safe pool. class ONIXS_FIXENGINE_API PoolAllocatorBase { public: /// Destructs the instance. virtual ~PoolAllocatorBase() ONIXS_FIXENGINE_DEFAULT; /// A strategy to create an item. virtual ItemBase * alloc() = 0; /// A strategy to destroy an item. virtual void free(ItemBase * element) const { delete element; } }; } }