1*08b48e0bSAndroid Build Coastguard Worker #ifdef __ANDROID__
2*08b48e0bSAndroid Build Coastguard Worker #ifndef _ANDROID_ASHMEM_H
3*08b48e0bSAndroid Build Coastguard Worker #define _ANDROID_ASHMEM_H
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE
6*08b48e0bSAndroid Build Coastguard Worker #define _GNU_SOURCE
7*08b48e0bSAndroid Build Coastguard Worker #endif
8*08b48e0bSAndroid Build Coastguard Worker #include <sys/syscall.h>
9*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
10*08b48e0bSAndroid Build Coastguard Worker #include <fcntl.h>
11*08b48e0bSAndroid Build Coastguard Worker #include <linux/ashmem.h>
12*08b48e0bSAndroid Build Coastguard Worker #include <sys/ioctl.h>
13*08b48e0bSAndroid Build Coastguard Worker #include <sys/mman.h>
14*08b48e0bSAndroid Build Coastguard Worker #include <sys/shm.h>
15*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
16*08b48e0bSAndroid Build Coastguard Worker #define ASHMEM_DEVICE "/dev/ashmem"
17*08b48e0bSAndroid Build Coastguard Worker
shmdt(const void * address)18*08b48e0bSAndroid Build Coastguard Worker int shmdt(const void *address) {
19*08b48e0bSAndroid Build Coastguard Worker
20*08b48e0bSAndroid Build Coastguard Worker #if defined(SYS_shmdt)
21*08b48e0bSAndroid Build Coastguard Worker return syscall(SYS_shmdt, address);
22*08b48e0bSAndroid Build Coastguard Worker #else
23*08b48e0bSAndroid Build Coastguard Worker return syscall(SYS_ipc, SHMDT, 0, 0, 0, address, 0);
24*08b48e0bSAndroid Build Coastguard Worker #endif
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker }
27*08b48e0bSAndroid Build Coastguard Worker
shmctl(int __shmid,int __cmd,struct shmid_ds * __buf)28*08b48e0bSAndroid Build Coastguard Worker int shmctl(int __shmid, int __cmd, struct shmid_ds *__buf) {
29*08b48e0bSAndroid Build Coastguard Worker
30*08b48e0bSAndroid Build Coastguard Worker int ret = 0;
31*08b48e0bSAndroid Build Coastguard Worker if (__cmd == IPC_RMID) {
32*08b48e0bSAndroid Build Coastguard Worker
33*08b48e0bSAndroid Build Coastguard Worker int length = ioctl(__shmid, ASHMEM_GET_SIZE, NULL);
34*08b48e0bSAndroid Build Coastguard Worker struct ashmem_pin pin = {0, length};
35*08b48e0bSAndroid Build Coastguard Worker ret = ioctl(__shmid, ASHMEM_UNPIN, &pin);
36*08b48e0bSAndroid Build Coastguard Worker close(__shmid);
37*08b48e0bSAndroid Build Coastguard Worker
38*08b48e0bSAndroid Build Coastguard Worker }
39*08b48e0bSAndroid Build Coastguard Worker
40*08b48e0bSAndroid Build Coastguard Worker return ret;
41*08b48e0bSAndroid Build Coastguard Worker
42*08b48e0bSAndroid Build Coastguard Worker }
43*08b48e0bSAndroid Build Coastguard Worker
shmget(key_t __key,size_t __size,int __shmflg)44*08b48e0bSAndroid Build Coastguard Worker int shmget(key_t __key, size_t __size, int __shmflg) {
45*08b48e0bSAndroid Build Coastguard Worker
46*08b48e0bSAndroid Build Coastguard Worker (void)__shmflg;
47*08b48e0bSAndroid Build Coastguard Worker int fd, ret;
48*08b48e0bSAndroid Build Coastguard Worker char ourkey[11];
49*08b48e0bSAndroid Build Coastguard Worker
50*08b48e0bSAndroid Build Coastguard Worker fd = open(ASHMEM_DEVICE, O_RDWR);
51*08b48e0bSAndroid Build Coastguard Worker if (fd < 0) return fd;
52*08b48e0bSAndroid Build Coastguard Worker
53*08b48e0bSAndroid Build Coastguard Worker sprintf(ourkey, "%d", __key);
54*08b48e0bSAndroid Build Coastguard Worker ret = ioctl(fd, ASHMEM_SET_NAME, ourkey);
55*08b48e0bSAndroid Build Coastguard Worker if (ret < 0) goto error;
56*08b48e0bSAndroid Build Coastguard Worker
57*08b48e0bSAndroid Build Coastguard Worker ret = ioctl(fd, ASHMEM_SET_SIZE, __size);
58*08b48e0bSAndroid Build Coastguard Worker if (ret < 0) goto error;
59*08b48e0bSAndroid Build Coastguard Worker
60*08b48e0bSAndroid Build Coastguard Worker return fd;
61*08b48e0bSAndroid Build Coastguard Worker
62*08b48e0bSAndroid Build Coastguard Worker error:
63*08b48e0bSAndroid Build Coastguard Worker close(fd);
64*08b48e0bSAndroid Build Coastguard Worker return ret;
65*08b48e0bSAndroid Build Coastguard Worker
66*08b48e0bSAndroid Build Coastguard Worker }
67*08b48e0bSAndroid Build Coastguard Worker
shmat(int __shmid,const void * __shmaddr,int __shmflg)68*08b48e0bSAndroid Build Coastguard Worker void *shmat(int __shmid, const void *__shmaddr, int __shmflg) {
69*08b48e0bSAndroid Build Coastguard Worker
70*08b48e0bSAndroid Build Coastguard Worker (void)__shmflg;
71*08b48e0bSAndroid Build Coastguard Worker int size;
72*08b48e0bSAndroid Build Coastguard Worker void *ptr;
73*08b48e0bSAndroid Build Coastguard Worker
74*08b48e0bSAndroid Build Coastguard Worker size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL);
75*08b48e0bSAndroid Build Coastguard Worker if (size < 0) { return NULL; }
76*08b48e0bSAndroid Build Coastguard Worker
77*08b48e0bSAndroid Build Coastguard Worker ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0);
78*08b48e0bSAndroid Build Coastguard Worker if (ptr == MAP_FAILED) { return NULL; }
79*08b48e0bSAndroid Build Coastguard Worker
80*08b48e0bSAndroid Build Coastguard Worker return ptr;
81*08b48e0bSAndroid Build Coastguard Worker
82*08b48e0bSAndroid Build Coastguard Worker }
83*08b48e0bSAndroid Build Coastguard Worker
84*08b48e0bSAndroid Build Coastguard Worker #endif /* !_ANDROID_ASHMEM_H */
85*08b48e0bSAndroid Build Coastguard Worker #endif /* !__ANDROID__ */
86*08b48e0bSAndroid Build Coastguard Worker
87