blob: 2b9851517e63072a1e46dedb4a4152a5dfcd45c8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Sergey L. Ivashin
*/
#ifndef _LOGSTREAM_H_
#define _LOGSTREAM_H_
#include "mkernel.h"
#include <iostream>
#include <iomanip>
#include <fstream>
namespace Jitrino
{
class HPipeline;
class LogStream
{
protected:
static bool ison;
static LogStream logsink;
static LogStream* logrtp;
char* fname;
bool enabled,
append,
pending_open,
was_open;
std::ofstream os;
Mutex* mutexp;
int ref_count;
bool lazy_open ();
public:
enum SID
{// numbering must starts with 0
INFO = 0,
RT,
CT,
IRDUMP,
DOTDUMP,
DBG
// add corresponding entry to the 'knownstreams' table
};
LogStream();
LogStream(/*const*/ char* fname);
LogStream(const LogStream&);
~LogStream();
void open (/*const*/ char* fname);
void close ();
void addRef ();
bool releaseRef ();
bool isEnabled () const {return enabled;}
std::ostream& out () {lazy_open(); return os;}
const char* getFileName () const {return fname;}
static LogStream& log (SID, HPipeline* pipe = 0);
static LogStream& log (SID, const char* pipename = 0);
static LogStream& log (SID, const char* pipename, size_t namesz);
static LogStream& log (const char* streamname, const char* pipename = 0);
static LogStream& log (const char* streamname, const char* pipename, size_t namesz);
static LogStream& log_sink () {return logsink;}
static LogStream& log_rt () {return *logrtp;}
static bool isOn () {return ison;}
template <class T>
LogStream& operator << (const T& value)
{
#ifndef _NOLOG
AutoUnlock lock(mutexp);
if (lazy_open())
os << value;
#endif
return *this;
}
LogStream& operator << (std::ostream& (*f) (std::ostream&))
{
#ifndef _NOLOG
AutoUnlock lock(mutexp);
if (lazy_open())
f(os);
#endif
return *this;
}
int printf (const char*, ...)
#ifdef _NOLOG
{return 0;} // will be removed during compilation
#else
; // implementation in the corresponding .cpp file
#endif
LogStream& flush ()
{
#ifndef _NOLOG
AutoUnlock lock(mutexp);
if (lazy_open())
os.flush();
#endif
return *this;
}
friend class LogStreams;
};
} //namespace Jitrino
#endif //#ifndef _LOGSTREAM_H_