More efficient device error logging
This commit is contained in:
parent
224b0dd8ea
commit
7f3699e69d
@ -360,6 +360,10 @@ bool device_t::findit(bool isvalidation) const
|
|||||||
|
|
||||||
void device_t::start()
|
void device_t::start()
|
||||||
{
|
{
|
||||||
|
// prepare the logerror buffer
|
||||||
|
if (m_machine->allow_logging())
|
||||||
|
m_string_buffer.reserve(1024);
|
||||||
|
|
||||||
// find all the registered devices
|
// find all the registered devices
|
||||||
if (!findit(false))
|
if (!findit(false))
|
||||||
throw emu_fatalerror("Missing some required objects, unable to proceed");
|
throw emu_fatalerror("Missing some required objects, unable to proceed");
|
||||||
@ -380,7 +384,7 @@ void device_t::start()
|
|||||||
device_sound_interface *sound;
|
device_sound_interface *sound;
|
||||||
if (state_registrations == 0 && (interface(exec) || interface(sound)) && type() != SPEAKER)
|
if (state_registrations == 0 && (interface(exec) || interface(sound)) && type() != SPEAKER)
|
||||||
{
|
{
|
||||||
logerror("Device '%s' did not register any state to save!\n", tag());
|
logerror("Device did not register any state to save!\n");
|
||||||
if ((machine().system().flags & MACHINE_SUPPORTS_SAVE) != 0)
|
if ((machine().system().flags & MACHINE_SUPPORTS_SAVE) != 0)
|
||||||
fatalerror("Device '%s' did not register any state to save!\n", tag());
|
fatalerror("Device '%s' did not register any state to save!\n", tag());
|
||||||
}
|
}
|
||||||
|
@ -361,6 +361,9 @@ private:
|
|||||||
bool m_config_complete; // have we completed our configuration?
|
bool m_config_complete; // have we completed our configuration?
|
||||||
bool m_started; // true if the start function has succeeded
|
bool m_started; // true if the start function has succeeded
|
||||||
finder_base * m_auto_finder_list; // list of objects to auto-find
|
finder_base * m_auto_finder_list; // list of objects to auto-find
|
||||||
|
|
||||||
|
// string formatting buffer for logerror
|
||||||
|
mutable util::ovectorstream m_string_buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
#ifndef __DEVICE_IPP__
|
#ifndef __DEVICE_IPP__
|
||||||
#define __DEVICE_IPP__
|
#define __DEVICE_IPP__
|
||||||
|
|
||||||
#include "strformat.h"
|
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
// MEMBER TEMPLATES
|
// MEMBER TEMPLATES
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
@ -26,15 +24,28 @@
|
|||||||
template <typename Format, typename... Params>
|
template <typename Format, typename... Params>
|
||||||
inline void device_t::popmessage(Format &&fmt, Params &&... args) const
|
inline void device_t::popmessage(Format &&fmt, Params &&... args) const
|
||||||
{
|
{
|
||||||
if (m_machine)
|
if (m_machine != nullptr)
|
||||||
m_machine->popmessage(std::forward<Format>(fmt), std::forward<Params>(args)...);
|
m_machine->popmessage(std::forward<Format>(fmt), std::forward<Params>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Format, typename... Params>
|
template <typename Format, typename... Params>
|
||||||
inline void device_t::logerror(Format &&fmt, Params &&... args) const
|
inline void device_t::logerror(Format &&fmt, Params &&... args) const
|
||||||
{
|
{
|
||||||
if (m_machine)
|
if (m_machine != nullptr && m_machine->allow_logging())
|
||||||
m_machine->logerror(string_format("[%s] %s", tag(), std::forward<Format>(fmt)), std::forward<Params>(args)...);
|
{
|
||||||
|
g_profiler.start(PROFILER_LOGERROR);
|
||||||
|
|
||||||
|
// dump to the buffer
|
||||||
|
m_string_buffer.clear();
|
||||||
|
m_string_buffer.seekp(0);
|
||||||
|
util::stream_format(m_string_buffer, "[%s] ", tag());
|
||||||
|
util::stream_format(m_string_buffer, std::forward<Format>(fmt), std::forward<Params>(args)...);
|
||||||
|
m_string_buffer.put('\0');
|
||||||
|
|
||||||
|
m_machine->strlog(&m_string_buffer.vec()[0]);
|
||||||
|
|
||||||
|
g_profiler.stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __DEVICE_IPP__
|
#endif // __DEVICE_IPP__
|
||||||
|
@ -29,9 +29,11 @@
|
|||||||
#include "eminline.h"
|
#include "eminline.h"
|
||||||
#include "profiler.h"
|
#include "profiler.h"
|
||||||
|
|
||||||
// commonly-referenecd utilities imported from lib/util
|
// commonly-referenced utilities imported from lib/util
|
||||||
#include "palette.h"
|
#include "palette.h"
|
||||||
#include "unicode.h"
|
#include "unicode.h"
|
||||||
|
#include "strformat.h"
|
||||||
|
#include "vecstream.h"
|
||||||
|
|
||||||
// emulator-specific utilities
|
// emulator-specific utilities
|
||||||
#include "attotime.h"
|
#include "attotime.h"
|
||||||
|
@ -727,6 +727,19 @@ void running_machine::add_logerror_callback(logerror_callback callback)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// strlog - send an error logging string to the
|
||||||
|
// debugger and any OSD-defined output streams
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void running_machine::strlog(const char *str) const
|
||||||
|
{
|
||||||
|
// log to all callbacks
|
||||||
|
for (auto &cb : m_logerror_list)
|
||||||
|
cb->m_func(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// debug_break - breaks into the debugger, if
|
// debug_break - breaks into the debugger, if
|
||||||
// enabled
|
// enabled
|
||||||
|
@ -19,9 +19,6 @@
|
|||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
#include "strformat.h"
|
|
||||||
#include "vecstream.h"
|
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
// forward declaration instead of osdepend.h
|
// forward declaration instead of osdepend.h
|
||||||
@ -198,6 +195,7 @@ public:
|
|||||||
emu_options &options() const { return m_config.options(); }
|
emu_options &options() const { return m_config.options(); }
|
||||||
attotime time() const { return m_scheduler.time(); }
|
attotime time() const { return m_scheduler.time(); }
|
||||||
bool scheduled_event_pending() const { return m_exit_pending || m_hard_reset_pending; }
|
bool scheduled_event_pending() const { return m_exit_pending || m_hard_reset_pending; }
|
||||||
|
bool allow_logging() const { return !m_logerror_list.empty(); }
|
||||||
|
|
||||||
// fetch items by name
|
// fetch items by name
|
||||||
inline device_t *device(const char *tag) const { return root_device().subdevice(tag); }
|
inline device_t *device(const char *tag) const { return root_device().subdevice(tag); }
|
||||||
@ -233,6 +231,7 @@ public:
|
|||||||
void popmessage() const { popmessage(static_cast<char const *>(nullptr)); }
|
void popmessage() const { popmessage(static_cast<char const *>(nullptr)); }
|
||||||
template <typename Format, typename... Params> void popmessage(Format &&fmt, Params &&... args) const;
|
template <typename Format, typename... Params> void popmessage(Format &&fmt, Params &&... args) const;
|
||||||
template <typename Format, typename... Params> void logerror(Format &&fmt, Params &&... args) const;
|
template <typename Format, typename... Params> void logerror(Format &&fmt, Params &&... args) const;
|
||||||
|
void strlog(const char *str) const;
|
||||||
UINT32 rand();
|
UINT32 rand();
|
||||||
const char *describe_context();
|
const char *describe_context();
|
||||||
|
|
||||||
@ -387,7 +386,7 @@ template <typename Format, typename... Params>
|
|||||||
inline void running_machine::logerror(Format &&fmt, Params &&... args) const
|
inline void running_machine::logerror(Format &&fmt, Params &&... args) const
|
||||||
{
|
{
|
||||||
// process only if there is a target
|
// process only if there is a target
|
||||||
if (!m_logerror_list.empty())
|
if (allow_logging())
|
||||||
{
|
{
|
||||||
g_profiler.start(PROFILER_LOGERROR);
|
g_profiler.start(PROFILER_LOGERROR);
|
||||||
|
|
||||||
@ -397,10 +396,7 @@ inline void running_machine::logerror(Format &&fmt, Params &&... args) const
|
|||||||
util::stream_format(m_string_buffer, std::forward<Format>(fmt), std::forward<Params>(args)...);
|
util::stream_format(m_string_buffer, std::forward<Format>(fmt), std::forward<Params>(args)...);
|
||||||
m_string_buffer.put('\0');
|
m_string_buffer.put('\0');
|
||||||
|
|
||||||
// log to all callbacks
|
strlog(&m_string_buffer.vec()[0]);
|
||||||
char const *const str(&m_string_buffer.vec()[0]);
|
|
||||||
for (auto &cb : m_logerror_list)
|
|
||||||
cb->m_func(str);
|
|
||||||
|
|
||||||
g_profiler.stop();
|
g_profiler.stop();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user