/* * copyright 2010, the android open source project * * licensed under the apache license, version 2.0 (the "license"); * you may not use this file except in compliance with the license. * you may obtain a copy of the license at * * http://www.apache.org/licenses/license-2.0 * * unless required by applicable law or agreed to in writing, software * distributed under the license is distributed on an "as is" basis, * without warranties or conditions of any kind, either express or implied. * see the license for the specific language governing permissions and * limitations under the license. */ #ifndef BCC_CONTEXTMANAGER_H #define BCC_CONTEXTMANAGER_H #include #include #include #include namespace bcc { class ContextManager { public: // Starting address of context slot address space static char * const ContextFixedAddr; // Number of the context slots static size_t const ContextSlotCount = BCC_CONTEXT_SLOT_COUNT_; // Context size static size_t const ContextCodeSize = BCC_CONTEXT_CODE_SIZE_; static size_t const ContextDataSize = BCC_CONTEXT_DATA_SIZE_; static size_t const ContextSize = ContextCodeSize + ContextDataSize; private: // Context manager singleton static ContextManager TheContextManager; private: // Mutex lock for context slot occupation table mutable llvm::sys::Mutex mContextSlotOccupiedLock; // Context slot occupation table bool mContextSlotOccupied[ContextSlotCount]; ContextManager(); public: static ContextManager &get() { return TheContextManager; } char *allocateContext(); char *allocateContext(char *addr, int imageFd, off_t imageOffset); void deallocateContext(char *addr); bool isManagingContext(char *addr) const; private: static ssize_t getSlotIndexFromAddress(char *addr); }; } // namespace bcc #endif // BCC_CONTEXTMANAGER_H