Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Unified Diff: base/shared_memory_unittest.cc

Issue 19724: Properly honor base::SharedMemory semantics for name="" to mean... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/shared_memory_posix.cc ('k') | base/shared_memory_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/shared_memory_unittest.cc
===================================================================
--- base/shared_memory_unittest.cc (revision 8817)
+++ base/shared_memory_unittest.cc (working copy)
@@ -4,6 +4,7 @@
#include "base/basictypes.h"
#include "base/platform_thread.h"
+#include "base/scoped_nsautorelease_pool.h"
#include "base/shared_memory.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -21,12 +22,17 @@
explicit MultipleThreadMain(int16 id) : id_(id) {}
~MultipleThreadMain() {}
+ static void CleanUp() {
+ SharedMemory memory;
+ memory.Delete(test_name_);
+ }
+
// PlatformThread::Delegate interface.
void ThreadMain() {
+ ScopedNSAutoreleasePool pool; // noop if not OSX
const int kDataSize = 1024;
- std::wstring test_name = L"SharedMemoryOpenThreadTest";
SharedMemory memory;
- bool rv = memory.Create(test_name, false, true, kDataSize);
+ bool rv = memory.Create(test_name_, false, true, kDataSize);
EXPECT_TRUE(rv);
rv = memory.Map(kDataSize);
EXPECT_TRUE(rv);
@@ -45,9 +51,16 @@
private:
int16 id_;
+ static const std::wstring test_name_;
+
DISALLOW_COPY_AND_ASSIGN(MultipleThreadMain);
};
+const std::wstring MultipleThreadMain::test_name_ = L"SharedMemoryOpenThreadTest";
+
+// TODO(port):
+// This test requires the ability to pass file descriptors between processes.
+// We haven't done that yet in Chrome for POSIX.
#if defined(OS_WIN)
// Each thread will open the shared memory. Each thread will take the memory,
// and keep changing it while trying to lock it, with some small pauses in
@@ -104,7 +117,11 @@
// Open two handles to a memory segment, confirm that they are mapped
// separately yet point to the same space.
SharedMemory memory1;
- bool rv = memory1.Open(test_name, false);
+ bool rv = memory1.Delete(test_name);
+ EXPECT_TRUE(rv);
+ rv = memory1.Delete(test_name);
+ EXPECT_TRUE(rv);
+ rv = memory1.Open(test_name, false);
EXPECT_FALSE(rv);
rv = memory1.Create(test_name, false, false, kDataSize);
EXPECT_TRUE(rv);
@@ -134,12 +151,17 @@
// Close the second memory segment.
memory2.Close();
+
+ rv = memory1.Delete(test_name);
+ EXPECT_TRUE(rv);
+ rv = memory2.Delete(test_name);
+ EXPECT_TRUE(rv);
}
-#if defined(OS_WIN)
// Create a set of 5 threads to each open a shared memory segment and write to
// it. Verify that they are always reading/writing consistent data.
TEST(SharedMemoryTest, MultipleThreads) {
+ MultipleThreadMain::CleanUp();
PlatformThreadHandle thread_handles[kNumThreads];
MultipleThreadMain* thread_delegates[kNumThreads];
@@ -156,8 +178,15 @@
PlatformThread::Join(thread_handles[index]);
delete thread_delegates[index];
}
+
+ MultipleThreadMain::CleanUp();
}
+// TODO(port): this test requires the MultipleLockThread class
+// (defined above), which requires the ability to pass file
+// descriptors between processes. We haven't done that yet in Chrome
+// for POSIX.
+#if defined(OS_WIN)
// Create a set of threads to each open a shared memory segment and write to it
// with the lock held. Verify that they are always reading/writing consistent
// data.
@@ -181,4 +210,51 @@
}
#endif
+// Allocate private (unique) shared memory with an empty string for a
+// name. Make sure several of them don't point to the same thing as
+// we might expect if the names are equal.
+TEST(SharedMemoryTest, AnonymousPrivate) {
+ int i, j;
+ int count = 4;
+ bool rv;
+ const int kDataSize = 8192;
+
+ SharedMemory* memories = new SharedMemory[count];
+ int **pointers = new int*[count];
+ ASSERT_TRUE(memories);
+ ASSERT_TRUE(pointers);
+
+ for (i = 0; i < count; i++) {
+ rv = memories[i].Create(L"", false, true, kDataSize);
+ EXPECT_TRUE(rv);
+ rv = memories[i].Map(kDataSize);
+ EXPECT_TRUE(rv);
+ int *ptr = static_cast<int*>(memories[i].memory());
+ EXPECT_TRUE(ptr);
+ pointers[i] = ptr;
+ }
+
+ for (i = 0; i < count; i++) {
+ // zero out the first int in each except for i; for that one, make it 100.
+ for (j = 0; j < count; j++) {
+ if (i == j)
+ pointers[j][0] = 100;
+ else
+ pointers[j][0] = 0;
+ }
+ // make sure there is no bleeding of the 100 into the other pointers
+ for (j = 0; j < count; j++) {
+ if (i == j)
+ EXPECT_EQ(100, pointers[j][0]);
+ else
+ EXPECT_EQ(0, pointers[j][0]);
+ }
+ }
+
+ for (int i = 0; i < count; i++) {
+ memories[i].Close();
+ }
+}
+
+
} // namespace base
« no previous file with comments | « base/shared_memory_posix.cc ('k') | base/shared_memory_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698