Mercurial > mplayer.hg
annotate osdep/shmem.c @ 13394:455a5056801f
New generic 'portable anymap' video output driver. It supports portable
pixmaps and graymaps in both raw and ASCII mode. Besides PPM and PGM, it
can also output PGMYUV files which are PGM files with the U and V plane
appended to the bottom of the Y image (bottom left and bottom right). All
files can be written to the current directory, to a specified output directory
or to multiple subdirectories if the filesystem can't handle the amount of
files in one directory anymore.
Note: This driver is not yet activated and will not be compiled and linked
to libvo. A separate patch will take care of that. This is just for adding
the file to the repository.
author | ivo |
---|---|
date | Mon, 20 Sep 2004 00:54:57 +0000 |
parents | 9e11a478a3bc |
children | c0bde085511c |
rev | line source |
---|---|
1 | 1 /* |
2 * shmem.c - Shared memory allocation | |
3 * | |
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 | |
7 */ | |
8 | |
3008 | 9 #include "../config.h" |
10 | |
10197 | 11 #if defined(USE_STREAM_CACHE) && !defined(WIN32) |
9797 | 12 |
1 | 13 #include <stdio.h> |
14 #include <stdlib.h> | |
15 #include <string.h> | |
16 #include <unistd.h> | |
17 #include <errno.h> | |
18 #include <sys/types.h> | |
19 #include <sys/time.h> | |
20 #include <sys/uio.h> | |
5298 | 21 #ifdef HAVE_SYS_MMAN_H |
1 | 22 #include <sys/mman.h> |
5298 | 23 #endif |
1 | 24 #include <sys/socket.h> |
25 #include <fcntl.h> | |
26 | |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
27 #include "../mp_msg.h" |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
28 |
1 | 29 #ifdef AIX |
30 #include <sys/select.h> | |
31 #endif | |
32 | |
3008 | 33 #ifdef HAVE_SHM |
1 | 34 #include <sys/ipc.h> |
35 #include <sys/shm.h> | |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
36 #endif |
1 | 37 |
38 #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) | |
39 #define MAP_ANON MAP_ANONYMOUS | |
40 #endif | |
41 | |
42 static int shmem_type=0; | |
43 | |
44 void* shmem_alloc(int size){ | |
45 void* p; | |
1347
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
46 static int devzero = -1; |
1 | 47 while(1){ |
48 switch(shmem_type){ | |
49 case 0: // ========= MAP_ANON|MAP_SHARED ========== | |
1347
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
50 #ifdef MAP_ANON |
1 | 51 p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0); |
52 if(p==MAP_FAILED) break; // failed | |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
53 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using mmap anon (%p)\n",size,p); |
1 | 54 return p; |
1347
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
55 #else |
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
56 // system does not support MAP_ANON at all (e.g. solaris 2.5.1/2.6), just fail |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
57 mp_dbg(MSGT_OSDEP, MSGL_DBG3, "shmem: using mmap anon failed\n"); |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
58 #endif |
1347
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
59 break; |
1 | 60 case 1: // ========= MAP_SHARED + /dev/zero ========== |
1347
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
61 if (devzero == -1 && (devzero = open("/dev/zero", O_RDWR, 0)) == -1) break; |
1 | 62 p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,devzero,0); |
63 if(p==MAP_FAILED) break; // failed | |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
64 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using mmap /dev/zero (%p)\n",size,p); |
1 | 65 return p; |
3280 | 66 case 2: { // ========= shmget() ========== |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
67 #ifdef HAVE_SHM |
1 | 68 struct shmid_ds shmemds; |
69 int shmemid; | |
70 if ((shmemid = shmget(IPC_PRIVATE, size, IPC_CREAT | 0600)) == -1) break; | |
6162
0e56fbf9039a
applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents:
5298
diff
changeset
|
71 if ((p = shmat(shmemid, 0, 0)) == (void *)-1){ |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
72 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmem: shmat() failed: %s\n", strerror(errno)); |
1 | 73 shmctl (shmemid, IPC_RMID, &shmemds); |
74 break; | |
75 } | |
76 if (shmctl(shmemid, IPC_RMID, &shmemds) == -1) { | |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
77 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmem: shmctl() failed: %s\n", strerror(errno)); |
1 | 78 if (shmdt(p) == -1) perror ("shmdt()"); |
79 break; | |
80 } | |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
81 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using SHM (%p)\n",size,p); |
1 | 82 return p; |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
83 #else |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
84 mp_msg(MSGT_OSDEP, MSGL_FATAL, "shmem: no SHM support was compiled in!\n"); |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
85 return(NULL); |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
86 #endif |
3280 | 87 } |
1 | 88 default: |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
89 mp_msg(MSGT_OSDEP, MSGL_FATAL, |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
90 "FATAL: Cannot allocate %d bytes of shared memory :(\n",size); |
1 | 91 return NULL; |
92 } | |
93 ++shmem_type; | |
94 } | |
95 } | |
96 | |
9914 | 97 void shmem_free(void* p,int size){ |
1 | 98 switch(shmem_type){ |
9914 | 99 case 0: |
100 case 1: | |
101 if(munmap(p,size)) { | |
102 mp_msg(MSGT_OSDEP, MSGL_ERR, "munmap failed on %p %d bytes: %s\n", | |
103 p,size,strerror(errno)); | |
104 } | |
105 break; | |
1 | 106 case 2: |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
107 #ifdef HAVE_SHM |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
108 if (shmdt(p) == -1) |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
109 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmfree: shmdt() failed: %s\n", |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
110 strerror(errno)); |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
111 #else |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
112 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmfree: no SHM support was compiled in!\n"); |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
113 #endif |
1 | 114 break; |
115 } | |
116 } | |
9797 | 117 |
118 #endif |