Mercurial > mplayer.hg
annotate osdep/shmem.c @ 35334:3397976a029b
stream ftp: readline: Always initialize output parameter buf
Only exception if passed parameter max is less than or equal
to zero. That cannot happen with the current code.
Additionally change readresp function to always copy the first
response line if the parameter rsp is non-NULL. This fixes some
error reporting that used uninitialized stack arrays.
author | al |
---|---|
date | Tue, 20 Nov 2012 22:16:29 +0000 |
parents | d5e1a1ad86b8 |
children |
rev | line source |
---|---|
1 | 1 /* |
28744 | 2 * shared memory allocation |
3 * | |
4 * based on mpg123's xfermem.c by | |
5 * Oliver Fromme <oliver.fromme@heim3.tu-clausthal.de> | |
6 * | |
7 * This file is part of MPlayer. | |
8 * | |
9 * MPlayer is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * MPlayer is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU General Public License along | |
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
1 | 22 */ |
23 | |
16985 | 24 #include "config.h" |
3008 | 25 |
1 | 26 #include <stdio.h> |
27 #include <stdlib.h> | |
28 #include <string.h> | |
29 #include <unistd.h> | |
30 #include <errno.h> | |
31 #include <sys/types.h> | |
32 #include <sys/time.h> | |
33 #include <sys/uio.h> | |
33412
2a2e9b6551d8
configure: Convert HAVE_SYS_MMAN_H into a 0/1 definition.
diego
parents:
30554
diff
changeset
|
34 #if HAVE_SYS_MMAN_H |
1 | 35 #include <sys/mman.h> |
5298 | 36 #endif |
1 | 37 #include <sys/socket.h> |
38 #include <fcntl.h> | |
34711 | 39 #include <inttypes.h> |
1 | 40 |
16985 | 41 #include "mp_msg.h" |
30554 | 42 #include "shmem.h" |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
43 |
1 | 44 #ifdef AIX |
45 #include <sys/select.h> | |
46 #endif | |
47 | |
3008 | 48 #ifdef HAVE_SHM |
1 | 49 #include <sys/ipc.h> |
50 #include <sys/shm.h> | |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
51 #endif |
1 | 52 |
53 #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) | |
54 #define MAP_ANON MAP_ANONYMOUS | |
55 #endif | |
56 | |
57 static int shmem_type=0; | |
58 | |
34704 | 59 void* shmem_alloc(int64_t size){ |
1 | 60 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
|
61 static int devzero = -1; |
34704 | 62 if (size > SIZE_MAX) { |
63 mp_msg(MSGT_OSDEP, MSGL_FATAL, | |
64 "Shared memory allocation larger than system max. allocation size.\n"); | |
65 return NULL; | |
66 } | |
1 | 67 while(1){ |
68 switch(shmem_type){ | |
69 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
|
70 #ifdef MAP_ANON |
1 | 71 p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0); |
72 if(p==MAP_FAILED) break; // failed | |
34704 | 73 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %"PRId64" bytes allocated using mmap anon (%p)\n",size,p); |
1 | 74 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
|
75 #else |
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
76 // 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
|
77 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
|
78 #endif |
1347
448d1bf28f5a
Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents:
498
diff
changeset
|
79 break; |
1 | 80 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
|
81 if (devzero == -1 && (devzero = open("/dev/zero", O_RDWR, 0)) == -1) break; |
1 | 82 p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,devzero,0); |
83 if(p==MAP_FAILED) break; // failed | |
34704 | 84 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %"PRId64" bytes allocated using mmap /dev/zero (%p)\n",size,p); |
1 | 85 return p; |
3280 | 86 case 2: { // ========= shmget() ========== |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
87 #ifdef HAVE_SHM |
1 | 88 struct shmid_ds shmemds; |
89 int shmemid; | |
90 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
|
91 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
|
92 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmem: shmat() failed: %s\n", strerror(errno)); |
1 | 93 shmctl (shmemid, IPC_RMID, &shmemds); |
94 break; | |
95 } | |
96 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
|
97 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmem: shmctl() failed: %s\n", strerror(errno)); |
1 | 98 if (shmdt(p) == -1) perror ("shmdt()"); |
99 break; | |
100 } | |
34704 | 101 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %"PRId64" bytes allocated using SHM (%p)\n",size,p); |
1 | 102 return p; |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
103 #else |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
104 mp_msg(MSGT_OSDEP, MSGL_FATAL, "shmem: no SHM support was compiled in!\n"); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
21855
diff
changeset
|
105 return NULL; |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
106 #endif |
3280 | 107 } |
1 | 108 default: |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
109 mp_msg(MSGT_OSDEP, MSGL_FATAL, |
34704 | 110 "FATAL: Cannot allocate %"PRId64" bytes of shared memory :(\n",size); |
1 | 111 return NULL; |
112 } | |
113 ++shmem_type; | |
114 } | |
115 } | |
116 | |
34704 | 117 void shmem_free(void* p,int64_t size){ |
1 | 118 switch(shmem_type){ |
9914 | 119 case 0: |
120 case 1: | |
121 if(munmap(p,size)) { | |
34704 | 122 mp_msg(MSGT_OSDEP, MSGL_ERR, "munmap failed on %p %"PRId64" bytes: %s\n", |
9914 | 123 p,size,strerror(errno)); |
124 } | |
125 break; | |
1 | 126 case 2: |
3084
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
127 #ifdef HAVE_SHM |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
128 if (shmdt(p) == -1) |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
129 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
|
130 strerror(errno)); |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
131 #else |
a3f947d5f847
converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents:
3008
diff
changeset
|
132 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
|
133 #endif |
1 | 134 break; |
135 } | |
136 } |