1 #include "../../IAndroidShm.h"
2 #include <binder/MemoryHeapBase.h>
3 #include <binder/IServiceManager.h>
4
5 namespace android {
6
7 static sp<IMemoryHeap> receiverMemBase;
8 #define MAX_SHARED_MEMORY_COUNT 257
9
getAndroidShmService()10 sp<IAndroidShm> getAndroidShmService() {
11 sp<IAndroidShm> shm = 0;
12
13 /* Get the buffer service */
14 if (shm == NULL) {
15 sp<IServiceManager> sm = defaultServiceManager();
16 sp<IBinder> binder;
17 binder = sm->getService(String16("com.samsung.android.jam.IAndroidShm"));
18 if (binder != 0) {
19 shm = IAndroidShm::asInterface(binder);
20 //shm = interface_cast<IAndroidShm>(binder);
21 }
22 }
23 return shm;
24 }
25
getBufferMemPointer(int index)26 unsigned int * getBufferMemPointer(int index) {
27 sp<IAndroidShm> shm = getAndroidShmService();
28 if (shm == NULL) {
29 ALOGE("The EneaBufferServer is not published");
30 return (unsigned int *)-1; /* return an errorcode... */
31 } else {
32 receiverMemBase = shm->getBuffer(index);
33 if(receiverMemBase != NULL)
34 return (unsigned int *) receiverMemBase->getBase();
35 else
36 return (unsigned int*)-1;
37 }
38 }
39
40 }
41
42 using namespace android;
43
setup_test()44 void setup_test() {
45 sp<IAndroidShm> shm = getAndroidShmService();
46 if(shm == NULL) return;
47 for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
48 shm->removeShm(i);
49 }
50 }
51
teardown_test()52 void teardown_test() {
53 }
54
increase_value_once()55 void increase_value_once() {
56 ALOGD("*****test: increase_value_once*****\n");
57 sp<IAndroidShm> shm = getAndroidShmService();
58 if(shm == NULL) return;
59
60 int slot = shm->allocShm(10000);
61 unsigned int *base = getBufferMemPointer(slot);
62 if(base != (unsigned int *)-1) {
63 ALOGD("ShmServiceTest base=%p Data=0x%x\n",base, *base);
64 *base = (*base)+1;
65 ALOGD("ShmServiceTest base=%p Data=0x%x CHANGED\n",base, *base);
66 //receiverMemBase = 0;
67 } else {
68 ALOGE("Error shared memory not available\n");
69 }
70 }
71
increase_value_10times()72 void increase_value_10times() {
73 ALOGD("*****test: increase_value_10times*****\n");
74 sp<IAndroidShm> shm = getAndroidShmService();
75 if(shm == NULL) return;
76
77 int slot = shm->allocShm(10000);
78
79 for(int i = 0; i < 10; i++) {
80 unsigned int *base = getBufferMemPointer(slot);
81 if(base != (unsigned int *)-1) {
82 ALOGD("ShmServiceTest base=%p Data=0x%x\n",base, *base);
83 *base = (*base)+1;
84 ALOGD("ShmServiceTest base=%p Data=0x%x CHANGED\n",base, *base);
85 //receiverMemBase = 0;
86 } else {
87 ALOGE("Error shared memory not available\n");
88 }
89 }
90 }
91
check_allocated()92 void check_allocated() {
93 ALOGD("*****test: check_allocated*****\n");
94 sp<IAndroidShm> shm = getAndroidShmService();
95 if(shm == NULL) return;
96
97 int slot = shm->allocShm(10000);
98 int i = 0;
99 for(; i < MAX_SHARED_MEMORY_COUNT; i++) {
100 if(slot == i) {
101 if(shm->isAllocated(i) == 1) {
102 //ALOGD("pass\n");
103 } else {
104 ALOGD("failed\n");
105 }
106 } else {
107 if(shm->isAllocated(i) == 0) {
108 //ALOGD("pass\n");
109 } else {
110 ALOGD("failed\n");
111 }
112 }
113 }
114
115 if(i == MAX_SHARED_MEMORY_COUNT) {
116 ALOGD("pass\n");
117 }
118 }
119
test_set_get_registry_index()120 void test_set_get_registry_index() {
121 ALOGD("*****test: test_set_get_registry_index*****\n");
122 sp<IAndroidShm> shm = getAndroidShmService();
123 if(shm == NULL) return;
124
125 int registry = 1;
126 shm->setRegistryIndex(registry);
127 if(registry == shm->getRegistryIndex()) {
128 ALOGD("pass\n");
129 } else {
130 ALOGD("fail\n");
131 }
132
133 registry = 0;
134 shm->setRegistryIndex(registry);
135 if(registry == shm->getRegistryIndex()) {
136 ALOGD("pass\n");
137 } else {
138 ALOGD("fail\n");
139 }
140 }
141
test_memset()142 void test_memset() {
143 ALOGD("*****test: test_memset*****\n");
144 sp<IAndroidShm> shm = getAndroidShmService();
145 if(shm == NULL) return;
146
147 int slot = shm->allocShm(10000);
148
149 unsigned int * pnt = getBufferMemPointer(slot);
150
151 memset (pnt, 0, 10000);
152
153 ALOGD("result : 0 0 0 0\n");
154 ALOGD("memory dump : %d %d %d %d\n", pnt[0], pnt[1], pnt[2], pnt[3]);
155
156 memset (pnt, 0xffffffff, 10000);
157
158 ALOGD("result : -1 -1 -1 -1\n");
159 ALOGD("memory dump : %d %d %d %d", pnt[0], pnt[1], pnt[2], pnt[3]);
160 }
161
main(int argc,char ** argv)162 int main(int argc, char** argv) {
163 // base could be on same address as Servers base but this
164 // is purely by luck do NEVER rely on this. Linux memory
165 // management may put it wherever it likes.
166
167 setup_test();
168 increase_value_once();
169 teardown_test();
170
171 setup_test();
172 increase_value_10times();
173 teardown_test();
174
175 setup_test();
176 check_allocated();
177 teardown_test();
178
179 setup_test();
180 test_set_get_registry_index();
181 teardown_test();
182
183 setup_test();
184 test_memset();
185 teardown_test();
186
187 return 0;
188 }
189
190