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

Unified Diff: tools/gn/item_node.h

Issue 21114002: Add initial prototype for the GN meta-buildsystem. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add owners and readme Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/item.cc ('k') | tools/gn/item_node.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/item_node.h
diff --git a/tools/gn/item_node.h b/tools/gn/item_node.h
new file mode 100644
index 0000000000000000000000000000000000000000..297010f2f7399a04dc8fbde64cbc20484ccee3d9
--- /dev/null
+++ b/tools/gn/item_node.h
@@ -0,0 +1,119 @@
+// Copyright (c) 2013 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 TOOLS_GN_ITEM_NODE_H_
+#define TOOLS_GN_ITEM_NODE_H_
+
+#include <set>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+#include "tools/gn/location.h"
+
+class Item;
+
+// Represents a node in the depdency tree. It references an Item which is
+// the actual thing.
+//
+// The items and nodes are split apart so that the ItemTree can manipulate
+// the dependencies one one thread while the Item itself is been modified on
+// another.
+class ItemNode {
+ public:
+ enum State {
+ // Another item has referenced this one by name, but we have not yet
+ // encountered this item to know what it is.
+ REFERENCED,
+
+ // This item has been defined but some of the dependencies it references
+ // have not been.
+ GENERATED,
+
+ // All of this item's transitive dependencies have been found and
+ // resolved.
+ RESOLVED,
+ };
+
+ typedef std::set<ItemNode*> ItemNodeSet;
+
+ // Takes ownership of the pointer.
+ // Initial state will be REFERENCED.
+ ItemNode(Item* i);
+ ~ItemNode();
+
+ State state() const { return state_; }
+
+ // This closure will be executed when the item is resolved.
+ void set_resolved_closure(const base::Closure& closure) {
+ resolved_closure_ = closure;
+ }
+
+ const Item* item() const { return item_.get(); }
+ Item* item() { return item_.get(); }
+
+ // Where this was created from, which might be when it was generated or
+ // when it was first referenced from another target.
+ const LocationRange& originally_referenced_from_here() const {
+ return originally_referenced_from_here_;
+ }
+ void set_originally_referenced_from_here(const LocationRange& r) {
+ originally_referenced_from_here_ = r;
+ }
+
+ // Where this was generated from. This will be empty for items that have
+ // been referenced but not generated. Note that this has to be one the
+ // ItemNode because it can be changing from multiple threads and we need
+ // to be sure that access is serialized.
+ const LocationRange& generated_from_here() const {
+ return generated_from_here_;
+ }
+ void set_generated_from_here(const LocationRange& r) {
+ generated_from_here_ = r;
+ }
+
+ const ItemNodeSet& direct_dependencies() const {
+ return direct_dependencies_;
+ }
+ const ItemNodeSet& unresolved_dependencies() const {
+ return unresolved_dependencies_;
+ }
+
+ void AddDependency(ItemNode* node);
+
+ // Removes the given dependency from the unresolved list. Does not do
+ // anything else to update waiters.
+ void MarkDirectDependencyResolved(ItemNode* node);
+
+ // Destructively retrieve the set of waiting nodes.
+ void SwapOutWaitingDependencySet(ItemNodeSet* out_set);
+
+ void SetGenerated();
+ void SetResolved();
+
+ private:
+ State state_;
+ scoped_ptr<Item> item_;
+
+ LocationRange originally_referenced_from_here_;
+ LocationRange generated_from_here_;
+
+ // What to run when this item is resolved.
+ base::Closure resolved_closure_;
+
+ // Everything this item directly depends on.
+ ItemNodeSet direct_dependencies_;
+
+ // Unresolved things this item directly depends on.
+ ItemNodeSet unresolved_dependencies_;
+
+ // These items are waiting on us to be resolved before they can be
+ // resolved. This is the backpointer for unresolved_dependencies_.
+ ItemNodeSet waiting_on_resolution_;
+
+ DISALLOW_COPY_AND_ASSIGN(ItemNode);
+};
+
+#endif // TOOLS_GN_ITEM_NODE_H_
« no previous file with comments | « tools/gn/item.cc ('k') | tools/gn/item_node.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698