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 #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__ | |
OLD | NEW |