OLD | NEW |
---|---|
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/shared_memory.h" | 5 #include "base/shared_memory.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <sys/mman.h> | 9 #include <sys/mman.h> |
10 #include <sys/stat.h> | 10 #include <sys/stat.h> |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
187 } | 187 } |
188 | 188 |
189 fp = file_util::OpenFile(mem_filename, mode.c_str()); | 189 fp = file_util::OpenFile(mem_filename, mode.c_str()); |
190 } | 190 } |
191 | 191 |
192 if (fp == NULL) | 192 if (fp == NULL) |
193 return false; | 193 return false; |
194 file_closer.reset(fp); // close when we go out of scope | 194 file_closer.reset(fp); // close when we go out of scope |
195 | 195 |
196 // Make sure the (new) file is the right size. | 196 // Make sure the (new) file is the right size. |
197 // According to the man page, "Use of truncate() to extend a file is | |
198 // not portable." | |
199 if (size && (posix_flags & (O_RDWR | O_CREAT))) { | 197 if (size && (posix_flags & (O_RDWR | O_CREAT))) { |
200 // Get current size. | 198 // Get current size. |
201 size_t current_size = 0; | 199 size_t current_size = 0; |
Mark Mentovai
2009/08/26 01:22:51
While you're here, move the declaration down to wh
pink (ping after 24hrs)
2009/08/26 15:16:57
Done.
| |
202 struct stat stat; | 200 struct stat stat; |
203 if (fstat(fileno(fp), &stat) != 0) | 201 if (fstat(fileno(fp), &stat) != 0) |
204 return false; | 202 return false; |
205 current_size = stat.st_size; | 203 current_size = stat.st_size; |
206 // Possibly grow. | 204 if (current_size != size) { |
207 if (current_size < size) { | 205 if (ftruncate(fileno(fp), size) != 0) |
208 if (fseeko(fp, current_size, SEEK_SET) != 0) | |
209 return false; | 206 return false; |
210 size_t writesize = size - current_size; | 207 if (fseeko(fp, size, SEEK_SET) != 0) |
211 scoped_array<char> buf(new char[writesize]); | |
212 memset(buf.get(), 0, writesize); | |
213 if (fwrite(buf.get(), 1, writesize, fp) != writesize) { | |
214 return false; | |
215 } | |
216 if (fflush(fp) != 0) | |
217 return false; | 208 return false; |
218 } else if (current_size > size) { | |
219 // possibly shrink. | |
220 if ((ftruncate(fileno(fp), size) != 0) || | |
221 (fflush(fp) != 0)) { | |
222 return false; | |
223 } | |
224 } | 209 } |
225 } | 210 } |
226 | 211 |
227 mapped_file_ = dup(fileno(fp)); | 212 mapped_file_ = dup(fileno(fp)); |
228 if (mapped_file_ == -1) { | 213 if (mapped_file_ == -1) { |
229 if (errno == EMFILE) { | 214 if (errno == EMFILE) { |
230 LOG(WARNING) << "Shared memory creation failed; out of file descriptors"; | 215 LOG(WARNING) << "Shared memory creation failed; out of file descriptors"; |
231 return false; | 216 return false; |
232 } else { | 217 } else { |
233 NOTREACHED() << "Call to dup failed, errno=" << errno; | 218 NOTREACHED() << "Call to dup failed, errno=" << errno; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
316 | 301 |
317 void SharedMemory::Unlock() { | 302 void SharedMemory::Unlock() { |
318 LockOrUnlockCommon(F_ULOCK); | 303 LockOrUnlockCommon(F_ULOCK); |
319 } | 304 } |
320 | 305 |
321 SharedMemoryHandle SharedMemory::handle() const { | 306 SharedMemoryHandle SharedMemory::handle() const { |
322 return FileDescriptor(mapped_file_, false); | 307 return FileDescriptor(mapped_file_, false); |
323 } | 308 } |
324 | 309 |
325 } // namespace base | 310 } // namespace base |
OLD | NEW |