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

Side by Side Diff: sandbox/src/shared_handles.h

Issue 10783004: Move Windows Sandbox, trybots version (don't commit me!) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase to top of tree Created 8 years, 5 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sandbox/src/service_resolver_unittest.cc ('k') | sandbox/src/shared_handles.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 #ifndef SANDBOX_SRC_SHARED_HANDLES_H__
6 #define SANDBOX_SRC_SHARED_HANDLES_H__
7
8 #include "base/basictypes.h"
9
10 #ifndef HANDLE
11 // We can provide our own windows compatilble handle definition, but
12 // in general we want to rely on the client of this api to include
13 // the proper windows headers. Note that we don't want to bring the
14 // whole <windows.h> into scope if we don't have to.
15 typedef void* HANDLE;
16 #endif
17
18 namespace sandbox {
19
20 // SharedHandles is a simple class to stash and find windows object handles
21 // given a raw block of memory which is shared between two processes.
22 // It addresses the need to communicate a handle value between two windows
23 // processes given that they are already sharing some memory.
24 //
25 // This class is not exposed directly to users of the sanbox API, instead
26 // we expose the wrapper methods TargetProcess::TransferHandle( ) and
27 // TargetServices::GetTransferHandle()
28 //
29 // Use it for a small number of items, since internaly uses linear seach
30 //
31 // The use is very simple. Given a shared memory between proces A and B:
32 // process A:
33 // HANDLE handle = SomeFunction(..);
34 // SharedHandles shared_handes;
35 // shared_handles.Init(memory)
36 // shared_handles.SetHandle(3, handle);
37 //
38 // process B:
39 // SharedHandles shared_handes;
40 // shared_handles.Init(memory)
41 // HANDLE handle = shared_handles.GetHandle(3);
42 //
43 // Note that '3' in this example is a unique id, that must be agreed before
44 // transfer
45 //
46 // Note2: While this class can be used in a single process, there are
47 // better alternatives such as STL
48 //
49 // Note3: Under windows a kernel object handle in one process does not
50 // make sense for another process unless there is a DuplicateHandle( )
51 // call involved which this class DOES NOT do that for you.
52 //
53 // Note4: Under windows, shared memory when created is initialized to
54 // zeros always. If you are not using shared memory it is your responsability
55 // to zero it for the setter process and to copy it to the getter process.
56 class SharedHandles {
57 public:
58 SharedHandles();
59
60 // Initializes the shared memory for use.
61 // Pass the shared memory base and size. It will internally compute
62 // how many handles can it store. If initialization fails the return value
63 // is false.
64 bool Init(void* raw_mem, size_t size_bytes);
65
66 // Sets a handle in the shared memory for transfer.
67 // Parameters:
68 // tag : an integer, different from zero that uniquely identfies the
69 // handle to transfer.
70 // handle: the handle value associated with 'tag' to tranfer
71 // Returns false if there is not enough space in the shared memory for
72 // this handle.
73 bool SetHandle(uint32 tag, HANDLE handle);
74
75 // Gets a handle previously stored by SetHandle.
76 // Parameters:
77 // tag: an integer different from zero that uniquely identfies the handle
78 // to retrieve.
79 // *handle: output handle value if the call was succesful.
80 // If a handle with the provided tag is not found the return value is false.
81 // If the tag is found the return value is true.
82 bool GetHandle(uint32 tag, HANDLE* handle);
83
84 private:
85 // A single item is the tuple handle/tag
86 struct SharedItem {
87 uint32 tag;
88 void* item;
89 };
90
91 // SharedMem is used to layout the memory as an array of SharedItems
92 struct SharedMem {
93 size_t max_items;
94 SharedItem* items;
95 };
96
97 // Finds an Item tuple provided the handle tag.
98 // Uses linear search because we expect the number of handles to be
99 // small (say less than ~100).
100 SharedItem* FindByTag(uint32 tag);
101
102 SharedMem shared_;
103 DISALLOW_COPY_AND_ASSIGN(SharedHandles);
104 };
105
106 } // namespace sandbox
107
108 #endif // SANDBOX_SRC_SHARED_HANDLES_H__
OLDNEW
« no previous file with comments | « sandbox/src/service_resolver_unittest.cc ('k') | sandbox/src/shared_handles.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698