| Index: runtime/vm/log.h
|
| diff --git a/runtime/vm/log.h b/runtime/vm/log.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..78f062bdf5913f5af52152e3e9f4205e2cef2f9c
|
| --- /dev/null
|
| +++ b/runtime/vm/log.h
|
| @@ -0,0 +1,98 @@
|
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +#ifndef VM_LOG_H_
|
| +#define VM_LOG_H_
|
| +
|
| +#include "vm/allocation.h"
|
| +#include "vm/growable_array.h"
|
| +#include "vm/os.h"
|
| +
|
| +namespace dart {
|
| +
|
| +class Isolate;
|
| +class LogBlock;
|
| +class Thread;
|
| +
|
| +#if defined(_MSC_VER)
|
| +#define ISL_Print(format, ...) \
|
| + Isolate::Current()->Log()->Print(format, __VA_ARGS__)
|
| +#else
|
| +#define ISL_Print(format, ...) \
|
| + Isolate::Current()->Log()->Print(format, ##__VA_ARGS__)
|
| +#endif
|
| +
|
| +typedef void (*LogPrinter)(const char* str, ...);
|
| +
|
| +class Log {
|
| + public:
|
| + explicit Log(LogPrinter printer = OS::Print);
|
| +
|
| + // Append a formatted string to the log.
|
| + void Print(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
|
| +
|
| + // Flush and truncate the log. The log is flushed starting at cursor
|
| + // and truncated to cursor afterwards.
|
| + void Flush(const intptr_t cursor = 0);
|
| +
|
| + // Clears the log.
|
| + void Clear();
|
| +
|
| + // Current cursor.
|
| + intptr_t cursor() const;
|
| +
|
| + // A logger that does nothing.
|
| + static Log* NoOpLog();
|
| +
|
| + private:
|
| + void TerminateString();
|
| + void EnableManualFlush();
|
| + void DisableManualFlush();
|
| +
|
| + static Log noop_log_;
|
| + LogPrinter printer_;
|
| + intptr_t manual_flush_;
|
| + MallocGrowableArray<char> buffer_;
|
| +
|
| + friend class LogBlock;
|
| + friend class LogTestHelper;
|
| + DISALLOW_COPY_AND_ASSIGN(Log);
|
| +};
|
| +
|
| +
|
| +// Causes all log messages to be buffered until destructor is called.
|
| +// Can be nested.
|
| +class LogBlock : public StackResource {
|
| + public:
|
| + LogBlock(Isolate* isolate, Log* log)
|
| + : StackResource(isolate),
|
| + log_(log), cursor_(log->cursor()) {
|
| + CommonConstructor();
|
| + }
|
| +
|
| + explicit LogBlock(Isolate* isolate);
|
| + explicit LogBlock(Thread* thread);
|
| +
|
| + LogBlock(Thread* thread, Log* log);
|
| +
|
| + ~LogBlock() {
|
| + CommonDestructor();
|
| + }
|
| +
|
| + private:
|
| + void CommonConstructor() {
|
| + log_->EnableManualFlush();
|
| + }
|
| +
|
| + void CommonDestructor() {
|
| + log_->Flush(cursor_);
|
| + log_->DisableManualFlush();
|
| + }
|
| + Log* log_;
|
| + const intptr_t cursor_;
|
| +};
|
| +
|
| +} // namespace dart
|
| +
|
| +#endif // VM_LOG_H_
|
|
|