C++程序  |  81行  |  2.97 KB

/*
 * Copyright (C) 2007 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 ANDROID_HIDL_MEMORY_DEALER_H
#define ANDROID_HIDL_MEMORY_DEALER_H

#include <android/hidl/memory/1.0/IMemory.h>
#include <android/hidl/memory/block/1.0/types.h>
#include <stdint.h>
#include <sys/types.h>
namespace android {
namespace hardware {

class SimpleBestFitAllocator;

// MemoryDealer allocates/deallocates blocks from a continuous memory region.
// It operates on size and offset and does not depend on any specific data types.
class MemoryDealer : public RefBase {
   public:
    /// Allocate a block with size. The allocated block is identified with an
    /// offset. For example:
    /// ssize_t K = dealer->allocateOffset(size);
    /// On success, K is positive and points to a subregion K ~ (K+size-1) in the heap.
    /// It's negative if the allocation fails.
    virtual ssize_t allocateOffset(size_t size);
    /// @param offset It points to the block that allocated with allocateOffset previously.
    virtual void deallocate(size_t offset);
    /// @param tag a string tag used to mark the dump message
    virtual void dump(const char* tag) const;

    // allocations are aligned to some value. return that value so clients can account for it.
    static size_t getAllocationAlignment();

    MemoryDealer(size_t size);
    virtual ~MemoryDealer();

   protected:
    SimpleBestFitAllocator* mAllocator;
};

// It extends the generic MemoryDealer and uses
//  - sp<IMemory> to represent the main memory region.
//  - MemoryBlock to represent the the block to allocate/deallocate
class HidlMemoryDealer : public MemoryDealer {
    using IMemory = ::android::hidl::memory::V1_0::IMemory;
    using IMemoryToken = ::android::hidl::memory::token::V1_0::IMemoryToken;
    using MemoryBlock = ::android::hidl::memory::block::V1_0::MemoryBlock;

   public:
    static bool isOk(const MemoryBlock& memblk);
    /// @param memory The memory size must align to 4096 bytes
    static sp<HidlMemoryDealer> getInstance(const hidl_memory& memory);
    virtual MemoryBlock allocate(size_t size);
    virtual sp<IMemory> heap();

   protected:
    /// @param heap It must be acquired with mapMemory(memory) with its
    /// argument corresponds to the 2nd argument passed to HidlMemoryDealer.
    HidlMemoryDealer(sp<IMemory> heap, const hidl_memory& memory);
    sp<IMemory> mHeap;
    sp<IMemoryToken> mToken;
};

};  // namespace hardware
};  // namespace android

#endif  // ANDROID_HIDL_MEMORY_DEALER_H