| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ppapi/proxy/image_data.h" | |
| 6 | |
| 7 #if defined(OS_LINUX) | |
| 8 #include <sys/shm.h> | |
| 9 #endif | |
| 10 | |
| 11 #if defined(OS_MACOSX) | |
| 12 #include <sys/stat.h> | |
| 13 #include <sys/mman.h> | |
| 14 #endif | |
| 15 | |
| 16 namespace pp { | |
| 17 namespace proxy { | |
| 18 | |
| 19 ImageData::ImageData(PP_Instance instance, | |
| 20 const PP_ImageDataDesc& desc, | |
| 21 ImageHandle handle) | |
| 22 : PluginResource(instance), | |
| 23 desc_(desc), | |
| 24 handle_(handle), | |
| 25 mapped_data_(NULL) { | |
| 26 } | |
| 27 | |
| 28 ImageData::~ImageData() { | |
| 29 Unmap(); | |
| 30 } | |
| 31 | |
| 32 ImageData* ImageData::AsImageData() { | |
| 33 return this; | |
| 34 } | |
| 35 | |
| 36 void* ImageData::Map() { | |
| 37 #if defined(OS_WIN) | |
| 38 NOTIMPLEMENTED(); | |
| 39 return NULL; | |
| 40 #elif defined(OS_MACOSX) | |
| 41 struct stat st; | |
| 42 if (fstat(handle_.fd, &st) != 0) | |
| 43 return NULL; | |
| 44 void* memory = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, | |
| 45 MAP_SHARED, handle_.fd, 0); | |
| 46 if (memory == MAP_FAILED) | |
| 47 return NULL; | |
| 48 mapped_data_ = memory; | |
| 49 return mapped_data_; | |
| 50 #else | |
| 51 int shmkey = handle_; | |
| 52 void* address = shmat(shmkey, NULL, 0); | |
| 53 // Mark for deletion in case we crash so the kernel will clean it up. | |
| 54 shmctl(shmkey, IPC_RMID, 0); | |
| 55 if (address == (void*)-1) | |
| 56 return NULL; | |
| 57 mapped_data_ = address; | |
| 58 return address; | |
| 59 #endif | |
| 60 } | |
| 61 | |
| 62 void ImageData::Unmap() { | |
| 63 #if defined(OS_WIN) | |
| 64 NOTIMPLEMENTED(); | |
| 65 #elif defined(OS_MACOSX) | |
| 66 if (mapped_data_) { | |
| 67 struct stat st; | |
| 68 if (fstat(handle_.fd, &st) == 0) | |
| 69 munmap(mapped_data_, st.st_size); | |
| 70 } | |
| 71 #else | |
| 72 if (mapped_data_) | |
| 73 shmdt(mapped_data_); | |
| 74 #endif | |
| 75 mapped_data_ = NULL; | |
| 76 } | |
| 77 | |
| 78 #if defined(OS_WIN) | |
| 79 const ImageHandle ImageData::NullHandle = NULL; | |
| 80 #elif defined(OS_MACOSX) | |
| 81 const ImageHandle ImageData::NullHandle = ImageHandle(); | |
| 82 #else | |
| 83 const ImageHandle ImageData::NullHandle = 0; | |
| 84 #endif | |
| 85 | |
| 86 ImageHandle ImageData::HandleFromInt(int32_t i) { | |
| 87 #if defined(OS_WIN) | |
| 88 return reinterpret_cast<ImageHandle>(i); | |
| 89 #elif defined(OS_MACOSX) | |
| 90 return ImageHandle(i, false); | |
| 91 #else | |
| 92 return static_cast<ImageHandle>(i); | |
| 93 #endif | |
| 94 } | |
| 95 | |
| 96 } // namespace proxy | |
| 97 } // namespace pp | |
| OLD | NEW |