blob: 7cffdc51d3ede8d747b3679867b306c596e33b40 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CRAZY_LINKER_THREAD_DATA_H
#define CRAZY_LINKER_THREAD_DATA_H
#include <stdarg.h>
#include <stddef.h>
namespace crazy {
// Per-thread context used during crazy linker operations.
class ThreadData {
public:
ThreadData() {}
// Init new ThreadData instance.
void Init();
// Return the current error message. This also clears the internal
// error message, which means that the next call to this method
// will return a pointer to an empty string unless AppendError()
// was called.
const char* GetError() const { return dlerror_; }
// Swap the error buffers.
void SwapErrorBuffers();
// Set message string in current dlerror buffer.
void SetError(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
SetErrorArgs(fmt, args);
va_end(args);
}
void SetErrorArgs(const char* fmt, va_list args);
// Append message string to current dlerror buffer.
void AppendError(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
AppendErrorArgs(fmt, args);
va_end(args);
}
void AppendErrorArgs(const char* fmt, va_list args);
private:
// Pointer to the current dlerror buffer. This points to one
// of the dlerror_buffers[] arrays, swapped on each dlerror()
// call.
char* dlerror_;
// Size of each dlerror message buffer size.
static const size_t kBufferSize = 512;
// Two buffers used to store dlerror messages.
char dlerror_buffers_[2][kBufferSize];
};
// Retrieves the ThreadData structure for the current thread.
// The first time this is called on a given thread, this creates
// a fresh new object, so this should never return NULL.
ThreadData* GetThreadData();
// Faster variant that should only be called when GetThreadData() was
// called at least once on the current thread.
ThreadData* GetThreadDataFast();
// Set the linker error string for the current thread.
void SetLinkerErrorString(const char* str);
// Set the formatted linker error for the current thread.
void SetLinkerError(const char* fmt, ...);
} // namespace crazy
#endif // CRAZY_LINKER_THREAD_DATA_H