Mercurial > mplayer.hg
comparison osdep/mmap-os2.c @ 26076:c4d1f32ca1a4
mmap() support for OS/2
patch by KO Myung-Hun, komh chollian net
author | diego |
---|---|
date | Wed, 27 Feb 2008 22:29:52 +0000 |
parents | |
children | 9fc9d1e788aa |
comparison
equal
deleted
inserted
replaced
26075:c88de0066c55 | 26076:c4d1f32ca1a4 |
---|---|
1 /* | |
2 * very simple implementation of mmap() for OS/2 | |
3 * | |
4 * Copyright (c) 2008 KO Myung-Hun (komh@chollian.net) | |
5 * | |
6 * This file is part of MPlayer. | |
7 * | |
8 * MPlayer is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * MPlayer is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License along | |
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
21 */ | |
22 | |
23 #define INCL_DOS | |
24 #include <os2.h> | |
25 | |
26 #include <stdio.h> | |
27 #include <stdlib.h> | |
28 #include <io.h> | |
29 #include <sys/types.h> | |
30 | |
31 #include "config.h" | |
32 #include "mmap.h" | |
33 #include "mmap_anon.h" | |
34 | |
35 typedef struct os2_mmap_s | |
36 { | |
37 void *addr; | |
38 size_t len; | |
39 int flags; | |
40 struct os2_mmap_s *prev; | |
41 struct os2_mmap_s *next; | |
42 } os2_mmap; | |
43 static os2_mmap *m_mmap = NULL; | |
44 | |
45 void *mmap( void *addr, size_t len, int prot, int flags, int fildes, off_t off ) | |
46 { | |
47 os2_mmap *new_mmap; | |
48 | |
49 ULONG fl; | |
50 ULONG rc; | |
51 | |
52 void *ret; | |
53 | |
54 if( prot & PROT_WRITE ) | |
55 { | |
56 if( flags & MAP_SHARED ) | |
57 return MAP_FAILED; | |
58 | |
59 if( !( flags & MAP_PRIVATE )) | |
60 return MAP_FAILED; | |
61 } | |
62 | |
63 if( flags & MAP_FIXED ) | |
64 { | |
65 ULONG cb; | |
66 | |
67 cb = len; | |
68 rc = DosQueryMem( addr, &cb, &fl ); | |
69 if( rc || ( cb < len )) | |
70 return MAP_FAILED; | |
71 | |
72 rc = DosSetMem( addr, len, fPERM ); | |
73 if( rc ) | |
74 return MAP_FAILED; | |
75 | |
76 ret = addr; | |
77 } | |
78 else | |
79 { | |
80 // Allocate tiled memory compatible with 16-bit selectors | |
81 // 'fs_seg' in 'ldt_keeper.c' need this attribute | |
82 rc = DosAllocMem( &ret, len, fALLOC ); | |
83 if( rc ) | |
84 return MAP_FAILED; | |
85 } | |
86 | |
87 new_mmap = ( os2_mmap * )malloc( sizeof( os2_mmap )); | |
88 new_mmap->addr = ret; | |
89 new_mmap->len = len; | |
90 new_mmap->flags = flags; | |
91 new_mmap->prev = m_mmap; | |
92 new_mmap->next = NULL; | |
93 | |
94 if( m_mmap ) | |
95 m_mmap->next = new_mmap; | |
96 m_mmap = new_mmap; | |
97 | |
98 if( !( flags & MAP_ANON )) | |
99 { | |
100 int pos; | |
101 | |
102 /* Now read in the file */ | |
103 if(( pos = lseek( fildes, off, SEEK_SET )) == -1) | |
104 { | |
105 munmap( ret, len ); | |
106 | |
107 return MAP_FAILED; | |
108 } | |
109 | |
110 read( fildes, ret, len ); | |
111 lseek( fildes, pos, SEEK_SET ); /* Restore the file pointer */ | |
112 } | |
113 | |
114 fl = 0; | |
115 | |
116 if( prot & PROT_READ ) | |
117 fl |= PAG_READ; | |
118 | |
119 if( prot & PROT_WRITE ) | |
120 fl |= PAG_WRITE; | |
121 | |
122 if( prot & PROT_EXEC ) | |
123 fl |= PAG_EXECUTE; | |
124 | |
125 if( prot & PROT_NONE ) | |
126 fl |= PAG_GUARD; | |
127 | |
128 rc = DosSetMem( ret, len, fl ); | |
129 if( rc ) | |
130 { | |
131 munmap( ret, len ); | |
132 | |
133 return MAP_FAILED; | |
134 } | |
135 | |
136 return ret; | |
137 } | |
138 | |
139 int munmap( void *addr, size_t len ) | |
140 { | |
141 os2_mmap *mm; | |
142 | |
143 for( mm = m_mmap; mm; mm = mm->prev ) | |
144 { | |
145 if( mm->addr == addr ) | |
146 break; | |
147 } | |
148 | |
149 if( mm ) | |
150 { | |
151 | |
152 if( !( mm->flags & MAP_FIXED )) | |
153 DosFreeMem( addr ); | |
154 | |
155 if( mm->next ) | |
156 mm->next->prev = mm->prev; | |
157 | |
158 if( mm->prev ) | |
159 mm->prev->next = mm->next; | |
160 | |
161 if( m_mmap == mm ) | |
162 m_mmap = mm->prev; | |
163 | |
164 free( mm ); | |
165 | |
166 return 0; | |
167 } | |
168 | |
169 return -1; | |
170 } | |
171 | |
172 int mprotect( void *addr, size_t len, int prot ) | |
173 { | |
174 os2_mmap *mm; | |
175 | |
176 for( mm = m_mmap; mm; mm = mm->prev ) | |
177 { | |
178 if( mm->addr == addr ) | |
179 break; | |
180 } | |
181 | |
182 if( mm ) | |
183 { | |
184 ULONG fl; | |
185 | |
186 fl = 0; | |
187 | |
188 if( prot & PROT_READ ) | |
189 fl |= PAG_READ; | |
190 | |
191 if( prot & PROT_WRITE ) | |
192 fl |= PAG_WRITE; | |
193 | |
194 if( prot & PROT_EXEC ) | |
195 fl |= PAG_EXECUTE; | |
196 | |
197 if( prot & PROT_NONE ) | |
198 fl |= PAG_GUARD; | |
199 | |
200 if( DosSetMem( addr, len, fl ) == 0 ) | |
201 return 0; | |
202 } | |
203 | |
204 return -1; | |
205 } | |
206 | |
207 void *mmap_anon( void *addr, size_t len, int prot, int flags, off_t off ) | |
208 { | |
209 return mmap( addr, len, prot, flags | MAP_ANON, -1, off ); | |
210 } |