Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: tools/generate_library_loader/generate_library_loader.py

Issue 22825011: Linux: untangle circular dependencies between .gyp files. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « build/linux/system.gyp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """ 6 """
7 Creates a library loader (a header and implementation file), 7 Creates a library loader (a header and implementation file),
8 which is a wrapper for dlopen or direct linking with given library. 8 which is a wrapper for dlopen or direct linking with given library.
9 9
10 The loader makes it possible to have the same client code for both cases, 10 The loader makes it possible to have the same client code for both cases,
(...skipping 13 matching lines...) Expand all
24 HEADER_TEMPLATE = """// This is generated file. Do not modify directly. 24 HEADER_TEMPLATE = """// This is generated file. Do not modify directly.
25 // Path to the code generator: %(generator_path)s . 25 // Path to the code generator: %(generator_path)s .
26 26
27 #ifndef %(unique_prefix)s 27 #ifndef %(unique_prefix)s
28 #define %(unique_prefix)s 28 #define %(unique_prefix)s
29 29
30 %(wrapped_header_include)s 30 %(wrapped_header_include)s
31 31
32 #include <string> 32 #include <string>
33 33
34 #include "base/basictypes.h"
35 #include "base/compiler_specific.h"
36 #if defined(%(unique_prefix)s_DLOPEN)
37 #include "base/native_library.h"
38 #endif
39
40 class %(class_name)s { 34 class %(class_name)s {
41 public: 35 public:
42 %(class_name)s(); 36 %(class_name)s();
43 ~%(class_name)s(); 37 ~%(class_name)s();
44 38
45 bool Load(const std::string& library_name) WARN_UNUSED_RESULT; 39 bool Load(const std::string& library_name)
40 __attribute__((warn_unused_result));
46 41
47 bool loaded() const { return loaded_; } 42 bool loaded() const { return loaded_; }
48 43
49 %(member_decls)s 44 %(member_decls)s
50 45
51 private: 46 private:
52 void CleanUp(bool unload); 47 void CleanUp(bool unload);
53 48
54 #if defined(%(unique_prefix)s_DLOPEN) 49 #if defined(%(unique_prefix)s_DLOPEN)
55 base::NativeLibrary library_; 50 void* library_;
56 #endif 51 #endif
57 52
58 bool loaded_; 53 bool loaded_;
59 54
60 DISALLOW_COPY_AND_ASSIGN(%(class_name)s); 55 // Disallow copy constructor and assignment operator.
56 %(class_name)s(const %(class_name)s&);
57 void operator=(const %(class_name)s&);
61 }; 58 };
62 59
63 #endif // %(unique_prefix)s 60 #endif // %(unique_prefix)s
64 """ 61 """
65 62
66 63
67 HEADER_MEMBER_TEMPLATE = """ typeof(&::%(function_name)s) %(function_name)s; 64 HEADER_MEMBER_TEMPLATE = """ typeof(&::%(function_name)s) %(function_name)s;
68 """ 65 """
69 66
70 67
71 IMPL_TEMPLATE = """// This is generated file. Do not modify directly. 68 IMPL_TEMPLATE = """// This is generated file. Do not modify directly.
72 // Path to the code generator: %(generator_path)s . 69 // Path to the code generator: %(generator_path)s .
73 70
74 #include "%(generated_header_name)s" 71 #include "%(generated_header_name)s"
75 72
73 #include <dlfcn.h>
74
76 // Put these sanity checks here so that they fire at most once 75 // Put these sanity checks here so that they fire at most once
77 // (to avoid cluttering the build output). 76 // (to avoid cluttering the build output).
78 #if !defined(%(unique_prefix)s_DLOPEN) && !defined(%(unique_prefix)s_DT_NEEDED) 77 #if !defined(%(unique_prefix)s_DLOPEN) && !defined(%(unique_prefix)s_DT_NEEDED)
79 #error neither %(unique_prefix)s_DLOPEN nor %(unique_prefix)s_DT_NEEDED defined 78 #error neither %(unique_prefix)s_DLOPEN nor %(unique_prefix)s_DT_NEEDED defined
80 #endif 79 #endif
81 #if defined(%(unique_prefix)s_DLOPEN) && defined(%(unique_prefix)s_DT_NEEDED) 80 #if defined(%(unique_prefix)s_DLOPEN) && defined(%(unique_prefix)s_DT_NEEDED)
82 #error both %(unique_prefix)s_DLOPEN and %(unique_prefix)s_DT_NEEDED defined 81 #error both %(unique_prefix)s_DLOPEN and %(unique_prefix)s_DT_NEEDED defined
83 #endif 82 #endif
84 83
85 #include "base/files/file_path.h"
86 #include "base/logging.h"
87
88 %(class_name)s::%(class_name)s() : loaded_(false) { 84 %(class_name)s::%(class_name)s() : loaded_(false) {
89 } 85 }
90 86
91 %(class_name)s::~%(class_name)s() { 87 %(class_name)s::~%(class_name)s() {
92 CleanUp(loaded_); 88 CleanUp(loaded_);
93 } 89 }
94 90
95 bool %(class_name)s::Load(const std::string& library_name) { 91 bool %(class_name)s::Load(const std::string& library_name) {
96 if (loaded_) { 92 if (loaded_)
97 NOTREACHED();
98 return false; 93 return false;
99 }
100 94
101 #if defined(%(unique_prefix)s_DLOPEN) 95 #if defined(%(unique_prefix)s_DLOPEN)
102 library_ = base::LoadNativeLibrary(base::FilePath(library_name), NULL); 96 library_ = dlopen(library_name.c_str(), RTLD_LAZY);
103 if (!library_) 97 if (!library_)
104 return false; 98 return false;
105 #endif 99 #endif
106 100
107 %(member_init)s 101 %(member_init)s
108 102
109 loaded_ = true; 103 loaded_ = true;
110 return true; 104 return true;
111 } 105 }
112 106
113 void %(class_name)s::CleanUp(bool unload) { 107 void %(class_name)s::CleanUp(bool unload) {
114 #if defined(%(unique_prefix)s_DLOPEN) 108 #if defined(%(unique_prefix)s_DLOPEN)
115 if (unload) { 109 if (unload) {
116 base::UnloadNativeLibrary(library_); 110 dlclose(library_);
117 library_ = NULL; 111 library_ = NULL;
118 } 112 }
119 #endif 113 #endif
120 loaded_ = false; 114 loaded_ = false;
121 %(member_cleanup)s 115 %(member_cleanup)s
122 } 116 }
123 """ 117 """
124 118
125 IMPL_MEMBER_INIT_TEMPLATE = """ 119 IMPL_MEMBER_INIT_TEMPLATE = """
126 #if defined(%(unique_prefix)s_DLOPEN) 120 #if defined(%(unique_prefix)s_DLOPEN)
127 %(function_name)s = 121 %(function_name)s =
128 reinterpret_cast<typeof(this->%(function_name)s)>( 122 reinterpret_cast<typeof(this->%(function_name)s)>(
129 base::GetFunctionPointerFromNativeLibrary( 123 dlsym(library_, "%(function_name)s"));
130 library_, "%(function_name)s"));
131 #endif 124 #endif
132 #if defined(%(unique_prefix)s_DT_NEEDED) 125 #if defined(%(unique_prefix)s_DT_NEEDED)
133 %(function_name)s = &::%(function_name)s; 126 %(function_name)s = &::%(function_name)s;
134 #endif 127 #endif
135 if (!%(function_name)s) { 128 if (!%(function_name)s) {
136 CleanUp(true); 129 CleanUp(true);
137 return false; 130 return false;
138 } 131 }
139 """ 132 """
140 133
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 impl_file = open(os.path.join(source_tree_root, options.output_cc), 'w') 240 impl_file = open(os.path.join(source_tree_root, options.output_cc), 'w')
248 try: 241 try:
249 impl_file.write(impl_contents) 242 impl_file.write(impl_contents)
250 finally: 243 finally:
251 impl_file.close() 244 impl_file.close()
252 245
253 return 0 246 return 0
254 247
255 if __name__ == '__main__': 248 if __name__ == '__main__':
256 sys.exit(main()) 249 sys.exit(main())
OLDNEW
« no previous file with comments | « build/linux/system.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698