annotate linux/shmem.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 542f7c228e38
children 7bb8ded875db
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2 * shmem.c - Shared memory allocation
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
3 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4 * based on mpg123's xfermem.c by
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5 * Oliver Fromme <oliver.fromme@heim3.tu-clausthal.de>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
6 * Sun Apr 6 02:26:26 MET DST 1997
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8
3008
8687599be101 #ifdef HAVE_SHM
alex
parents: 1347
diff changeset
9 #include "../config.h"
8687599be101 #ifdef HAVE_SHM
alex
parents: 1347
diff changeset
10
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 #include <stdio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 #include <stdlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 #include <string.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14 #include <unistd.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 #include <errno.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16 #include <sys/types.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 #include <sys/time.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 #include <sys/uio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 #include <sys/mman.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20 #include <sys/socket.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21 #include <fcntl.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
23 #include "../mp_msg.h"
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
24
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25 #ifdef AIX
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26 #include <sys/select.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28
3008
8687599be101 #ifdef HAVE_SHM
alex
parents: 1347
diff changeset
29 #ifdef HAVE_SHM
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30 #include <sys/ipc.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 #include <sys/shm.h>
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
32 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34 #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 #define MAP_ANON MAP_ANONYMOUS
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 static int shmem_type=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 void* shmem_alloc(int size){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 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
42 static int devzero = -1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 while(1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 switch(shmem_type){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 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
46 #ifdef MAP_ANON
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 if(p==MAP_FAILED) break; // failed
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
49 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using mmap anon (%p)\n",size,p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 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
51 #else
448d1bf28f5a Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents: 498
diff changeset
52 // 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
53 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
54 #endif
1347
448d1bf28f5a Solaris 2.6 and older do not support MAP_ANON, just fail the mmap MAP_ANON
jkeil
parents: 498
diff changeset
55 break;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 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
57 if (devzero == -1 && (devzero = open("/dev/zero", O_RDWR, 0)) == -1) break;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 p=mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,devzero,0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 if(p==MAP_FAILED) break; // failed
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
60 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using mmap /dev/zero (%p)\n",size,p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 return p;
3280
542f7c228e38 undef HAVE_SHM compilation bug fixed
alex
parents: 3084
diff changeset
62 case 2: { // ========= shmget() ==========
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
63 #ifdef HAVE_SHM
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 struct shmid_ds shmemds;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 int shmemid;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 if ((shmemid = shmget(IPC_PRIVATE, size, IPC_CREAT | 0600)) == -1) break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 if ((int)(p = shmat(shmemid, 0, 0)) == -1){
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
68 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmem: shmat() failed: %s\n", strerror(errno));
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 shmctl (shmemid, IPC_RMID, &shmemds);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 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
73 mp_msg(MSGT_OSDEP, MSGL_ERR, "shmem: shmctl() failed: %s\n", strerror(errno));
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 if (shmdt(p) == -1) perror ("shmdt()");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 }
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
77 mp_dbg(MSGT_OSDEP, MSGL_DBG2, "shmem: %d bytes allocated using SHM (%p)\n",size,p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 return p;
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
79 #else
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
80 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
81 return(NULL);
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
82 #endif
3280
542f7c228e38 undef HAVE_SHM compilation bug fixed
alex
parents: 3084
diff changeset
83 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 default:
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
85 mp_msg(MSGT_OSDEP, MSGL_FATAL,
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
86 "FATAL: Cannot allocate %d bytes of shared memory :(\n",size);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 return NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 ++shmem_type;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 void shmem_free(void* p){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 switch(shmem_type){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 case 2:
3084
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
96 #ifdef HAVE_SHM
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
97 if (shmdt(p) == -1)
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
98 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
99 strerror(errno));
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
100 #else
a3f947d5f847 converted to mp_msg and fixed my previous HAVE_SHM bug
alex
parents: 3008
diff changeset
101 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
102 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 }