2 * shmem.c - Shared memory allocation
4 * based on mpg123's xfermem.c by
5 * Oliver Fromme <oliver.fromme@heim3.tu-clausthal.de>
6 * Sun Apr 6 02:26:26 MET DST 1997
11 #if defined(USE_STREAM_CACHE) && !defined(WIN32)
18 #include <sys/types.h>
21 #ifdef HAVE_SYS_MMAN_H
23 #elif defined(__BEOS__)
26 #include <sys/socket.h>
32 #include <sys/select.h>
40 #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
41 #define MAP_ANON MAP_ANONYMOUS
44 static int shmem_type
=0;
46 void* shmem_alloc(int size
){
48 static int devzero
= -1;
51 case 0: // ========= MAP_ANON|MAP_SHARED ==========
53 p
=mmap(0,size
,PROT_READ
|PROT_WRITE
,MAP_ANON
|MAP_SHARED
,-1,0);
54 if(p
==MAP_FAILED
) break; // failed
55 mp_dbg(MSGT_OSDEP
, MSGL_DBG2
, "shmem: %d bytes allocated using mmap anon (%p)\n",size
,p
);
58 // system does not support MAP_ANON at all (e.g. solaris 2.5.1/2.6), just fail
59 mp_dbg(MSGT_OSDEP
, MSGL_DBG3
, "shmem: using mmap anon failed\n");
62 case 1: // ========= MAP_SHARED + /dev/zero ==========
63 if (devzero
== -1 && (devzero
= open("/dev/zero", O_RDWR
, 0)) == -1) break;
64 p
=mmap(0,size
,PROT_READ
|PROT_WRITE
,MAP_SHARED
,devzero
,0);
65 if(p
==MAP_FAILED
) break; // failed
66 mp_dbg(MSGT_OSDEP
, MSGL_DBG2
, "shmem: %d bytes allocated using mmap /dev/zero (%p)\n",size
,p
);
68 case 2: { // ========= shmget() ==========
70 struct shmid_ds shmemds
;
72 if ((shmemid
= shmget(IPC_PRIVATE
, size
, IPC_CREAT
| 0600)) == -1) break;
73 if ((p
= shmat(shmemid
, 0, 0)) == (void *)-1){
74 mp_msg(MSGT_OSDEP
, MSGL_ERR
, "shmem: shmat() failed: %s\n", strerror(errno
));
75 shmctl (shmemid
, IPC_RMID
, &shmemds
);
78 if (shmctl(shmemid
, IPC_RMID
, &shmemds
) == -1) {
79 mp_msg(MSGT_OSDEP
, MSGL_ERR
, "shmem: shmctl() failed: %s\n", strerror(errno
));
80 if (shmdt(p
) == -1) perror ("shmdt()");
83 mp_dbg(MSGT_OSDEP
, MSGL_DBG2
, "shmem: %d bytes allocated using SHM (%p)\n",size
,p
);
86 mp_msg(MSGT_OSDEP
, MSGL_FATAL
, "shmem: no SHM support was compiled in!\n");
91 mp_msg(MSGT_OSDEP
, MSGL_FATAL
,
92 "FATAL: Cannot allocate %d bytes of shared memory :(\n",size
);
99 void shmem_free(void* p
,int size
){
104 mp_msg(MSGT_OSDEP
, MSGL_ERR
, "munmap failed on %p %d bytes: %s\n",
105 p
,size
,strerror(errno
));
111 mp_msg(MSGT_OSDEP
, MSGL_ERR
, "shmfree: shmdt() failed: %s\n",
114 mp_msg(MSGT_OSDEP
, MSGL_ERR
, "shmfree: no SHM support was compiled in!\n");