|
- /*
- Copyright (C) 2001-2003 Paul Davis
- Copyright (C) 2005-2012 Grame
- Copyright (C) 2013 Samsung Electronics
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
-
- #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"
-
- // remove ALOGI log
- #define jack_d
- //#define jack_d ALOGI
- #define jack_error ALOGE
- #define MEMORY_SIZE 10*1024
-
-
- namespace android {
-
- jack_shmtype_t Shm::jack_shmtype = shm_ANDROID;
-
- /* The JACK SHM registry is a chunk of memory for keeping track of the
- * shared memory used by each active JACK server. This allows the
- * server to clean up shared memory when it exits. To avoid memory
- * leakage due to kill -9, crashes or debugger-driven exits, this
- * cleanup is also done when a new instance of that server starts.
- */
-
- /* per-process global data for the SHM interfaces */
- jack_shm_id_t Shm::registry_id; /* SHM id for the registry */
- jack_shm_fd_t Shm::registry_fd = JACK_SHM_REGISTRY_FD;
-
- jack_shm_info_t Shm::registry_info = {
- JACK_SHM_NULL_INDEX, 0, 0, { MAP_FAILED }
- };
-
- /* pointers to registry header and array */
- jack_shm_header_t *Shm::jack_shm_header = NULL;
- jack_shm_registry_t *Shm::jack_shm_registry = NULL;
- char Shm::jack_shm_server_prefix[JACK_SERVER_NAME_SIZE+1] = "";
-
- /* jack_shm_lock_registry() serializes updates to the shared memory
- * segment JACK uses to keep track of the SHM segments allocated to
- * all its processes, including multiple servers.
- *
- * This is not a high-contention lock, but it does need to work across
- * multiple processes. High transaction rates and realtime safety are
- * not required. Any solution needs to at least be portable to POSIX
- * and POSIX-like systems.
- *
- * We must be particularly careful to ensure that the lock be released
- * if the owning process terminates abnormally. Otherwise, a segfault
- * or kill -9 at the wrong moment could prevent JACK from ever running
- * again on that machine until after a reboot.
- */
-
- #define JACK_SEMAPHORE_KEY 0x282929
- #define JACK_SHM_REGISTRY_KEY JACK_SEMAPHORE_KEY
- #define JACK_REGISTRY_NAME "/jack-shm-registry"
-
- int Shm::semid = -1;
- pthread_mutex_t Shm::mutex = PTHREAD_MUTEX_INITIALIZER;
-
- //sp<IAndroidShm> Shm::mShmService;
- sp<IMemoryHeap> Shm::mShmMemBase[JACK_SHM_HEAP_ENOUGH_COUNT] = {0,};
-
- Shm* Shm::ref = NULL;
-
- Shm* Shm::Instantiate() {
- if(Shm::ref == NULL) {
- jack_d("shm::Instantiate is called");
- Shm::ref = new Shm;
- //AndroidShm::instantiate();
- }
- return ref;
- }
-
- Shm::Shm() { }
-
- Shm::~Shm() { }
-
- sp<IAndroidShm> Shm::getShmService(){
- return interface_cast<IAndroidShm>(defaultServiceManager()->getService(String16("com.samsung.android.jam.IAndroidShm")));
- }
-
- //sp<IAndroidShm>& Shm::getShmService() {
- // if (mShmService.get() == 0) {
- // sp<IServiceManager> sm = defaultServiceManager();
- // sp<IBinder> binder;
- // do {
- // binder = sm->getService(String16("com.samsung.android.jam.IAndroidShm"));
- // if (binder != 0)
- // break;
- // ALOGW("CameraService not published, waiting...");
- // usleep(500000); // 0.5 s
- // } while(true);
- // mShmService = interface_cast<IAndroidShm>(binder);
- // }
- // ALOGE_IF(mShmService==0, "no CameraService!?");
- // return mShmService;
- //}
-
- void Shm::shm_copy_from_registry (jack_shm_info_t* /*si*/, jack_shm_registry_index_t ) {
- // not used
- }
- void Shm::shm_copy_to_registry (jack_shm_info_t* /*si*/, jack_shm_registry_index_t*) {
- // not used
- }
-
- void Shm::jack_release_shm_entry (jack_shm_registry_index_t index) {
- /* the registry must be locked */
- jack_shm_registry[index].size = 0;
- jack_shm_registry[index].allocator = 0;
- memset (&jack_shm_registry[index].id, 0,
- sizeof (jack_shm_registry[index].id));
- jack_shm_registry[index].fd = 0;
- }
-
- int Shm::release_shm_info (jack_shm_registry_index_t index) {
- /* must NOT have the registry locked */
- if (jack_shm_registry[index].allocator == GetPID()) {
- if (jack_shm_lock_registry () < 0) {
- jack_error ("jack_shm_lock_registry fails...");
- return -1;
- }
- jack_release_shm_entry (index);
- jack_shm_unlock_registry ();
- jack_d ("release_shm_info: success!");
- }
- else
- jack_error ("release_shm_info: error!");
-
- return 0;
- }
- char* Shm::shm_addr (unsigned int fd) {
- if(fd >= JACK_SHM_HEAP_ENOUGH_COUNT) {
- jack_error("ignore to get memory buffer : index[%d] is too big", fd);
- return NULL;
- }
-
- sp<IAndroidShm> service = Shm::getShmService();
- if(service == NULL){
- jack_error("shm service is null");
- return NULL;
- }
- mShmMemBase[fd] = service->getBuffer(fd);
- if(mShmMemBase[fd] == NULL) {
- jack_error("fail to get memory buffer");
- return NULL;
- }
-
- return ((char *) mShmMemBase[fd]->getBase());
- }
-
- int Shm::shm_lock_registry (void) {
- pthread_mutex_lock (&mutex);
- return 0;
- }
-
- void Shm::shm_unlock_registry (void) {
- pthread_mutex_unlock (&mutex);
- }
-
- void Shm::release_shm_entry (jack_shm_registry_index_t index) {
- /* the registry must be locked */
- jack_shm_registry[index].size = 0;
- jack_shm_registry[index].allocator = 0;
- memset (&jack_shm_registry[index].id, 0,
- sizeof (jack_shm_registry[index].id));
- }
-
- void Shm::remove_shm (jack_shm_id_t *id) {
- int shm_fd = -1;
- jack_d("remove_id [%s]",(char*)id);
- if(!strcmp((const char*)id, JACK_REGISTRY_NAME)) {
- shm_fd = registry_fd;
- } else {
- for (int i = 0; i < MAX_SHM_ID; i++) {
- if(!strcmp((const char*)id, jack_shm_registry[i].id)) {
- shm_fd = jack_shm_registry[i].fd;
- break;
- }
- }
- }
-
- if (shm_fd >= 0) {
- sp<IAndroidShm> service = getShmService();
- if(service != NULL) {
- service->removeShm(shm_fd);
- } else {
- jack_error("shm service is null");
- }
- }
- jack_d ("[APA] jack_remove_shm : ok ");
- }
-
- int Shm::access_registry (jack_shm_info_t * ri) {
- jack_d("access_registry\n");
- /* registry must be locked */
- sp<IAndroidShm> service = getShmService();
- if(service == NULL){
- jack_error("shm service is null");
- return EINVAL;
- }
- int shm_fd = service->getRegistryIndex();
-
- strncpy (registry_id, JACK_REGISTRY_NAME, sizeof (registry_id) - 1);
- registry_id[sizeof (registry_id) - 1] = '\0';
-
- if(service->isAllocated(shm_fd) == FALSE) {
- //jack_error ("Cannot mmap shm registry segment (%s)",
- // strerror (errno));
- jack_error ("Cannot mmap shm registry segment");
- //close (shm_fd);
- ri->ptr.attached_at = NULL;
- registry_fd = JACK_SHM_REGISTRY_FD;
- return EINVAL;
- }
-
- ri->fd = shm_fd;
- registry_fd = shm_fd;
- ri->ptr.attached_at = shm_addr(shm_fd);
-
- if(ri->ptr.attached_at == NULL) {
- ALOGE("attached pointer is null !");
- jack_shm_header = NULL;
- jack_shm_registry = NULL;
- return 0;
- }
-
- /* set up global pointers */
- ri->index = JACK_SHM_REGISTRY_INDEX;
- jack_shm_header = (jack_shm_header_t*)(ri->ptr.attached_at);
- jack_shm_registry = (jack_shm_registry_t *) (jack_shm_header + 1);
-
- jack_d("jack_shm_header[%p],jack_shm_registry[%p]", jack_shm_header, jack_shm_registry);
- //close (shm_fd); // steph
- return 0;
- }
-
- int Shm::GetUID() {
- return geteuid();
- }
-
- int Shm::GetPID() {
- return getpid();
- }
-
- int Shm::jack_shm_lock_registry (void) {
- // TODO: replace semaphore to mutex
- pthread_mutex_lock (&mutex);
- return 0;
- }
-
- void Shm::jack_shm_unlock_registry (void) {
- // TODO: replace semaphore to mutex
- pthread_mutex_unlock (&mutex);
- return;
- }
-
- void Shm::shm_init_registry () {
- if(jack_shm_header == NULL)
- return;
-
- /* registry must be locked */
-
- memset (jack_shm_header, 0, JACK_SHM_REGISTRY_SIZE);
-
- jack_shm_header->magic = JACK_SHM_MAGIC;
- //jack_shm_header->protocol = JACK_PROTOCOL_VERSION;
- jack_shm_header->type = jack_shmtype;
- jack_shm_header->size = JACK_SHM_REGISTRY_SIZE;
- jack_shm_header->hdr_len = sizeof (jack_shm_header_t);
- jack_shm_header->entry_len = sizeof (jack_shm_registry_t);
-
- for (int i = 0; i < MAX_SHM_ID; ++i) {
- jack_shm_registry[i].index = i;
- }
- }
-
- void Shm::set_server_prefix (const char *server_name) {
- snprintf (jack_shm_server_prefix, sizeof (jack_shm_server_prefix),
- "jack-%d:%s:", GetUID(), server_name);
- }
-
- /* create a new SHM registry segment
- *
- * sets up global registry pointers, if successful
- *
- * returns: 0 if registry created successfully
- * nonzero error code if unable to allocate a new registry
- */
- int Shm::create_registry (jack_shm_info_t * ri) {
- jack_d("create_registry\n");
- /* registry must be locked */
- int shm_fd = 0;
-
- strncpy (registry_id, JACK_REGISTRY_NAME, sizeof (registry_id) - 1);
- registry_id[sizeof (registry_id) - 1] = '\0';
-
- sp<IAndroidShm> service = getShmService();
- if(service == NULL){
- jack_error("shm service is null");
- return EINVAL;
- }
-
- if((shm_fd = service->allocShm(JACK_SHM_REGISTRY_SIZE)) < 0) {
- jack_error("Cannot create shm registry segment");
- registry_fd = JACK_SHM_REGISTRY_FD;
- return EINVAL;
- }
-
- service->setRegistryIndex(shm_fd);
-
- /* set up global pointers */
- ri->fd = shm_fd;
- ri->index = JACK_SHM_REGISTRY_INDEX;
- registry_fd = shm_fd;
- ri->ptr.attached_at = shm_addr(shm_fd);
- ri->size = JACK_SHM_REGISTRY_SIZE;
-
- jack_shm_header = (jack_shm_header_t*)(ri->ptr.attached_at);
- jack_shm_registry = (jack_shm_registry_t *) (jack_shm_header + 1);
-
- jack_d("create_registry jack_shm_header[%p], jack_shm_registry[%p]", jack_shm_header, jack_shm_registry);
-
- /* initialize registry contents */
- shm_init_registry ();
- //close (shm_fd); // steph
-
- return 0;
- }
-
- int Shm::shm_validate_registry () {
- /* registry must be locked */
- if(jack_shm_header == NULL) {
- return -1;
- }
-
- if ((jack_shm_header->magic == JACK_SHM_MAGIC)
- //&& (jack_shm_header->protocol == JACK_PROTOCOL_VERSION)
- && (jack_shm_header->type == jack_shmtype)
- && (jack_shm_header->size == JACK_SHM_REGISTRY_SIZE)
- && (jack_shm_header->hdr_len == sizeof (jack_shm_header_t))
- && (jack_shm_header->entry_len == sizeof (jack_shm_registry_t))) {
-
- return 0; /* registry OK */
- }
-
- return -1;
- }
-
- int Shm::server_initialize_shm (int new_registry) {
- int rc;
-
- jack_d("server_initialize_shm\n");
-
- if (jack_shm_header)
- return 0; /* already initialized */
-
- if (shm_lock_registry () < 0) {
- jack_error ("jack_shm_lock_registry fails...");
- return -1;
- }
-
- rc = access_registry (®istry_info);
-
- if (new_registry) {
- remove_shm (®istry_id);
- rc = ENOENT;
- }
-
- switch (rc) {
- case ENOENT: /* registry does not exist */
- rc = create_registry (®istry_info);
- break;
- case 0: /* existing registry */
- if (shm_validate_registry () == 0)
- break;
- /* else it was invalid, so fall through */
- case EINVAL: /* bad registry */
- /* Apparently, this registry was created by an older
- * JACK version. Delete it so we can try again. */
- release_shm (®istry_info);
- remove_shm (®istry_id);
- if ((rc = create_registry (®istry_info)) != 0) {
- //jack_error ("incompatible shm registry (%s)",
- // strerror (errno));
- jack_error ("incompatible shm registry");
- //#ifndef USE_POSIX_SHM
- // jack_error ("to delete, use `ipcrm -M 0x%0.8x'", JACK_SHM_REGISTRY_KEY);
- //#endif
- }
- break;
- default: /* failure return code */
- break;
- }
-
- shm_unlock_registry ();
- return rc;
- }
-
- // here begin the API
- int Shm::register_server (const char *server_name, int new_registry) {
- int i, res = 0;
-
- jack_d("register_server new_registry[%d]\n", new_registry);
-
- set_server_prefix (server_name);
-
- if (server_initialize_shm (new_registry))
- return ENOMEM;
-
- if (shm_lock_registry () < 0) {
- jack_error ("jack_shm_lock_registry fails...");
- return -1;
- }
-
- /* See if server_name already registered. Since server names
- * are per-user, we register the unique server prefix string.
- */
- for (i = 0; i < MAX_SERVERS; i++) {
-
- if (strncmp (jack_shm_header->server[i].name,
- jack_shm_server_prefix,
- JACK_SERVER_NAME_SIZE) != 0)
- continue; /* no match */
-
- if (jack_shm_header->server[i].pid == GetPID()) {
- res = 0; /* it's me */
- goto unlock;
- }
-
- /* see if server still exists */
- if (kill (jack_shm_header->server[i].pid, 0) == 0) {
- res = EEXIST; /* other server running */
- goto unlock;
- }
-
- /* it's gone, reclaim this entry */
- memset (&jack_shm_header->server[i], 0,
- sizeof (jack_shm_server_t));
- }
-
- /* find a free entry */
- for (i = 0; i < MAX_SERVERS; i++) {
- if (jack_shm_header->server[i].pid == 0)
- break;
- }
-
- if (i >= MAX_SERVERS) {
- res = ENOSPC; /* out of space */
- goto unlock;
- }
-
- /* claim it */
- jack_shm_header->server[i].pid = GetPID();
- strncpy (jack_shm_header->server[i].name,
- jack_shm_server_prefix,
- JACK_SERVER_NAME_SIZE - 1);
- jack_shm_header->server[i].name[JACK_SERVER_NAME_SIZE - 1] = '\0';
-
- unlock:
- shm_unlock_registry ();
- return res;
- }
-
- int Shm::unregister_server (const char * /* server_name */) {
- int i;
- if (shm_lock_registry () < 0) {
- jack_error ("jack_shm_lock_registry fails...");
- return -1;
- }
-
- for (i = 0; i < MAX_SERVERS; i++) {
- if (jack_shm_header->server[i].pid == GetPID()) {
- memset (&jack_shm_header->server[i], 0,
- sizeof (jack_shm_server_t));
- }
- }
-
- shm_unlock_registry ();
- return 0;
- }
-
- int Shm::initialize_shm (const char *server_name) {
- int rc;
-
- if (jack_shm_header)
- return 0; /* already initialized */
-
- set_server_prefix (server_name);
-
- if (shm_lock_registry () < 0) {
- jack_error ("jack_shm_lock_registry fails...");
- return -1;
- }
-
- if ((rc = access_registry (®istry_info)) == 0) {
- if ((rc = shm_validate_registry ()) != 0) {
- jack_error ("Incompatible shm registry, "
- "are jackd and libjack in sync?");
- }
- }
- shm_unlock_registry ();
-
- return rc;
- }
-
- int Shm::initialize_shm_server (void) {
- // not used
- return 0;
- }
-
- int Shm::initialize_shm_client (void) {
- // not used
- return 0;
- }
-
- int Shm::cleanup_shm (void) {
- int i;
- int destroy;
- jack_shm_info_t copy;
-
- if (shm_lock_registry () < 0) {
- jack_error ("jack_shm_lock_registry fails...");
- return -1;
- }
-
- for (i = 0; i < MAX_SHM_ID; i++) {
- jack_shm_registry_t* r;
-
- r = &jack_shm_registry[i];
- memcpy (©, r, sizeof (jack_shm_info_t));
- destroy = FALSE;
-
- /* ignore unused entries */
- if (r->allocator == 0)
- continue;
-
- /* is this my shm segment? */
- if (r->allocator == GetPID()) {
-
- /* allocated by this process, so unattach
- and destroy. */
- release_shm (©);
- destroy = TRUE;
-
- } else {
-
- /* see if allocator still exists */
- if (kill (r->allocator, 0)) {
- if (errno == ESRCH) {
- /* allocator no longer exists,
- * so destroy */
- destroy = TRUE;
- }
- }
- }
-
- if (destroy) {
-
- int index = copy.index;
-
- if ((index >= 0) && (index < MAX_SHM_ID)) {
- remove_shm (&jack_shm_registry[index].id);
- release_shm_entry (index);
- }
- r->size = 0;
- r->allocator = 0;
- }
- }
-
- shm_unlock_registry ();
- return TRUE;
-
- }
-
- jack_shm_registry_t * Shm::get_free_shm_info () {
- /* registry must be locked */
- jack_shm_registry_t* si = NULL;
- int i;
-
- for (i = 0; i < MAX_SHM_ID; ++i) {
- if (jack_shm_registry[i].size == 0) {
- break;
- }
- }
-
- if (i < MAX_SHM_ID) {
- si = &jack_shm_registry[i];
- }
-
- return si;
- }
-
- int Shm::shmalloc (const char * /*shm_name*/, jack_shmsize_t size, jack_shm_info_t* si) {
- jack_shm_registry_t* registry;
- int shm_fd;
- int rc = -1;
- char name[SHM_NAME_MAX+1];
-
- if (shm_lock_registry () < 0) {
- jack_error ("jack_shm_lock_registry fails...");
- return -1;
- }
-
- sp<IAndroidShm> service = getShmService();
- if(service == NULL){
- rc = errno;
- jack_error("shm service is null");
- goto unlock;
- }
-
- if ((registry = get_free_shm_info ()) == NULL) {
- jack_error ("shm registry full");
- goto unlock;
- }
-
- snprintf (name, sizeof (name), "/jack-%d-%d", GetUID(), registry->index);
- if (strlen (name) >= sizeof (registry->id)) {
- jack_error ("shm segment name too long %s", name);
- goto unlock;
- }
-
- if((shm_fd = service->allocShm(size)) < 0) {
- rc = errno;
- jack_error ("Cannot create shm segment %s", name);
- goto unlock;
- }
-
- //close (shm_fd);
- registry->size = size;
- strncpy (registry->id, name, sizeof (registry->id) - 1);
- registry->id[sizeof (registry->id) - 1] = '\0';
- registry->allocator = GetPID();
- registry->fd = shm_fd;
- si->fd = shm_fd;
- si->index = registry->index;
- si->ptr.attached_at = MAP_FAILED; /* not attached */
- rc = 0; /* success */
-
- jack_d ("[APA] jack_shmalloc : ok ");
-
- unlock:
- shm_unlock_registry ();
- return rc;
- }
-
- void Shm::release_shm (jack_shm_info_t* /*si*/) {
- // do nothing
- }
-
- void Shm::release_lib_shm (jack_shm_info_t* /*si*/) {
- // do nothing
- }
-
- void Shm::destroy_shm (jack_shm_info_t* si) {
- /* must NOT have the registry locked */
- if (si->index == JACK_SHM_NULL_INDEX)
- return; /* segment not allocated */
-
- remove_shm (&jack_shm_registry[si->index].id);
- release_shm_info (si->index);
- }
-
- int Shm::attach_shm (jack_shm_info_t* si) {
- jack_shm_registry_t *registry = &jack_shm_registry[si->index];
-
- if((si->ptr.attached_at = shm_addr(registry->fd)) == NULL) {
- jack_error ("Cannot mmap shm segment %s", registry->id);
- close (si->fd);
- return -1;
- }
- return 0;
- }
-
- int Shm::attach_lib_shm (jack_shm_info_t* si) {
- int res = attach_shm(si);
- if (res == 0)
- si->size = jack_shm_registry[si->index].size; // Keep size in si struct
- return res;
- }
-
- int Shm::attach_shm_read (jack_shm_info_t* si) {
- jack_shm_registry_t *registry = &jack_shm_registry[si->index];
-
- if((si->ptr.attached_at = shm_addr(registry->fd)) == NULL) {
- jack_error ("Cannot mmap shm segment %s", registry->id);
- close (si->fd);
- return -1;
- }
- return 0;
- }
-
- int Shm::attach_lib_shm_read (jack_shm_info_t* si) {
- int res = attach_shm_read(si);
- if (res == 0)
- si->size = jack_shm_registry[si->index].size; // Keep size in si struct
- return res;
- }
-
- int Shm::resize_shm (jack_shm_info_t* si, jack_shmsize_t size) {
- jack_shm_id_t id;
-
- /* The underlying type of `id' differs for SYSV and POSIX */
- memcpy (&id, &jack_shm_registry[si->index].id, sizeof (id));
-
- release_shm (si);
- destroy_shm (si);
-
- if (shmalloc ((char *) id, size, si)) {
- return -1;
- }
- return attach_shm (si);
- }
-
- void Shm::jack_shm_copy_from_registry (jack_shm_info_t* si, jack_shm_registry_index_t t) {
- Shm::Instantiate()->shm_copy_from_registry(si,t);
- }
- void Shm::jack_shm_copy_to_registry (jack_shm_info_t* si, jack_shm_registry_index_t* t) {
- Shm::Instantiate()->shm_copy_to_registry(si,t);
- }
- int Shm::jack_release_shm_info (jack_shm_registry_index_t t) {
- return Shm::Instantiate()->release_shm_info(t);
- }
- char* Shm::jack_shm_addr (jack_shm_info_t* si) {
- if(si != NULL) {
- return (char*)si->ptr.attached_at;
- } else {
- jack_error ("jack_shm_addr : jack_shm_info_t is NULL!");
- return NULL;
- }
- }
- int Shm::jack_register_server (const char *server_name, int new_registry) {
- return Shm::Instantiate()->register_server(server_name, new_registry);
- }
- int Shm::jack_unregister_server (const char *server_name) {
- return Shm::Instantiate()->unregister_server(server_name);
- }
- int Shm::jack_initialize_shm (const char *server_name) {
- return Shm::Instantiate()->initialize_shm(server_name);
- }
- int Shm::jack_initialize_shm_server (void) {
- return Shm::Instantiate()->initialize_shm_server();
- }
- int Shm::jack_initialize_shm_client () {
- return Shm::Instantiate()->initialize_shm_client();
- }
- int Shm::jack_cleanup_shm (void) {
- return Shm::Instantiate()->cleanup_shm();
- }
- int Shm::jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result) {
- return Shm::Instantiate()->shmalloc(shm_name, size, result);
- }
- void Shm::jack_release_shm (jack_shm_info_t* si) {
- Shm::Instantiate()->release_shm(si);
- }
- void Shm::jack_release_lib_shm (jack_shm_info_t* si) {
- Shm::Instantiate()->release_lib_shm(si);
- }
- void Shm::jack_destroy_shm (jack_shm_info_t* si) {
- Shm::Instantiate()->destroy_shm(si);
- }
- int Shm::jack_attach_shm (jack_shm_info_t* si) {
- return Shm::Instantiate()->attach_shm(si);
- }
- int Shm::jack_attach_lib_shm (jack_shm_info_t* si) {
- return Shm::Instantiate()->attach_lib_shm(si);
- }
- int Shm::jack_attach_shm_read (jack_shm_info_t* si) {
- return Shm::Instantiate()->attach_shm_read(si);
- }
- int Shm::jack_attach_lib_shm_read (jack_shm_info_t* si) {
- return Shm::Instantiate()->attach_lib_shm_read(si);
- }
- int Shm::jack_resize_shm (jack_shm_info_t* si, jack_shmsize_t size) {
- return Shm::Instantiate()->resize_shm(si, size);
- }
- };
-
- void jack_shm_copy_from_registry (jack_shm_info_t* si, jack_shm_registry_index_t t) {
- android::Shm::jack_shm_copy_from_registry(si, t);
- }
- void jack_shm_copy_to_registry (jack_shm_info_t* si, jack_shm_registry_index_t* t) {
- android::Shm::jack_shm_copy_to_registry(si, t);
- }
- int jack_release_shm_info (jack_shm_registry_index_t t) {
- return android::Shm::jack_release_shm_info(t);
- }
- char* jack_shm_addr (jack_shm_info_t* si) {
- return android::Shm::jack_shm_addr(si);
- }
- int jack_register_server (const char *server_name, int new_registry) {
- return android::Shm::jack_register_server(server_name, new_registry);
- }
- int jack_unregister_server (const char *server_name) {
- return android::Shm::jack_unregister_server(server_name);
- }
- int jack_initialize_shm (const char *server_name) {
- return android::Shm::jack_initialize_shm(server_name);
- }
- int jack_initialize_shm_server (void) {
- return android::Shm::jack_initialize_shm_server();
- }
- int jack_initialize_shm_client (void) {
- return android::Shm::jack_initialize_shm_client();
- }
- int jack_cleanup_shm (void) {
- return android::Shm::jack_cleanup_shm();
- }
- int jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result) {
- return android::Shm::jack_shmalloc(shm_name, size, result);
- }
- void jack_release_shm (jack_shm_info_t* si) {
- android::Shm::jack_release_shm(si);
- }
- void jack_release_lib_shm (jack_shm_info_t* si) {
- android::Shm::jack_release_lib_shm(si);
- }
- void jack_destroy_shm (jack_shm_info_t* si) {
- android::Shm::jack_destroy_shm(si);
- }
- int jack_attach_shm (jack_shm_info_t* si) {
- return android::Shm::jack_attach_shm(si);
- }
- int jack_attach_lib_shm (jack_shm_info_t* si) {
- return android::Shm::jack_attach_lib_shm(si);
- }
- int jack_attach_shm_read (jack_shm_info_t* si) {
- return android::Shm::jack_attach_shm_read(si);
- }
- int jack_attach_lib_shm_read (jack_shm_info_t* si) {
- return android::Shm::jack_attach_lib_shm_read(si);
- }
- int jack_resize_shm (jack_shm_info_t* si, jack_shmsize_t size) {
- return android::Shm::jack_resize_shm(si, size);
- }
- void jack_instantiate() {
- android::AndroidShm::instantiate();
- }
|