5728a92e29
The offset that is used in the creation of the MemoryHeapBase must be saved, so that it can be used to recreate the Heap when an IMemory object is passed across process boundary through the binder. Change-Id: Ie618fb5c0718e6711f55ed9235616fd801e648dc Signed-off-by: Anu Sundararajan <sanuradha@ti.com> Signed-off-by: Iliyan Malchev <malchev@google.com>
101 lines
2.8 KiB
C++
101 lines
2.8 KiB
C++
/*
|
|
* Copyright (C) 2008 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_MEMORY_HEAP_BASE_H
|
|
#define ANDROID_MEMORY_HEAP_BASE_H
|
|
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
|
|
#include <binder/IMemory.h>
|
|
|
|
|
|
namespace android {
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
class MemoryHeapBase : public virtual BnMemoryHeap
|
|
{
|
|
public:
|
|
enum {
|
|
READ_ONLY = IMemoryHeap::READ_ONLY,
|
|
// memory won't be mapped locally, but will be mapped in the remote
|
|
// process.
|
|
DONT_MAP_LOCALLY = 0x00000100,
|
|
NO_CACHING = 0x00000200
|
|
};
|
|
|
|
/*
|
|
* maps the memory referenced by fd. but DOESN'T take ownership
|
|
* of the filedescriptor (it makes a copy with dup()
|
|
*/
|
|
MemoryHeapBase(int fd, size_t size, uint32_t flags = 0, uint32_t offset = 0);
|
|
|
|
/*
|
|
* maps memory from the given device
|
|
*/
|
|
MemoryHeapBase(const char* device, size_t size = 0, uint32_t flags = 0);
|
|
|
|
/*
|
|
* maps memory from ashmem, with the given name for debugging
|
|
*/
|
|
MemoryHeapBase(size_t size, uint32_t flags = 0, char const* name = NULL);
|
|
|
|
virtual ~MemoryHeapBase();
|
|
|
|
/* implement IMemoryHeap interface */
|
|
virtual int getHeapID() const;
|
|
virtual void* getBase() const;
|
|
virtual size_t getSize() const;
|
|
virtual uint32_t getFlags() const;
|
|
virtual uint32_t getOffset() const;
|
|
|
|
const char* getDevice() const;
|
|
|
|
/* this closes this heap -- use carefully */
|
|
void dispose();
|
|
|
|
/* this is only needed as a workaround, use only if you know
|
|
* what you are doing */
|
|
status_t setDevice(const char* device) {
|
|
if (mDevice == 0)
|
|
mDevice = device;
|
|
return mDevice ? NO_ERROR : ALREADY_EXISTS;
|
|
}
|
|
|
|
protected:
|
|
MemoryHeapBase();
|
|
// init() takes ownership of fd
|
|
status_t init(int fd, void *base, int size,
|
|
int flags = 0, const char* device = NULL);
|
|
|
|
private:
|
|
status_t mapfd(int fd, size_t size, uint32_t offset = 0);
|
|
|
|
int mFD;
|
|
size_t mSize;
|
|
void* mBase;
|
|
uint32_t mFlags;
|
|
const char* mDevice;
|
|
bool mNeedUnmap;
|
|
uint32_t mOffset;
|
|
};
|
|
|
|
// ---------------------------------------------------------------------------
|
|
}; // namespace android
|
|
|
|
#endif // ANDROID_MEMORY_HEAP_BASE_H
|