#ifndef __XRDXROOTDGSTREAM_HH_
#define __XRDXROOTDGSTREAM_HH_
/******************************************************************************/
/* */
/* X r d X r o o t G S t r e a m . h h */
/* */
/* (c) 2019 by the Board of Trustees of the Leland Stanford, Jr., University */
/* All Rights Reserved */
/* Produced by Andrew Hanushevsky for Stanford University under contract */
/* DE-AC02-76-SFO0515 with the Department of Energy */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD 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 GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
#include
//-----------------------------------------------------------------------------
//! This class implements a generic reporter for the XRootD monitoring stream,
//! also known as the G-Stream. It is passed to various plugins when monitoring
//! is enabled to allow plugins to add monitoring information into the G-Stream.
//-----------------------------------------------------------------------------
class XrdXrootdGSReal;
class XrdXrootdGStream
{
public:
//-----------------------------------------------------------------------------
//! Flush any pending monitoring messages to the data collector. Also, see
//! the related SetAutoFlush() method.
//-----------------------------------------------------------------------------
void Flush();
//-----------------------------------------------------------------------------
//! Obtain a dictionary ID to map a string to an integer ID. The mapping is
//! automatically sent to the monitor collector for future use using the
//! 'd' or 'i' mapping identifier.
//!
//! @param text -> the null terminated string to be assigned an ID. The
//! text must be less than or equal to 1024 characters.
//! @param isPath when true the text specified a file system path and
//! identified as a XROOTD_MON_MAPPATH item. Otherwise,
//! it is identified as a XROOTD_MON_MAPINFO item.
//!
//! @return the integer identifier assigned to the string information. The
//! returned value is in network byte order!
//-----------------------------------------------------------------------------
uint32_t GetDictID(const char *text, bool isPath=false);
//-----------------------------------------------------------------------------
//! Check if payload is fronted by a header.
//!
//! @return true payload is fronted by a header.
//! @return false payload is not fronted by a header. GetDictID() mappings
//! are not sent and must be manually included inline.
//-----------------------------------------------------------------------------
bool HasHdr();
//-----------------------------------------------------------------------------
//! Insert information into the G-Stream.
//!
//! @param data -> to null-terminated text to be included in the G-Stream.
//! @param dlen the length of the text *including* the null character.
//! Requires that (8 <= dlen <= MaxDataLen); defined below.
//!
//! @return true data included.
//! @return false data rejected; invalid length or is not null terminated.
//-----------------------------------------------------------------------------
bool Insert(const char *data, int dlen);
//-----------------------------------------------------------------------------
//! Insert information into the G-Stream using the data placed in the buffer
//! space obtained by a previous call to Reserve(). Upon return, this object
//! is unlocked.
//!
//! @param dlen the number of bytes actually present in the buffer. The
//! text must end with a null byte and dlen must be
//! 8 <= dlen <= dlen used in the previous Reserve() call.
//!
//! @return true data included.
//! @return false data rejected; invalid length or no buffer outstanding.
//-----------------------------------------------------------------------------
bool Insert(int dlen);
//-----------------------------------------------------------------------------
//! Obtain a buffer space for information. This object is locked and no other
//! thread can insert information until the buffer is inserted using Insert().
//!
//! @param dlen the number of bytes required to be available for use.
//! Requires that (8 <= dlen <= MaxDataLen); defined below.
//!
//! @return !0 pointer to a dlen sized buffer.
//! @return =0 invalid length specified or a buffer is outstanding.
//-----------------------------------------------------------------------------
char *Reserve(int dlen);
//-----------------------------------------------------------------------------
//! Set autoflush time interval (or disable it). Disabling autoflush may be
//! useful when data is periodically generated at a low rate and manual
//! flushing would produce more consistent results.
//!
//! @param afsec Number of seconds between autoflushing. A zero or
//! negative value disables autoflush. The default is
//! 600 seconds (i.e. 10 minutes) subject to what is
//! specified via the xrootd.monitor flush directive.
//! Positive values less that 60 are considered to be 60.
//!
//! @return The previous auto-flush setting.
//-----------------------------------------------------------------------------
int SetAutoFlush(int afsec);
//-----------------------------------------------------------------------------
//! Get the amount of buffer space remaining.
//!
//! @return The maximum number of bytes that can be inserted at time of call.
//-----------------------------------------------------------------------------
int Space();
//-----------------------------------------------------------------------------
//! The larest amount of data that can be inserted in a single call to GStream.
//-----------------------------------------------------------------------------
static
const int MaxDataLen = 65280;
//-----------------------------------------------------------------------------
//! Constructor
//!
//! @param gsRef refrence to the G-Stream implementation.
//-----------------------------------------------------------------------------
XrdXrootdGStream(XrdXrootdGSReal &gsRef) : gStream(gsRef) {}
protected:
//-----------------------------------------------------------------------------
//! Destructor. This stream should never be directly deleted.
//-----------------------------------------------------------------------------
~XrdXrootdGStream() {}
private:
XrdXrootdGSReal &gStream;
};
#endif