summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/Platform/win/SharedMemoryWin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/Platform/win/SharedMemoryWin.cpp')
-rw-r--r--Source/WebKit2/Platform/win/SharedMemoryWin.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/Source/WebKit2/Platform/win/SharedMemoryWin.cpp b/Source/WebKit2/Platform/win/SharedMemoryWin.cpp
index ef83de7..50985e7 100644
--- a/Source/WebKit2/Platform/win/SharedMemoryWin.cpp
+++ b/Source/WebKit2/Platform/win/SharedMemoryWin.cpp
@@ -136,8 +136,7 @@ static DWORD accessRights(SharedMemory::Protection protection)
case SharedMemory::ReadOnly:
return FILE_MAP_READ;
case SharedMemory::ReadWrite:
- // FILE_MAP_WRITE implies read access, too.
- return FILE_MAP_WRITE;
+ return FILE_MAP_READ | FILE_MAP_WRITE;
}
ASSERT_NOT_REACHED();
@@ -146,23 +145,32 @@ static DWORD accessRights(SharedMemory::Protection protection)
PassRefPtr<SharedMemory> SharedMemory::create(const Handle& handle, Protection protection)
{
- if (handle.isNull())
+ RefPtr<SharedMemory> memory = adopt(handle.m_handle, handle.m_size, protection);
+ if (!memory)
+ return 0;
+
+ // The SharedMemory object now owns the HANDLE.
+ handle.m_handle = 0;
+
+ return memory.release();
+}
+
+PassRefPtr<SharedMemory> SharedMemory::adopt(HANDLE handle, size_t size, Protection protection)
+{
+ if (!handle)
return 0;
DWORD desiredAccess = accessRights(protection);
- void* baseAddress = ::MapViewOfFile(handle.m_handle, desiredAccess, 0, 0, handle.m_size);
+ void* baseAddress = ::MapViewOfFile(handle, desiredAccess, 0, 0, size);
ASSERT_WITH_MESSAGE(baseAddress, "::MapViewOfFile failed with error %lu", ::GetLastError());
if (!baseAddress)
return 0;
RefPtr<SharedMemory> memory = adoptRef(new SharedMemory);
- memory->m_size = handle.m_size;
+ memory->m_size = size;
memory->m_data = baseAddress;
-
- // Adopt the HANDLE.
- memory->m_handle = handle.m_handle;
- handle.m_handle = 0;
+ memory->m_handle = handle;
return memory.release();
}