| Index: chrome/common/transport_dib.h
|
| diff --git a/chrome/common/transport_dib.h b/chrome/common/transport_dib.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e5fc009e6f4256f0639c31fa246284958d40602e
|
| --- /dev/null
|
| +++ b/chrome/common/transport_dib.h
|
| @@ -0,0 +1,112 @@
|
| +// Copyright (c) 2006-2009 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 CHROME_COMMON_TRANSPORT_DIB_H_
|
| +#define CHROME_COMMON_TRANSPORT_DIB_H_
|
| +
|
| +#include "base/basictypes.h"
|
| +
|
| +#if defined(OS_WIN) || defined(OS_MACOSX)
|
| +#include "base/shared_memory.h"
|
| +#endif
|
| +
|
| +#if defined(OS_WIN)
|
| +#include <windows.h>
|
| +#endif
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// A TransportDIB is a block of memory that is used to transport pixels
|
| +// from the renderer process to the browser.
|
| +// -----------------------------------------------------------------------------
|
| +class TransportDIB {
|
| + public:
|
| + ~TransportDIB();
|
| +
|
| + // Two typedefs are defined. A Handle is the type which can be sent over
|
| + // the wire so that the remote side can map the transport DIB. The Id typedef
|
| + // is sufficient to identify the transport DIB when you know that the remote
|
| + // side already may have it mapped.
|
| +#if defined(OS_WIN)
|
| + typedef HANDLE Handle;
|
| + // On Windows, the Id type includes a sequence number (epoch) to solve an ABA
|
| + // issue:
|
| + // 1) Process A creates a transport DIB with HANDLE=1 and sends to B.
|
| + // 2) Process B maps the transport DIB and caches 1 -> DIB.
|
| + // 3) Process A closes the transport DIB and creates a new one. The new DIB
|
| + // is also assigned HANDLE=1.
|
| + // 4) Process A sends the Handle to B, but B incorrectly believes that it
|
| + // already has it cached.
|
| + struct HandleAndSequenceNum {
|
| + HandleAndSequenceNum()
|
| + : handle(NULL),
|
| + sequence_num(0) {
|
| + }
|
| +
|
| + HandleAndSequenceNum(HANDLE h, uint32 seq_num)
|
| + : handle(h),
|
| + sequence_num(seq_num) {
|
| + }
|
| +
|
| + bool operator< (const HandleAndSequenceNum& other) const {
|
| + if (other.handle < handle)
|
| + return true;
|
| + if (other.sequence_num < sequence_num)
|
| + return true;
|
| + return false;
|
| + }
|
| +
|
| + HANDLE handle;
|
| + uint32 sequence_num;
|
| + };
|
| + typedef HandleAndSequenceNum Id;
|
| +#elif defined(OS_MACOSX)
|
| + typedef base::SharedMemoryHandle Handle;
|
| + // On Mac, the inode number of the backing file is used as an id.
|
| + typedef base::SharedMemoryId Id;
|
| +#elif defined(OS_LINUX)
|
| + typedef int Handle; // These two ints are SysV IPC shared memory keys
|
| + typedef int Id;
|
| +#endif
|
| +
|
| + // Create a new TransportDIB
|
| + // size: the minimum size, in bytes
|
| + // epoch: Windows only: a global counter. See comment above.
|
| + // returns: NULL on failure
|
| + static TransportDIB* Create(size_t size, uint32 sequence_num);
|
| +
|
| + // Map the referenced transport DIB. Returns NULL on failure.
|
| + static TransportDIB* Map(Handle transport_dib);
|
| +
|
| + // Return a pointer to the shared memory
|
| + void* memory() const;
|
| +
|
| + // Return the maximum size of the shared memory. This is not the amount of
|
| + // data which is valid, you have to know that via other means, this is simply
|
| + // the maximum amount that /could/ be valid.
|
| + size_t size() const { return size_; }
|
| +
|
| + // Return the identifier which can be used to refer to this shared memory
|
| + // on the wire.
|
| + Id id() const;
|
| +
|
| + // Return a handle to the underlying shared memory. This can be sent over the
|
| + // wire to give this transport DIB to another process.
|
| + Handle handle() const;
|
| +
|
| + private:
|
| + TransportDIB();
|
| +#if defined(OS_WIN) || defined(OS_MACOSX)
|
| + explicit TransportDIB(base::SharedMemoryHandle dib);
|
| + base::SharedMemory shared_memory_;
|
| + uint32 sequence_num_;
|
| +#elif defined(OS_LINUX)
|
| + int key_; // SysV shared memory id
|
| + void* address_; // mapped address
|
| +#endif
|
| + size_t size_; // length, in bytes
|
| +};
|
| +
|
| +class MessageLoop;
|
| +
|
| +#endif // CHROME_COMMON_TRANSPORT_DIB_H_
|
|
|