• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_MEMORY_HEAP_BASE_H
18 #define ANDROID_MEMORY_HEAP_BASE_H
19 
20 #include <stdlib.h>
21 #include <stdint.h>
22 
23 #include <binder/IMemory.h>
24 
25 
26 namespace android {
27 
28 // ---------------------------------------------------------------------------
29 
30 class MemoryHeapBase : public virtual BnMemoryHeap
31 {
32 public:
33     enum {
34         READ_ONLY = IMemoryHeap::READ_ONLY,
35         // memory won't be mapped locally, but will be mapped in the remote
36         // process.
37         DONT_MAP_LOCALLY = 0x00000100,
38         NO_CACHING = 0x00000200
39     };
40 
41     /*
42      * maps the memory referenced by fd. but DOESN'T take ownership
43      * of the filedescriptor (it makes a copy with dup()
44      */
45     MemoryHeapBase(int fd, size_t size, uint32_t flags = 0, uint32_t offset = 0);
46 
47     /*
48      * maps memory from the given device
49      */
50     MemoryHeapBase(const char* device, size_t size = 0, uint32_t flags = 0);
51 
52     /*
53      * maps memory from ashmem, with the given name for debugging
54      */
55     MemoryHeapBase(size_t size, uint32_t flags = 0, char const* name = NULL);
56 
57     virtual ~MemoryHeapBase();
58 
59     /* implement IMemoryHeap interface */
60     virtual int         getHeapID() const;
61     virtual void*       getBase() const;
62     virtual size_t      getSize() const;
63     virtual uint32_t    getFlags() const;
64     virtual uint32_t      getOffset() const;
65 
66     const char*         getDevice() const;
67 
68     /* this closes this heap -- use carefully */
69     void dispose();
70 
71     /* this is only needed as a workaround, use only if you know
72      * what you are doing */
setDevice(const char * device)73     status_t setDevice(const char* device) {
74         if (mDevice == 0)
75             mDevice = device;
76         return mDevice ? NO_ERROR : ALREADY_EXISTS;
77     }
78 
79 protected:
80             MemoryHeapBase();
81     // init() takes ownership of fd
82     status_t init(int fd, void *base, int size,
83             int flags = 0, const char* device = NULL);
84 
85 private:
86     status_t mapfd(int fd, size_t size, uint32_t offset = 0);
87 
88     int         mFD;
89     size_t      mSize;
90     void*       mBase;
91     uint32_t    mFlags;
92     const char* mDevice;
93     bool        mNeedUnmap;
94     uint32_t    mOffset;
95 };
96 
97 // ---------------------------------------------------------------------------
98 }; // namespace android
99 
100 #endif // ANDROID_MEMORY_HEAP_BASE_H
101