#include "../../IAndroidShm.h" #include #include namespace android { static sp receiverMemBase; #define MAX_SHARED_MEMORY_COUNT 257 sp getAndroidShmService() { sp shm = 0; /* Get the buffer service */ if (shm == NULL) { sp sm = defaultServiceManager(); sp binder; binder = sm->getService(String16("com.samsung.android.jam.IAndroidShm")); if (binder != 0) { shm = IAndroidShm::asInterface(binder); //shm = interface_cast(binder); } } return shm; } unsigned int * getBufferMemPointer(int index) { sp shm = getAndroidShmService(); if (shm == NULL) { ALOGE("The EneaBufferServer is not published"); return (unsigned int *)-1; /* return an errorcode... */ } else { receiverMemBase = shm->getBuffer(index); if(receiverMemBase != NULL) return (unsigned int *) receiverMemBase->getBase(); else return (unsigned int*)-1; } } } using namespace android; void setup_test() { sp shm = getAndroidShmService(); if(shm == NULL) return; for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) { shm->removeShm(i); } } void teardown_test() { } void increase_value_once() { ALOGD("*****test: increase_value_once*****\n"); sp shm = getAndroidShmService(); if(shm == NULL) return; int slot = shm->allocShm(10000); unsigned int *base = getBufferMemPointer(slot); if(base != (unsigned int *)-1) { ALOGD("ShmServiceTest base=%p Data=0x%x\n",base, *base); *base = (*base)+1; ALOGD("ShmServiceTest base=%p Data=0x%x CHANGED\n",base, *base); //receiverMemBase = 0; } else { ALOGE("Error shared memory not available\n"); } } void increase_value_10times() { ALOGD("*****test: increase_value_10times*****\n"); sp shm = getAndroidShmService(); if(shm == NULL) return; int slot = shm->allocShm(10000); for(int i = 0; i < 10; i++) { unsigned int *base = getBufferMemPointer(slot); if(base != (unsigned int *)-1) { ALOGD("ShmServiceTest base=%p Data=0x%x\n",base, *base); *base = (*base)+1; ALOGD("ShmServiceTest base=%p Data=0x%x CHANGED\n",base, *base); //receiverMemBase = 0; } else { ALOGE("Error shared memory not available\n"); } } } void check_allocated() { ALOGD("*****test: check_allocated*****\n"); sp shm = getAndroidShmService(); if(shm == NULL) return; int slot = shm->allocShm(10000); int i = 0; for(; i < MAX_SHARED_MEMORY_COUNT; i++) { if(slot == i) { if(shm->isAllocated(i) == 1) { //ALOGD("pass\n"); } else { ALOGD("failed\n"); } } else { if(shm->isAllocated(i) == 0) { //ALOGD("pass\n"); } else { ALOGD("failed\n"); } } } if(i == MAX_SHARED_MEMORY_COUNT) { ALOGD("pass\n"); } } void test_set_get_registry_index() { ALOGD("*****test: test_set_get_registry_index*****\n"); sp shm = getAndroidShmService(); if(shm == NULL) return; int registry = 1; shm->setRegistryIndex(registry); if(registry == shm->getRegistryIndex()) { ALOGD("pass\n"); } else { ALOGD("fail\n"); } registry = 0; shm->setRegistryIndex(registry); if(registry == shm->getRegistryIndex()) { ALOGD("pass\n"); } else { ALOGD("fail\n"); } } void test_memset() { ALOGD("*****test: test_memset*****\n"); sp shm = getAndroidShmService(); if(shm == NULL) return; int slot = shm->allocShm(10000); unsigned int * pnt = getBufferMemPointer(slot); memset (pnt, 0, 10000); ALOGD("result : 0 0 0 0\n"); ALOGD("memory dump : %d %d %d %d\n", pnt[0], pnt[1], pnt[2], pnt[3]); memset (pnt, 0xffffffff, 10000); ALOGD("result : -1 -1 -1 -1\n"); ALOGD("memory dump : %d %d %d %d", pnt[0], pnt[1], pnt[2], pnt[3]); } int main(int argc, char** argv) { // base could be on same address as Servers base but this // is purely by luck do NEVER rely on this. Linux memory // management may put it wherever it likes. setup_test(); increase_value_once(); teardown_test(); setup_test(); increase_value_10times(); teardown_test(); setup_test(); check_allocated(); teardown_test(); setup_test(); test_set_get_registry_index(); teardown_test(); setup_test(); test_memset(); teardown_test(); return 0; }