| 
							- #define LOG_TAG "JAMSHMSERVICE"
 - 
 - #include <stddef.h>
 - #include <stdio.h>
 - #include <stdlib.h>
 - #include <string.h>
 - #include <unistd.h>
 - 
 - #include <binder/MemoryHeapBase.h>
 - #include <binder/IServiceManager.h>
 - #include <binder/IPCThreadState.h>
 - #include <utils/Log.h>
 - #include <sys/stat.h>
 - #include <sys/socket.h>
 - #include <sys/types.h>
 - #include <sys/un.h>
 - #include <sys/wait.h>
 - #include "BnAndroidShm.h"
 - #include "AndroidShm.h"
 - 
 - 
 - #include "JackConstants.h"
 - 
 - 
 - #include <fcntl.h>
 - #include <signal.h>
 - #include <limits.h>
 - #include <errno.h>
 - #include <dirent.h>
 - #include <sys/mman.h>
 - #include <linux/ashmem.h>
 - #include <cutils/ashmem.h>
 - 
 - #include "JackError.h"
 - 
 - #include <semaphore.h>
 - 
 - 
 - #define MEMORY_SIZE 10*1024
 - 
 - #define SEMAPHORE_NULL_CHAR '\0'
 - 
 - // remove ALOGI log
 - #undef  ALOGI
 - #define ALOGI 
 - 
 - namespace android {
 - 
 - 
 -     int AndroidShm::instantiate() {
 -         defaultServiceManager()->addService(String16("com.samsung.android.jam.IAndroidShm"), new AndroidShm); // SINGLETON WITH SAME NAME
 -         return 0;
 -     }
 - 
 -     int AndroidShm::sendCommand(const char* command) {
 -         ALOGI("I(pid:%d) send command is %s\n", getpid(), command);
 -         if(strcmp(command, "semaphore") == 0) {
 -             // print debug message about semaphore simulation
 -             for(int i = MAX_SEMAPHORE_MEMORY_COUNT -1 ; i >= 0; i--) {
 -                 printf("index[%3d] = ptr[%p] name[%s]\n", i, (mSemaphore[i] != NULL)?mSemaphore[i]->getBase():0, mSemaphoreName[i]);
 -                 ALOGI("index[%3d] = ptr[%p] name[%s]\n", i, (mSemaphore[i] != NULL)?mSemaphore[i]->getBase():0, mSemaphoreName[i]);
 -             }
 -         }
 -         return NO_ERROR;
 -     }
 - 
 -     int AndroidShm::testGetBufferByNewProcess() {
 -         ALOGI("testGetBufferByNewProcess...");
 -         int status;
 -         int childPid = fork();
 -         
 -         if(childPid > 0) {
 -             ALOGI("I(pid%d) made a child process(pid:%d)", getpid(), childPid);
 -             ALOGI("I(pid%d) wait until child(%d) was finish", getpid(), childPid);
 -             wait(&status);
 -             // wait 하지 않으면 child process가 남아 있음. 
 -             ALOGI("child(%d) was finished. ", childPid);
 -         } else if(childPid == 0) {
 -             ALOGI("im a new child process(pid:%d) ", getpid());
 -             if(-1 == execlp("/system/bin/getbufferclient","getbufferclient",NULL)) {
 -                 ALOGE("failed to execute getbufferclient");
 -             }
 -             exit(0);
 -         } else {
 -             ALOGI("failed creating child process");
 -         } 
 -         return 0;
 -     }
 - 
 -     int AndroidShm::testGetBuffer() {
 -         ALOGI("I(pid:%d) trying to test get buffer...", getpid());
 -         sp<IServiceManager> sm = defaultServiceManager();
 -         ALOGI("get default ServiceManager is done");
 -         sp<IBinder> b;
 -         //String16* serviceName = new String16("com.samsung.android.jam.IAndroidShm");
 -         do {
 -             //ALOGI("here");
 -             b = sm->getService(String16("com.samsung.android.jam.IAndroidShm"));
 -             //ALOGI("getservice is done");
 -             
 -             if(b != 0)
 -                 break;
 -             //ALOGI("AndroidShm is not working, waiting...");
 -             usleep(500000);
 -                 
 -         } while(true);
 -                 
 -         sp<IAndroidShm> service = interface_cast<IAndroidShm>(b);
 - 
 -         //shared buffer.
 -         sp<IMemoryHeap> receiverMemBase = service->getBuffer(0);
 -         
 -         unsigned int *base = (unsigned int *) receiverMemBase->getBase();
 -         int ret = 0;
 -         if(base != (unsigned int *) -1) {
 -             ALOGD("AndroidShm::testGetBuffer base=%p Data=0x%x\n",base, *base);
 -             *base = (*base)+1;
 -             ret = (unsigned int)(*base);
 -             ALOGI("AndroidShm::testGetBuffer base=%p Data=0x%x CHANGED\n",base, *base);
 -             receiverMemBase = 0;
 -         } else {
 -             ALOGE("Error shared memory not available\n");
 -         }
 -         return 0;
 -     }
 - 
 -     sp<IMemoryHeap> AndroidShm::getBuffer(int index) {
 -         ALOGI("I(pid:%d) getBuffer index:%d", getpid(), index);
 -         if(index < 0 || index >= MAX_SHARED_MEMORY_COUNT) {
 -             ALOGE("error : out of index [%d]", index);
 -             return NULL;
 -         }
 -         return mMemHeap[index];
 -     }
 - 
 -     int AndroidShm::MemAlloc(unsigned int size) {
 - 		ALOGI("try to allocate memory size[%d]", size);
 -         for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
 -             if(mMemHeap[i] == NULL) {
 -                 mMemHeap[i] = new MemoryHeapBase(size);
 -                 if(mMemHeap[i] == NULL){
 - 					ALOGI("fail to alloc, try one more...");
 - 					continue; // try one more.
 -                 }
 -                 return i;
 -             }
 -         }
 - 		ALOGE("fail to MemAlloc");
 -         return -1; // fail to alloc
 -     }
 - 
 -     AndroidShm::AndroidShm() {
 -         ALOGI("AndroidShm is created");
 -         for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
 -             mMemHeap[i] = NULL;
 -         }
 -         mRegistryIndex = 10000;
 -         //mMemHeap = new MemoryHeapBase(MEMORY_SIZE);
 -         //unsigned int *base = (unsigned int*) mMemHeap->getBase();
 -         //*base = 0xdeadcafe;//
 - 
 -         for(int j = 0; j < MAX_SEMAPHORE_MEMORY_COUNT; j++) {
 -             mSemaphore[j] = NULL;
 -             memset(mSemaphoreName[j], SEMAPHORE_NULL_CHAR, MAX_SEMAPHORE_NAME_LENGTH);
 -         }
 -     }
 - 
 -     AndroidShm::~AndroidShm() {
 -         ALOGI("AndroidShm is destroyed");
 -         for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
 - 			(mMemHeap[i]).clear();
 -         }
 -         for(int j = 0; j < MAX_SEMAPHORE_MEMORY_COUNT; j++) {
 - 			(mSemaphore[j]).clear();
 -         }
 -     }
 - 
 -     //status_t AndroidShm::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
 -     //    return BnAndroidShm::onTransact(code, data, reply, flags);
 -     //}
 - 
 -     int AndroidShm::allocShm(const int size) { // if negative return value is error
 -     	ALOGI("try to alloc shared memory size[%d]", size);
 -         return MemAlloc(size);
 -     }
 -     
 -     int AndroidShm::removeShm(const unsigned int index) { // shared memory 제거 
 -     	ALOGI("try to remove shared memory index[%d]", index);
 -         if(index >= MAX_SHARED_MEMORY_COUNT) {
 -             ALOGE("remove shared memory: out of index");
 -             return -1;
 -         }
 - 		(mMemHeap[index]).clear();
 -         return 1;
 -     }
 - 
 -     int AndroidShm::isAllocated(const unsigned int index) { // allocated 여부 확인
 -     	ALOGI("try to check the memory allocation index[%d]", index);
 -         if(index >= MAX_SHARED_MEMORY_COUNT) {
 -             ALOGE("shared memory: out of index");
 -             return 0;
 -         }
 -         if(mMemHeap[index] == NULL)
 -             return 0;
 -         else
 -             return 1;
 -     }
 - 
 -     int AndroidShm::setRegistryIndex(const unsigned int index) {
 - 		ALOGI("set registry index %d", index);
 -         mRegistryIndex = index;
 -         return 1;
 -     }
 -     
 -     int AndroidShm::getRegistryIndex() {
 -         return mRegistryIndex;
 -     }
 - 
 -     sp<IMemoryHeap> AndroidShm::InitSemaphore(const char* name) {
 - 		ALOGI("init semaphore [%s]", name);
 -         for(int i = 0; i < MAX_SEMAPHORE_MEMORY_COUNT; i++) {
 -             if(mSemaphoreName[i][0] == SEMAPHORE_NULL_CHAR) {
 -                 mSemaphore[i] = new MemoryHeapBase(sizeof(sem_t));
 - 				if(mSemaphore[i] == NULL){
 - 					ALOGI("fail to alloc, try one more...");
 - 					continue;
 - 				}
 -                 if(sem_init((sem_t*)(mSemaphore[i]->getBase()), 1, 0) == 0) {
 -                     strncpy(mSemaphoreName[i], name, MAX_SEMAPHORE_NAME_LENGTH - 1);
 -                     mSemaphoreName[i][MAX_SEMAPHORE_NAME_LENGTH - 1] = '\0';
 - 					ALOGI("sem_init success");
 -                     return mSemaphore[i];
 -                 } else {
 -                 	(mSemaphore[i]).clear();
 - 					ALOGE("sem_init failed null returned");
 -                     return NULL;
 -                 }
 -             } else {
 -                 // find already exist name
 -                 if(strcmp(mSemaphoreName[i], name) == 0) { // found
 -                 	ALOGI("found - return alread allocated semaphore");
 -                     return mSemaphore[i];
 -                 }
 -             }
 -         }
 - 		ALOGE("sem_init failed null returned 2");
 -         return NULL;
 -     }
 - 
 - };
 
 
  |