genode/repos/os/src/server/fs_log/session.h
Emery Hemingway 88f107e0f9 Fs_log: new truncate behavior
Files are truncated at the next client session if all previous sessions
associated with the file are closed.

Issue #1538
2015-10-09 16:36:30 +02:00

120 lines
2.4 KiB
C++

/*
* \brief Log session that writes messages to a file system.
* \author Emery Hemingway
* \date 2015-05-16
*
* Message writing is fire-and-forget to prevent
* logging from becoming I/O bound.
*/
/*
* Copyright (C) 2015 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _FS_LOG__SESSION_H_
#define _FS_LOG__SESSION_H_
/* Genode includes */
#include <log_session/log_session.h>
#include <file_system_session/file_system_session.h>
#include <base/rpc_server.h>
/* Local includes */
#include "log_file.h"
namespace Fs_log {
class Session_component;
class Unlabeled_session_component;
class Labeled_session_component;
}
class Fs_log::Session_component : public Rpc_object<Log_session, Unlabeled_session_component>
{
protected:
Log_file &_log_file;
public:
Session_component(Log_file &log_file)
: _log_file(log_file) { _log_file.incr(); }
~Session_component() { _log_file.decr(); }
Log_file *file() const { return &_log_file; }
virtual size_t write(String const &string) = 0;
};
class Fs_log::Unlabeled_session_component : public Session_component
{
public:
/**
* Constructor
*/
Unlabeled_session_component(Log_file &log_file)
: Session_component(log_file) { }
/*****************
** Log session **
*****************/
size_t write(Log_session::String const &msg)
{
if (!msg.is_valid_string()) {
PERR("corrupted string");
return 0;
}
char const *msg_str = msg.string();
size_t msg_len = Genode::strlen(msg_str);
return _log_file.write(msg_str, msg_len);
}
};
class Fs_log::Labeled_session_component : public Session_component
{
private:
char _label[Log_session::String::MAX_SIZE];
size_t _label_len;
public:
/**
* Constructor
*/
Labeled_session_component(char const *label, Log_file &log_file)
: Session_component(log_file)
{
snprintf(_label, sizeof(_label), "[%s] ", label);
_label_len = strlen(_label);
}
/*****************
** Log session **
*****************/
size_t write(Log_session::String const &msg)
{
if (!msg.is_valid_string()) {
PERR("corrupted string");
return 0;
}
char const *msg_str = msg.string();
size_t msg_len = Genode::strlen(msg_str);
_log_file.write(_label, _label_len);
return _log_file.write(msg_str, msg_len);
}
};
#endif