diff options
Diffstat (limited to 'indra/llplugin/llpluginsharedmemory.cpp')
-rw-r--r-- | indra/llplugin/llpluginsharedmemory.cpp | 526 |
1 files changed, 263 insertions, 263 deletions
diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp index 3204bbd715..b7efc0aa48 100644 --- a/indra/llplugin/llpluginsharedmemory.cpp +++ b/indra/llplugin/llpluginsharedmemory.cpp @@ -1,4 +1,4 @@ -/** +/** * @file llpluginsharedmemory.cpp * LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API. * @@ -6,21 +6,21 @@ * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ * @endcond @@ -31,48 +31,48 @@ #include "llpluginsharedmemory.h" // on Mac and Linux, we use the native shm_open/mmap interface by using -// #define USE_SHM_OPEN_SHARED_MEMORY 1 +// #define USE_SHM_OPEN_SHARED_MEMORY 1 // in the appropriate sections below. // For Windows, use: -// #define USE_WIN32_SHARED_MEMORY 1 +// #define USE_WIN32_SHARED_MEMORY 1 // If we ever want to fall back to the apr implementation for a platform, use: -// #define USE_APR_SHARED_MEMORY 1 +// #define USE_APR_SHARED_MEMORY 1 #if LL_WINDOWS -// #define USE_APR_SHARED_MEMORY 1 - #define USE_WIN32_SHARED_MEMORY 1 +// #define USE_APR_SHARED_MEMORY 1 + #define USE_WIN32_SHARED_MEMORY 1 #elif LL_DARWIN - #define USE_SHM_OPEN_SHARED_MEMORY 1 + #define USE_SHM_OPEN_SHARED_MEMORY 1 #elif _POSIX_SHARED_MEMORY_OBJECTS == -1 - #define USE_APR_SHARED_MEMORY 1 + #define USE_APR_SHARED_MEMORY 1 #elif LL_LINUX - #define USE_SHM_OPEN_SHARED_MEMORY 1 + #define USE_SHM_OPEN_SHARED_MEMORY 1 #elif LL_FREEBSD - #define USE_SHM_OPEN_SHARED_MEMORY 1 + #define USE_SHM_OPEN_SHARED_MEMORY 1 #endif // FIXME: This path thing is evil and unacceptable. #if LL_WINDOWS - #define APR_SHARED_MEMORY_PREFIX_STRING "C:\\LLPlugin_" - // Apparnently using the "Global\\" prefix here only works from administrative accounts under Vista. - // Other options I've seen referenced are "Local\\" and "Session\\". - #define WIN32_SHARED_MEMORY_PREFIX_STRING "Local\\LL_" + #define APR_SHARED_MEMORY_PREFIX_STRING "C:\\LLPlugin_" + // Apparnently using the "Global\\" prefix here only works from administrative accounts under Vista. + // Other options I've seen referenced are "Local\\" and "Session\\". + #define WIN32_SHARED_MEMORY_PREFIX_STRING "Local\\LL_" #else - // mac and linux - #define APR_SHARED_MEMORY_PREFIX_STRING "/tmp/LLPlugin_" - #define SHM_OPEN_SHARED_MEMORY_PREFIX_STRING "/LL" + // mac and linux + #define APR_SHARED_MEMORY_PREFIX_STRING "/tmp/LLPlugin_" + #define SHM_OPEN_SHARED_MEMORY_PREFIX_STRING "/LL" #endif -#if USE_APR_SHARED_MEMORY - #include "llapr.h" - #include "apr_shm.h" +#if USE_APR_SHARED_MEMORY + #include "llapr.h" + #include "apr_shm.h" #elif USE_SHM_OPEN_SHARED_MEMORY - #include <sys/fcntl.h> - #include <sys/mman.h> - #include <errno.h> + #include <sys/fcntl.h> + #include <sys/mman.h> + #include <errno.h> #elif USE_WIN32_SHARED_MEMORY #include <windows.h> #endif // USE_APR_SHARED_MEMORY @@ -82,17 +82,17 @@ int LLPluginSharedMemory::sSegmentNumber = 0; std::string LLPluginSharedMemory::createName(void) { - std::stringstream newname; + std::stringstream newname; #if LL_WINDOWS - newname << GetCurrentProcessId(); + newname << GetCurrentProcessId(); #else // LL_WINDOWS - newname << getpid(); + newname << getpid(); #endif // LL_WINDOWS - - newname << "_" << sSegmentNumber++; - - return newname.str(); + + newname << "_" << sSegmentNumber++; + + return newname.str(); } /** @@ -102,15 +102,15 @@ std::string LLPluginSharedMemory::createName(void) class LLPluginSharedMemoryPlatformImpl { public: - LLPluginSharedMemoryPlatformImpl(); - ~LLPluginSharedMemoryPlatformImpl(); - + LLPluginSharedMemoryPlatformImpl(); + ~LLPluginSharedMemoryPlatformImpl(); + #if USE_APR_SHARED_MEMORY - apr_shm_t* mAprSharedMemory; + apr_shm_t* mAprSharedMemory; #elif USE_SHM_OPEN_SHARED_MEMORY - int mSharedMemoryFD; + int mSharedMemoryFD; #elif USE_WIN32_SHARED_MEMORY - HANDLE mMapFile; + HANDLE mMapFile; #endif }; @@ -120,11 +120,11 @@ public: */ LLPluginSharedMemory::LLPluginSharedMemory() { - mSize = 0; - mMappedAddress = NULL; - mNeedsDestroy = false; + mSize = 0; + mMappedAddress = NULL; + mNeedsDestroy = false; - mImpl = new LLPluginSharedMemoryPlatformImpl; + mImpl = new LLPluginSharedMemoryPlatformImpl; } /** @@ -132,14 +132,14 @@ LLPluginSharedMemory::LLPluginSharedMemory() */ LLPluginSharedMemory::~LLPluginSharedMemory() { - if(mNeedsDestroy) - destroy(); - else - detach(); - - unlink(); - - delete mImpl; + if(mNeedsDestroy) + destroy(); + else + detach(); + + unlink(); + + delete mImpl; } #if USE_APR_SHARED_MEMORY @@ -147,106 +147,106 @@ LLPluginSharedMemory::~LLPluginSharedMemory() LLPluginSharedMemoryPlatformImpl::LLPluginSharedMemoryPlatformImpl() { - mAprSharedMemory = NULL; + mAprSharedMemory = NULL; } LLPluginSharedMemoryPlatformImpl::~LLPluginSharedMemoryPlatformImpl() { - + } bool LLPluginSharedMemory::map(void) { - mMappedAddress = apr_shm_baseaddr_get(mImpl->mAprSharedMemory); - if(mMappedAddress == NULL) - { - return false; - } - - return true; + mMappedAddress = apr_shm_baseaddr_get(mImpl->mAprSharedMemory); + if(mMappedAddress == NULL) + { + return false; + } + + return true; } bool LLPluginSharedMemory::unmap(void) { - // This is a no-op under apr. - return true; + // This is a no-op under apr. + return true; } bool LLPluginSharedMemory::close(void) { - // This is a no-op under apr. - return true; + // This is a no-op under apr. + return true; } bool LLPluginSharedMemory::unlink(void) { - // This is a no-op under apr. - return true; + // This is a no-op under apr. + return true; } bool LLPluginSharedMemory::create(size_t size) { - mName = APR_SHARED_MEMORY_PREFIX_STRING; - mName += createName(); - mSize = size; - - apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), gAPRPoolp ); - - if(ll_apr_warn_status(status)) - { - return false; - } + mName = APR_SHARED_MEMORY_PREFIX_STRING; + mName += createName(); + mSize = size; + + apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), gAPRPoolp ); + + if(ll_apr_warn_status(status)) + { + return false; + } - mNeedsDestroy = true; - - return map(); + mNeedsDestroy = true; + + return map(); } bool LLPluginSharedMemory::destroy(void) { - if(mImpl->mAprSharedMemory) - { - apr_status_t status = apr_shm_destroy(mImpl->mAprSharedMemory); - if(ll_apr_warn_status(status)) - { - // TODO: Is this a fatal error? I think not... - } - mImpl->mAprSharedMemory = NULL; - } - - return true; + if(mImpl->mAprSharedMemory) + { + apr_status_t status = apr_shm_destroy(mImpl->mAprSharedMemory); + if(ll_apr_warn_status(status)) + { + // TODO: Is this a fatal error? I think not... + } + mImpl->mAprSharedMemory = NULL; + } + + return true; } bool LLPluginSharedMemory::attach(const std::string &name, size_t size) { - mName = name; - mSize = size; - - apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), gAPRPoolp ); - - if(ll_apr_warn_status(status)) - { - return false; - } + mName = name; + mSize = size; + + apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), gAPRPoolp ); - return map(); + if(ll_apr_warn_status(status)) + { + return false; + } + + return map(); } bool LLPluginSharedMemory::detach(void) { - if(mImpl->mAprSharedMemory) - { - apr_status_t status = apr_shm_detach(mImpl->mAprSharedMemory); - if(ll_apr_warn_status(status)) - { - // TODO: Is this a fatal error? I think not... - } - mImpl->mAprSharedMemory = NULL; - } - - return true; + if(mImpl->mAprSharedMemory) + { + apr_status_t status = apr_shm_detach(mImpl->mAprSharedMemory); + if(ll_apr_warn_status(status)) + { + // TODO: Is this a fatal error? I think not... + } + mImpl->mAprSharedMemory = NULL; + } + + return true; } @@ -255,7 +255,7 @@ bool LLPluginSharedMemory::detach(void) LLPluginSharedMemoryPlatformImpl::LLPluginSharedMemoryPlatformImpl() { - mSharedMemoryFD = -1; + mSharedMemoryFD = -1; } LLPluginSharedMemoryPlatformImpl::~LLPluginSharedMemoryPlatformImpl() @@ -264,119 +264,119 @@ LLPluginSharedMemoryPlatformImpl::~LLPluginSharedMemoryPlatformImpl() bool LLPluginSharedMemory::map(void) { - mMappedAddress = ::mmap(NULL, mSize, PROT_READ | PROT_WRITE, MAP_SHARED, mImpl->mSharedMemoryFD, 0); - if(mMappedAddress == NULL) - { - return false; - } - - LL_DEBUGS("Plugin") << "memory mapped at " << mMappedAddress << LL_ENDL; + mMappedAddress = ::mmap(NULL, mSize, PROT_READ | PROT_WRITE, MAP_SHARED, mImpl->mSharedMemoryFD, 0); + if(mMappedAddress == NULL) + { + return false; + } - return true; + LL_DEBUGS("Plugin") << "memory mapped at " << mMappedAddress << LL_ENDL; + + return true; } bool LLPluginSharedMemory::unmap(void) { - if(mMappedAddress != NULL) - { - LL_DEBUGS("Plugin") << "calling munmap(" << mMappedAddress << ", " << mSize << ")" << LL_ENDL; - if(::munmap(mMappedAddress, mSize) == -1) - { - // TODO: Is this a fatal error? I think not... - } - - mMappedAddress = NULL; - } + if(mMappedAddress != NULL) + { + LL_DEBUGS("Plugin") << "calling munmap(" << mMappedAddress << ", " << mSize << ")" << LL_ENDL; + if(::munmap(mMappedAddress, mSize) == -1) + { + // TODO: Is this a fatal error? I think not... + } + + mMappedAddress = NULL; + } - return true; + return true; } bool LLPluginSharedMemory::close(void) { - if(mImpl->mSharedMemoryFD != -1) - { - LL_DEBUGS("Plugin") << "calling close(" << mImpl->mSharedMemoryFD << ")" << LL_ENDL; - if(::close(mImpl->mSharedMemoryFD) == -1) - { - // TODO: Is this a fatal error? I think not... - } - - mImpl->mSharedMemoryFD = -1; - } - return true; + if(mImpl->mSharedMemoryFD != -1) + { + LL_DEBUGS("Plugin") << "calling close(" << mImpl->mSharedMemoryFD << ")" << LL_ENDL; + if(::close(mImpl->mSharedMemoryFD) == -1) + { + // TODO: Is this a fatal error? I think not... + } + + mImpl->mSharedMemoryFD = -1; + } + return true; } bool LLPluginSharedMemory::unlink(void) { - if(!mName.empty()) - { - if(::shm_unlink(mName.c_str()) == -1) - { - return false; - } - } - - return true; + if(!mName.empty()) + { + if(::shm_unlink(mName.c_str()) == -1) + { + return false; + } + } + + return true; } bool LLPluginSharedMemory::create(size_t size) { - mName = SHM_OPEN_SHARED_MEMORY_PREFIX_STRING; - mName += createName(); - mSize = size; - - // Preemptive unlink, just in case something didn't get cleaned up. - unlink(); - - mImpl->mSharedMemoryFD = ::shm_open(mName.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); - if(mImpl->mSharedMemoryFD == -1) - { - return false; - } - - mNeedsDestroy = true; - - if(::ftruncate(mImpl->mSharedMemoryFD, mSize) == -1) - { - return false; - } - - - return map(); + mName = SHM_OPEN_SHARED_MEMORY_PREFIX_STRING; + mName += createName(); + mSize = size; + + // Preemptive unlink, just in case something didn't get cleaned up. + unlink(); + + mImpl->mSharedMemoryFD = ::shm_open(mName.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); + if(mImpl->mSharedMemoryFD == -1) + { + return false; + } + + mNeedsDestroy = true; + + if(::ftruncate(mImpl->mSharedMemoryFD, mSize) == -1) + { + return false; + } + + + return map(); } bool LLPluginSharedMemory::destroy(void) { - unmap(); - close(); - - return true; + unmap(); + close(); + + return true; } bool LLPluginSharedMemory::attach(const std::string &name, size_t size) { - mName = name; - mSize = size; + mName = name; + mSize = size; + + mImpl->mSharedMemoryFD = ::shm_open(mName.c_str(), O_RDWR, S_IRUSR | S_IWUSR); + if(mImpl->mSharedMemoryFD == -1) + { + return false; + } + + // unlink here so the segment will be cleaned up automatically after the last close. + unlink(); - mImpl->mSharedMemoryFD = ::shm_open(mName.c_str(), O_RDWR, S_IRUSR | S_IWUSR); - if(mImpl->mSharedMemoryFD == -1) - { - return false; - } - - // unlink here so the segment will be cleaned up automatically after the last close. - unlink(); - - return map(); + return map(); } bool LLPluginSharedMemory::detach(void) { - unmap(); - close(); - return true; + unmap(); + close(); + return true; } #elif USE_WIN32_SHARED_MEMORY @@ -386,119 +386,119 @@ bool LLPluginSharedMemory::detach(void) LLPluginSharedMemoryPlatformImpl::LLPluginSharedMemoryPlatformImpl() { - mMapFile = NULL; + mMapFile = NULL; } LLPluginSharedMemoryPlatformImpl::~LLPluginSharedMemoryPlatformImpl() { - + } bool LLPluginSharedMemory::map(void) { - mMappedAddress = MapViewOfFile( - mImpl->mMapFile, // handle to map object - FILE_MAP_ALL_ACCESS, // read/write permission - 0, - 0, - mSize); - - if(mMappedAddress == NULL) - { - LL_WARNS("Plugin") << "MapViewOfFile failed: " << GetLastError() << LL_ENDL; - return false; - } - - LL_DEBUGS("Plugin") << "memory mapped at " << mMappedAddress << LL_ENDL; + mMappedAddress = MapViewOfFile( + mImpl->mMapFile, // handle to map object + FILE_MAP_ALL_ACCESS, // read/write permission + 0, + 0, + mSize); + + if(mMappedAddress == NULL) + { + LL_WARNS("Plugin") << "MapViewOfFile failed: " << GetLastError() << LL_ENDL; + return false; + } - return true; + LL_DEBUGS("Plugin") << "memory mapped at " << mMappedAddress << LL_ENDL; + + return true; } bool LLPluginSharedMemory::unmap(void) { - if(mMappedAddress != NULL) - { - UnmapViewOfFile(mMappedAddress); - mMappedAddress = NULL; - } + if(mMappedAddress != NULL) + { + UnmapViewOfFile(mMappedAddress); + mMappedAddress = NULL; + } - return true; + return true; } bool LLPluginSharedMemory::close(void) { - if(mImpl->mMapFile != NULL) - { - CloseHandle(mImpl->mMapFile); - mImpl->mMapFile = NULL; - } - - return true; + if(mImpl->mMapFile != NULL) + { + CloseHandle(mImpl->mMapFile); + mImpl->mMapFile = NULL; + } + + return true; } bool LLPluginSharedMemory::unlink(void) { - // This is a no-op on Windows. - return true; + // This is a no-op on Windows. + return true; } bool LLPluginSharedMemory::create(size_t size) { - mName = WIN32_SHARED_MEMORY_PREFIX_STRING; - mName += createName(); - mSize = size; + mName = WIN32_SHARED_MEMORY_PREFIX_STRING; + mName += createName(); + mSize = size; + + mImpl->mMapFile = CreateFileMappingA( + INVALID_HANDLE_VALUE, // use paging file + NULL, // default security + PAGE_READWRITE, // read/write access + 0, // max. object size + mSize, // buffer size + mName.c_str()); // name of mapping object - mImpl->mMapFile = CreateFileMappingA( - INVALID_HANDLE_VALUE, // use paging file - NULL, // default security - PAGE_READWRITE, // read/write access - 0, // max. object size - mSize, // buffer size - mName.c_str()); // name of mapping object + if(mImpl->mMapFile == NULL) + { + LL_WARNS("Plugin") << "CreateFileMapping failed: " << GetLastError() << LL_ENDL; + return false; + } - if(mImpl->mMapFile == NULL) - { - LL_WARNS("Plugin") << "CreateFileMapping failed: " << GetLastError() << LL_ENDL; - return false; - } + mNeedsDestroy = true; - mNeedsDestroy = true; - - return map(); + return map(); } bool LLPluginSharedMemory::destroy(void) { - unmap(); - close(); - return true; + unmap(); + close(); + return true; } bool LLPluginSharedMemory::attach(const std::string &name, size_t size) { - mName = name; - mSize = size; + mName = name; + mSize = size; + + mImpl->mMapFile = OpenFileMappingA( + FILE_MAP_ALL_ACCESS, // read/write access + FALSE, // do not inherit the name + mName.c_str()); // name of mapping object + + if(mImpl->mMapFile == NULL) + { + LL_WARNS("Plugin") << "OpenFileMapping failed: " << GetLastError() << LL_ENDL; + return false; + } - mImpl->mMapFile = OpenFileMappingA( - FILE_MAP_ALL_ACCESS, // read/write access - FALSE, // do not inherit the name - mName.c_str()); // name of mapping object - - if(mImpl->mMapFile == NULL) - { - LL_WARNS("Plugin") << "OpenFileMapping failed: " << GetLastError() << LL_ENDL; - return false; - } - - return map(); + return map(); } bool LLPluginSharedMemory::detach(void) { - unmap(); - close(); - return true; + unmap(); + close(); + return true; } |