| Index: sandbox/win/src/sharedmem_ipc_client.h
|
| diff --git a/sandbox/win/src/sharedmem_ipc_client.h b/sandbox/win/src/sharedmem_ipc_client.h
|
| deleted file mode 100644
|
| index 67fd0635970f15cd45270141f146036756b7c983..0000000000000000000000000000000000000000
|
| --- a/sandbox/win/src/sharedmem_ipc_client.h
|
| +++ /dev/null
|
| @@ -1,139 +0,0 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef SANDBOX_SRC_SHAREDMEM_IPC_CLIENT_H__
|
| -#define SANDBOX_SRC_SHAREDMEM_IPC_CLIENT_H__
|
| -
|
| -#include <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include "sandbox/win/src/crosscall_params.h"
|
| -#include "sandbox/win/src/sandbox.h"
|
| -
|
| -// IPC transport implementation that uses shared memory.
|
| -// This is the client side
|
| -//
|
| -// The shared memory is divided on blocks called channels, and potentially
|
| -// it can perform as many concurrent IPC calls as channels. The IPC over
|
| -// each channel is strictly synchronous for the client.
|
| -//
|
| -// Each channel as a channel control section associated with. Each control
|
| -// section has two kernel events (known as ping and pong) and a integer
|
| -// variable that maintains a state
|
| -//
|
| -// this is the state diagram of a channel:
|
| -//
|
| -// locked in service
|
| -// kFreeChannel---------->BusyChannel-------------->kAckChannel
|
| -// ^ |
|
| -// |_________________________________________________|
|
| -// answer ready
|
| -//
|
| -// The protocol is as follows:
|
| -// 1) client finds a free channel: state = kFreeChannel
|
| -// 2) does an atomic compare-and-swap, now state = BusyChannel
|
| -// 3) client writes the data into the channel buffer
|
| -// 4) client signals the ping event and waits (blocks) on the pong event
|
| -// 5) eventually the server signals the pong event
|
| -// 6) the client awakes and reads the answer from the same channel
|
| -// 7) the client updates its InOut parameters with the new data from the
|
| -// shared memory section.
|
| -// 8) the client atomically sets the state = kFreeChannel
|
| -//
|
| -// In the shared memory the layout is as follows:
|
| -//
|
| -// [ channel count ]
|
| -// [ channel control 0]
|
| -// [ channel control 1]
|
| -// [ channel control N]
|
| -// [ channel buffer 0 ] 1024 bytes
|
| -// [ channel buffer 1 ] 1024 bytes
|
| -// [ channel buffer N ] 1024 bytes
|
| -//
|
| -// By default each channel buffer is 1024 bytes
|
| -namespace sandbox {
|
| -
|
| -// the possible channel states as described above
|
| -enum ChannelState {
|
| - // channel is free
|
| - kFreeChannel = 1,
|
| - // IPC in progress client side
|
| - kBusyChannel,
|
| - // IPC in progress server side
|
| - kAckChannel,
|
| - // not used right now
|
| - kReadyChannel,
|
| - // IPC abandoned by client side
|
| - kAbandonedChannel
|
| -};
|
| -
|
| -// The next two constants control the time outs for the IPC.
|
| -const DWORD kIPCWaitTimeOut1 = 1000; // Milliseconds.
|
| -const DWORD kIPCWaitTimeOut2 = 50; // Milliseconds.
|
| -
|
| -// the channel control structure
|
| -struct ChannelControl {
|
| - // points to be beginning of the channel buffer, where data goes
|
| - size_t channel_base;
|
| - // maintains the state from the ChannelState enumeration
|
| - volatile LONG state;
|
| - // the ping event is signaled by the client when the IPC data is ready on
|
| - // the buffer
|
| - HANDLE ping_event;
|
| - // the client waits on the pong event for the IPC answer back
|
| - HANDLE pong_event;
|
| - // the IPC unique identifier
|
| - uint32_t ipc_tag;
|
| -};
|
| -
|
| -struct IPCControl {
|
| - // total number of channels available, some might be busy at a given time
|
| - size_t channels_count;
|
| - // handle to a shared mutex to detect when the server is dead
|
| - HANDLE server_alive;
|
| - // array of channel control structures
|
| - ChannelControl channels[1];
|
| -};
|
| -
|
| -// the actual shared memory IPC implementation class. This object is designed
|
| -// to be lightweight so it can be constructed on-site (at the calling place)
|
| -// wherever an IPC call is needed.
|
| -class SharedMemIPCClient {
|
| - public:
|
| - // Creates the IPC client.
|
| - // as parameter it takes the base address of the shared memory
|
| - explicit SharedMemIPCClient(void* shared_mem);
|
| -
|
| - // locks a free channel and returns the channel buffer memory base. This call
|
| - // blocks until there is a free channel
|
| - void* GetBuffer();
|
| -
|
| - // releases the lock on the channel, for other to use. call this if you have
|
| - // called GetBuffer and you want to abort but have not called yet DoCall()
|
| - void FreeBuffer(void* buffer);
|
| -
|
| - // Performs the actual IPC call.
|
| - // params: The blob of packed input parameters.
|
| - // answer: upon IPC completion, it contains the server answer to the IPC.
|
| - // If the return value is not SBOX_ERROR_CHANNEL_ERROR, the caller has to free
|
| - // the channel.
|
| - // returns ALL_OK if the IPC mechanism successfully delivered. You still need
|
| - // to check on the answer structure to see the actual IPC result.
|
| - ResultCode DoCall(CrossCallParams* params, CrossCallReturn* answer);
|
| -
|
| - private:
|
| - // Returns the index of the first free channel. It sets 'severe_failure'
|
| - // to true if there is an unrecoverable error that does not allow to
|
| - // find a channel.
|
| - size_t LockFreeChannel(bool* severe_failure);
|
| - // Return the channel index given the address of the buffer.
|
| - size_t ChannelIndexFromBuffer(const void* buffer);
|
| - IPCControl* control_;
|
| - // point to the first channel base
|
| - char* first_base_;
|
| -};
|
| -
|
| -} // namespace sandbox
|
| -
|
| -#endif // SANDBOX_SRC_SHAREDMEM_IPC_CLIENT_H__
|
|
|