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

Unified Diff: net/base/directory_lister.h

Issue 786123002: Update from https://crrev.com/307330 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years 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 | « gpu/khronos_glcts_support/generate_khronos_glcts_tests.py ('k') | net/base/directory_lister.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/directory_lister.h
diff --git a/net/base/directory_lister.h b/net/base/directory_lister.h
index 5fbc9dc6fa15abd3c409aa4502327663dfa57e78..51387e806557f10d3f51462eefd17d86af456120 100644
--- a/net/base/directory_lister.h
+++ b/net/base/directory_lister.h
@@ -7,21 +7,22 @@
#include <vector>
+#include "base/atomicops.h"
#include "base/files/file_enumerator.h"
#include "base/files/file_path.h"
+#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop_proxy.h"
#include "net/base/net_export.h"
namespace net {
-//
-// This class provides an API for listing the contents of a directory on the
-// filesystem asynchronously. It spawns a background thread, and enumerates
-// the specified directory on that thread. It marshalls WIN32_FIND_DATA
-// structs over to the main application thread. The consumer of this class
-// is insulated from any of the multi-threading details.
-//
+// This class provides an API for asynchronously listing the contents of a
+// directory on the filesystem. It runs a task on a background thread, and
+// enumerates all files in the specified directory on that thread. Destroying
+// the lister cancels the list operation. The DirectoryLister must only be
+// used on a thread with a MessageLoop.
class NET_EXPORT DirectoryLister {
public:
// Represents one file found.
@@ -48,6 +49,9 @@ class NET_EXPORT DirectoryLister {
// directories first in name order, then files by name order
// FULL_PATH sorts by paths as strings, ignoring files v. directories
// DATE sorts by last modified date
+ // TODO(mmenke): Only NO_SORT and ALPHA_DIRS_FIRST appear to be used in
+ // production code, and there's very little testing of some of these
+ // options. Remove unused options, improve testing of the others.
enum SortType {
NO_SORT,
DATE,
@@ -74,6 +78,15 @@ class NET_EXPORT DirectoryLister {
void Cancel();
private:
+ typedef std::vector<DirectoryListerData> DirectoryList;
+
+ // Class responsible for retrieving and sorting the actual directory list on
+ // a worker pool thread. Created on the DirectoryLister's thread. As it's
+ // refcounted, it's destroyed when the final reference is released, which may
+ // happen on either thread.
+ //
+ // It's kept alive during the calls to Start() and DoneOnOriginThread() by the
+ // reference owned by the callback itself.
class Core : public base::RefCountedThreadSafe<Core> {
public:
Core(const base::FilePath& dir,
@@ -81,9 +94,11 @@ class NET_EXPORT DirectoryLister {
SortType sort,
DirectoryLister* lister);
- bool Start();
+ // May only be called on a worker pool thread.
+ void Start();
- void Cancel();
+ // Must be called on the origin thread.
+ void CancelOnOriginThread();
private:
friend class base::RefCountedThreadSafe<Core>;
@@ -91,28 +106,35 @@ class NET_EXPORT DirectoryLister {
~Core();
- // This method runs on a WorkerPool thread.
- void StartInternal();
+ // Called on both threads.
+ bool IsCancelled() const;
- void SendData(const std::vector<DirectoryListerData>& data);
+ // Called on origin thread.
+ void DoneOnOriginThread(scoped_ptr<DirectoryList> directory_list,
+ int error) const;
- void OnDone(int error);
+ const base::FilePath dir_;
+ const bool recursive_;
+ const SortType sort_;
+ const scoped_refptr<base::MessageLoopProxy> origin_loop_;
- base::FilePath dir_;
- bool recursive_;
- SortType sort_;
- scoped_refptr<base::MessageLoopProxy> origin_loop_;
-
- // |lister_| gets set to NULL when canceled.
+ // Only used on the origin thread.
DirectoryLister* lister_;
+ // Set to 1 on cancellation. Used both to abort listing files early on the
+ // worker pool thread for performance reasons and to ensure |lister_| isn't
+ // called after cancellation on the origin thread.
+ base::subtle::Atomic32 cancelled_;
+
DISALLOW_COPY_AND_ASSIGN(Core);
};
- void OnReceivedData(const DirectoryListerData& data);
- void OnDone(int error);
+ // Call into the corresponding DirectoryListerDelegate. Must not be called
+ // after cancellation.
+ void OnListFile(const DirectoryListerData& data);
+ void OnListDone(int error);
- const scoped_refptr<Core> core_;
+ scoped_refptr<Core> core_;
DirectoryListerDelegate* const delegate_;
DISALLOW_COPY_AND_ASSIGN(DirectoryLister);
« no previous file with comments | « gpu/khronos_glcts_support/generate_khronos_glcts_tests.py ('k') | net/base/directory_lister.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698