/* Copyright (c) 2007-2010 iMatix Corporation This file is part of 0MQ. 0MQ is free software; you can redistribute it and/or modify it under the terms of the Lesser GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 0MQ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public License for more details. You should have received a copy of the Lesser GNU General Public License along with this program. If not, see . */ #ifndef __ZMQ_MSG_STORE_HPP_INCLUDED__ #define __ZMQ_MSG_STORE_HPP_INCLUDED__ #include "../include/zmq.h" #include #include "stdint.hpp" namespace zmq { // This class implements a message store. Messages are retrieved from // the store in the same order as they entered it. class msg_store_t { public: enum { default_block_size = 8192 }; // Creates message store. msg_store_t (int64_t filesize_, size_t block_size_ = default_block_size); ~msg_store_t (); int init (); // Stores the message into the message store. The function // returns false if the message store is full; true otherwise. bool store (zmq_msg_t *msg_); // Fetches the oldest message from the message store. It is an error // to call this function when the message store is empty. void fetch (zmq_msg_t *msg_); void commit (); void rollback (); // Returns true if the message store is empty; false otherwise. bool empty (); // Returns true if and only if the store is full. bool full (); private: // Copies data from a memory buffer to the backing file. // Wraps around when reaching maximum file size. void copy_from_file (void *buffer_, size_t count_); // Copies data from the backing file to the memory buffer. // Wraps around when reaching end-of-file. void copy_to_file (const void *buffer_, size_t count_); // Returns the buffer space available. int64_t buffer_space (); void fill_buf (char *buf, int64_t pos); void save_write_buf (); // File descriptor to the backing file. int fd; // Name of the backing file. std::string filename; // Maximum size of the backing file. int64_t filesize; // File offset associated with the fd file descriptor. int64_t file_pos; // File offset the next message will be stored at. int64_t write_pos; // File offset the next message will be read from. int64_t read_pos; int64_t commit_pos; size_t block_size; char *buf1; char *buf2; char *read_buf; char *write_buf; int64_t write_buf_start_addr; }; } #endif