| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string.h> | 5 #include <string.h> |
| 6 #include "sandbox/win/src/sharedmem_ipc_client.h" | 6 #include "sandbox/win/src/sharedmem_ipc_client.h" |
| 7 #include "sandbox/win/src/sandbox.h" | 7 #include "sandbox/win/src/sandbox.h" |
| 8 #include "sandbox/win/src/crosscall_client.h" | 8 #include "sandbox/win/src/crosscall_client.h" |
| 9 #include "sandbox/win/src/crosscall_params.h" | 9 #include "sandbox/win/src/crosscall_params.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 control_->channels[ix].channel_base; | 24 control_->channels[ix].channel_base; |
| 25 } | 25 } |
| 26 | 26 |
| 27 // If we need to cancel an IPC before issuing DoCall | 27 // If we need to cancel an IPC before issuing DoCall |
| 28 // our client should call FreeBuffer with the same pointer | 28 // our client should call FreeBuffer with the same pointer |
| 29 // returned by GetBuffer. | 29 // returned by GetBuffer. |
| 30 void SharedMemIPCClient::FreeBuffer(void* buffer) { | 30 void SharedMemIPCClient::FreeBuffer(void* buffer) { |
| 31 size_t num = ChannelIndexFromBuffer(buffer); | 31 size_t num = ChannelIndexFromBuffer(buffer); |
| 32 ChannelControl* channel = control_->channels; | 32 ChannelControl* channel = control_->channels; |
| 33 LONG result = ::InterlockedExchange(&channel[num].state, kFreeChannel); | 33 LONG result = ::InterlockedExchange(&channel[num].state, kFreeChannel); |
| 34 DCHECK(kFreeChannel != result); | 34 DCHECK_NE(kFreeChannel, static_cast<ChannelState>(result)); |
| 35 result; | 35 result; |
| 36 } | 36 } |
| 37 | 37 |
| 38 // The constructor simply casts the shared memory to the internal | 38 // The constructor simply casts the shared memory to the internal |
| 39 // structures. This is a cheap step that is why this IPC object can | 39 // structures. This is a cheap step that is why this IPC object can |
| 40 // and should be constructed per call. | 40 // and should be constructed per call. |
| 41 SharedMemIPCClient::SharedMemIPCClient(void* shared_mem) | 41 SharedMemIPCClient::SharedMemIPCClient(void* shared_mem) |
| 42 : control_(reinterpret_cast<IPCControl*>(shared_mem)) { | 42 : control_(reinterpret_cast<IPCControl*>(shared_mem)) { |
| 43 first_base_ = reinterpret_cast<char*>(shared_mem) + | 43 first_base_ = reinterpret_cast<char*>(shared_mem) + |
| 44 control_->channels[0].channel_base; | 44 control_->channels[0].channel_base; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 return 0; | 138 return 0; |
| 139 } | 139 } |
| 140 } | 140 } |
| 141 while (true); | 141 while (true); |
| 142 } | 142 } |
| 143 | 143 |
| 144 // Find out which channel we are from the pointer returned by GetBuffer. | 144 // Find out which channel we are from the pointer returned by GetBuffer. |
| 145 size_t SharedMemIPCClient::ChannelIndexFromBuffer(const void* buffer) { | 145 size_t SharedMemIPCClient::ChannelIndexFromBuffer(const void* buffer) { |
| 146 ptrdiff_t d = reinterpret_cast<const char*>(buffer) - first_base_; | 146 ptrdiff_t d = reinterpret_cast<const char*>(buffer) - first_base_; |
| 147 size_t num = d/kIPCChannelSize; | 147 size_t num = d/kIPCChannelSize; |
| 148 DCHECK(num < control_->channels_count); | 148 DCHECK_LT(num, control_->channels_count); |
| 149 return (num); | 149 return (num); |
| 150 } | 150 } |
| 151 | 151 |
| 152 } // namespace sandbox | 152 } // namespace sandbox |
| OLD | NEW |