1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CRAZY_LINKER_THREAD_H
6 #define CRAZY_LINKER_THREAD_H
7 
8 #include <stdarg.h>
9 #include <stddef.h>
10 
11 namespace crazy {
12 
13 // Per-thread context used during crazy linker operations.
14 class ThreadData {
15 
16  public:
ThreadData()17   ThreadData() {}
18 
19   // Init new ThreadData instance.
20   void Init();
21 
22   // Return the current error message. This also clears the internal
23   // error message, which means that the next call to this method
24   // will return a pointer to an empty string unless AppendError()
25   // was called.
GetError()26   const char* GetError() const { return dlerror_; }
27 
28   // Swap the error buffers.
29   void SwapErrorBuffers();
30 
31   // Set message string in current dlerror buffer.
SetError(const char * fmt,...)32   void SetError(const char* fmt, ...) {
33     va_list args;
34     va_start(args, fmt);
35     SetErrorArgs(fmt, args);
36     va_end(args);
37   }
38 
39   void SetErrorArgs(const char* fmt, va_list args);
40 
41   // Append message string to current dlerror buffer.
AppendError(const char * fmt,...)42   void AppendError(const char* fmt, ...) {
43     va_list args;
44     va_start(args, fmt);
45     AppendErrorArgs(fmt, args);
46     va_end(args);
47   }
48 
49   void AppendErrorArgs(const char* fmt, va_list args);
50 
51  private:
52   // Pointer to the current dlerror buffer. This points to one
53   // of the dlerror_buffers[] arrays, swapped on each dlerror()
54   // call.
55   char* dlerror_;
56 
57   // Size of each dlerror message buffer size.
58   static const size_t kBufferSize = 512;
59 
60   // Two buffers used to store dlerror messages.
61   char dlerror_buffers_[2][kBufferSize];
62 };
63 
64 // Retrieves the ThreadData structure for the current thread.
65 // The first time this is called on a given thread, this creates
66 // a fresh new object, so this should never return NULL.
67 ThreadData* GetThreadData();
68 
69 // Faster variant that should only be called when GetThreadData() was
70 // called at least once on the current thread.
71 ThreadData* GetThreadDataFast();
72 
73 // Set the linker error string for the current thread.
74 void SetLinkerErrorString(const char* str);
75 
76 // Set the formatted linker error for the current thread.
77 void SetLinkerError(const char* fmt, ...);
78 
79 }  // namespace crazy;
80 
81 #endif  // CRAZY_LINKER_THREAD_H
82