| 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 |