// Copyright (c) 2012 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 CONTENT_BROWSER_BROWSER_THREAD_IMPL_H_
#define CONTENT_BROWSER_BROWSER_THREAD_IMPL_H_

#include "base/memory/scoped_refptr.h"
#include "base/single_thread_task_runner.h"
#include "content/common/content_export.h"
#include "content/public/browser/browser_thread.h"

namespace content {

class BrowserMainLoop;
class BrowserProcessSubThread;
class TestBrowserThread;

// BrowserThreadImpl is a scoped object which maps a SingleThreadTaskRunner to a
// BrowserThread::ID. On ~BrowserThreadImpl() that ID enters a SHUTDOWN state
// (in which BrowserThread::IsThreadInitialized() returns false) but the mapping
// isn't undone to avoid shutdown races (the task runner is free to stop
// accepting tasks by then however).
//
// Very few users should use this directly. To mock BrowserThreads, tests should
// use TestBrowserThreadBundle instead.
class CONTENT_EXPORT BrowserThreadImpl : public BrowserThread {
 public:
  ~BrowserThreadImpl();

  // Returns the thread name for |identifier|.
  static const char* GetThreadName(BrowserThread::ID identifier);

  // Resets globals for |identifier|. Used in tests to clear global state that
  // would otherwise leak to the next test. Globals are not otherwise fully
  // cleaned up in ~BrowserThreadImpl() as there are subtle differences between
  // UNINITIALIZED and SHUTDOWN state (e.g. globals.task_runners are kept around
  // on shutdown). Must be called after ~BrowserThreadImpl() for the given
  // |identifier|.
  static void ResetGlobalsForTesting(BrowserThread::ID identifier);

 private:
  // Restrict instantiation to BrowserProcessSubThread as it performs important
  // initialization that shouldn't be bypassed (except by BrowserMainLoop for
  // the main thread).
  friend class BrowserProcessSubThread;
  friend class BrowserMainLoop;
  // TestBrowserThread is also allowed to construct this when instantiating fake
  // threads.
  friend class TestBrowserThread;

  // Binds |identifier| to |task_runner| for the browser_thread.h API. This
  // needs to happen on the main thread before //content and embedders are
  // kicked off and enabled to invoke the BrowserThread API from other threads.
  BrowserThreadImpl(BrowserThread::ID identifier,
                    scoped_refptr<base::SingleThreadTaskRunner> task_runner);

  // The identifier of this thread.  Only one thread can exist with a given
  // identifier at a given time.
  ID identifier_;
};

}  // namespace content

#endif  // CONTENT_BROWSER_BROWSER_THREAD_IMPL_H_
