15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#ifndef LIBRARIES_NACL_IO_FIFO_PACKET_H_ 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define LIBRARIES_NACL_IO_FIFO_PACKET_H_ 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <string.h> 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <list> 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "nacl_io/fifo_interface.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "sdk_util/macros.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace nacl_io { 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class Packet; 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// FIFOPacket 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// A FIFOPackiet is linked list of packets. Data is stored and returned 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// in packet size increments. FIFOPacket signals EMPTY where there are 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// no packets, and FULL when the total bytes of all packets meets or 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// exceeds the max size hint. 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FIFOPacket : public FIFOInterface { 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) explicit FIFOPacket(size_t size); 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~FIFOPacket(); 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool IsEmpty(); 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool IsFull(); 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool Resize(size_t len); 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) size_t ReadAvailable(); 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) size_t WriteAvailable(); 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Return a pointer to the top packet without releasing ownership. 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Packet* PeekPacket(); 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Relinquish top packet, and remove it from the FIFO. 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Packet* ReadPacket(); 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Take ownership of packet and place it in the FIFO. 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void WritePacket(Packet* packet); 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::list<Packet*> packets_; 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uint32_t max_bytes_; 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uint32_t cur_bytes_; 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FIFOPacket); 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace nacl_io 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // LIBRARIES_NACL_IO_FIFO_PACKET_H_ 59