summaryrefslogtreecommitdiffstats
path: root/tools/gn/template.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gn/template.h')
-rw-r--r--tools/gn/template.h20
1 files changed, 12 insertions, 8 deletions
diff --git a/tools/gn/template.h b/tools/gn/template.h
index 0176862..0b123e0 100644
--- a/tools/gn/template.h
+++ b/tools/gn/template.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
class BlockNode;
@@ -17,7 +18,14 @@ class LocationRange;
class Scope;
class Value;
-class Template {
+// Represents the information associated with a template() call in GN, which
+// includes a closure and the code to run when the template is invoked.
+//
+// This class is immutable so we can reference it from multiple threads without
+// locking. Normally, this will be assocated with a .gni file and then a
+// reference will be taken by each .gn file that imports it. These files might
+// execute the template in parallel.
+class Template : public base::RefCountedThreadSafe<Template> {
public:
// Makes a new closure based on the given scope.
Template(const Scope* scope, const FunctionCallNode* def);
@@ -25,11 +33,6 @@ class Template {
// Takes ownership of a previously-constructed closure.
Template(scoped_ptr<Scope> closure, const FunctionCallNode* def);
- ~Template();
-
- // Makes a copy of this template.
- scoped_ptr<Template> Clone() const;
-
// Invoke the template. The values correspond to the state of the code
// invoking the template.
Value Invoke(Scope* scope,
@@ -42,12 +45,13 @@ class Template {
LocationRange GetDefinitionRange() const;
private:
+ friend class base::RefCountedThreadSafe<Template>;
+
Template();
+ ~Template();
scoped_ptr<Scope> closure_;
const FunctionCallNode* definition_;
-
- DISALLOW_COPY_AND_ASSIGN(Template);
};
#endif // TOOLS_GN_TEMPLATE_H_