mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-08 00:38:39 +09:00
import FIREFOX_52_6_0esr_RELEASE from mozilla-esr52 hg repo
This commit is contained in:
commit
dcd9973243
150858 changed files with 23884658 additions and 0 deletions
145
ipc/unixsocket/DataSocket.h
Normal file
145
ipc/unixsocket/DataSocket.h
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#ifndef mozilla_ipc_datasocket_h
|
||||
#define mozilla_ipc_datasocket_h
|
||||
|
||||
#include "mozilla/ipc/SocketBase.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace ipc {
|
||||
|
||||
//
|
||||
// DataSocket
|
||||
//
|
||||
|
||||
/**
|
||||
* |DataSocket| represents a socket that can send or receive data. This
|
||||
* can be a stream-based socket, a datagram-based socket, or any other
|
||||
* socket that transfers data.
|
||||
*/
|
||||
class DataSocket : public SocketBase
|
||||
{
|
||||
public:
|
||||
virtual ~DataSocket();
|
||||
|
||||
/**
|
||||
* Queue data to be sent to the socket on the IO thread. Can only be called on
|
||||
* originating thread.
|
||||
*
|
||||
* @param aBuffer Data to be sent to socket
|
||||
*/
|
||||
virtual void SendSocketData(UnixSocketIOBuffer* aBuffer) = 0;
|
||||
|
||||
protected:
|
||||
DataSocket();
|
||||
};
|
||||
|
||||
//
|
||||
// DataSocketIO
|
||||
//
|
||||
|
||||
/**
|
||||
* |DataSocketIO| is a base class for Socket I/O classes that
|
||||
* transfer data on the I/O thread. It provides methods for the
|
||||
* most common read and write scenarios.
|
||||
*/
|
||||
class DataSocketIO : public SocketIOBase
|
||||
{
|
||||
public:
|
||||
virtual ~DataSocketIO();
|
||||
|
||||
/**
|
||||
* Allocates a buffer for receiving data from the socket. The method
|
||||
* shall return the buffer in the arguments. The buffer is owned by the
|
||||
* I/O class. |DataSocketIO| will never ask for more than one buffer
|
||||
* at a time, so I/O classes can handout the same buffer on each invokation
|
||||
* of this method. I/O-thread only.
|
||||
*
|
||||
* @param[out] aBuffer returns a pointer to the I/O buffer
|
||||
* @return NS_OK on success, or an error code otherwise
|
||||
*/
|
||||
virtual nsresult QueryReceiveBuffer(UnixSocketIOBuffer** aBuffer) = 0;
|
||||
|
||||
/**
|
||||
* Marks the current socket buffer to by consumed by the I/O class. The
|
||||
* class is resonsible for releasing the buffer afterwards. I/O-thread
|
||||
* only.
|
||||
*
|
||||
* @param aIndex the socket's index
|
||||
* @param[out] aBuffer the receive buffer
|
||||
* @param[out] aSize the receive buffer's size
|
||||
*/
|
||||
virtual void ConsumeBuffer() = 0;
|
||||
|
||||
/**
|
||||
* Marks the current socket buffer to be discarded. The I/O class is
|
||||
* resonsible for releasing the buffer's memory. I/O-thread only.
|
||||
*
|
||||
* @param aIndex the socket's index
|
||||
*/
|
||||
virtual void DiscardBuffer() = 0;
|
||||
|
||||
void EnqueueData(UnixSocketIOBuffer* aBuffer);
|
||||
bool HasPendingData() const;
|
||||
|
||||
ssize_t ReceiveData(int aFd);
|
||||
|
||||
nsresult SendPendingData(int aFd);
|
||||
|
||||
protected:
|
||||
DataSocketIO(MessageLoop* aConsumerLoop);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Raw data queue. Must be pushed/popped from I/O thread only.
|
||||
*/
|
||||
nsTArray<UnixSocketIOBuffer*> mOutgoingQ;
|
||||
};
|
||||
|
||||
//
|
||||
// Tasks
|
||||
//
|
||||
|
||||
/* |SocketIOSendTask| transfers an instance of |Tdata|, such as
|
||||
* |UnixSocketRawData|, to the I/O thread and queues it up for
|
||||
* sending the contained data.
|
||||
*/
|
||||
template<typename Tio, typename Tdata>
|
||||
class SocketIOSendTask final : public SocketIOTask<Tio>
|
||||
{
|
||||
public:
|
||||
SocketIOSendTask(Tio* aIO, Tdata* aData)
|
||||
: SocketIOTask<Tio>(aIO)
|
||||
, mData(aData)
|
||||
{
|
||||
MOZ_ASSERT(aData);
|
||||
}
|
||||
|
||||
NS_IMETHOD Run() override
|
||||
{
|
||||
MOZ_ASSERT(!SocketIOTask<Tio>::IsCanceled());
|
||||
|
||||
Tio* io = SocketIOTask<Tio>::GetIO();
|
||||
MOZ_ASSERT(!io->IsConsumerThread());
|
||||
MOZ_ASSERT(!io->IsShutdownOnIOThread());
|
||||
|
||||
io->Send(mData);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
Tdata* mData;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue