// 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_PROCESS_SUB_THREAD_H_
#define CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_

#include <memory>

#include "base/macros.h"
#include "base/threading/thread.h"
#include "base/threading/thread_checker.h"
#include "build/build_config.h"
#include "content/common/content_export.h"
#include "content/public/browser/browser_thread.h"

#if defined(OS_WIN)
namespace base {
namespace win {
class ScopedCOMInitializer;
}
}
#endif

namespace content {
class NotificationService;
}

namespace content {

// ----------------------------------------------------------------------------
// A BrowserProcessSubThread is a physical thread backing a BrowserThread.
//
// Applications must initialize the COM library before they can call
// COM library functions other than CoGetMalloc and memory allocation
// functions, so this class initializes COM for those users.
class CONTENT_EXPORT BrowserProcessSubThread : public base::Thread {
 public:
  // Constructs a BrowserProcessSubThread for |identifier|.
  explicit BrowserProcessSubThread(BrowserThread::ID identifier);
  ~BrowserProcessSubThread() override;

  // Registers this thread to represent |identifier_| in the browser_thread.h
  // API. This thread must already be running when this is called. This can only
  // be called once per BrowserProcessSubThread instance.
  void RegisterAsBrowserThread();

  // Ideally there wouldn't be a special blanket allowance to block the
  // BrowserThreads in tests but TestBrowserThreadImpl previously bypassed
  // BrowserProcessSubThread and hence wasn't subject to ThreadRestrictions...
  // Flipping that around in favor of explicit scoped allowances would be
  // preferable but a non-trivial amount of work. Can only be called before
  // starting this BrowserProcessSubThread.
  void AllowBlockingForTesting();

  // Creates and starts the IO thread. It should not be promoted to
  // BrowserThread::IO until BrowserMainLoop::CreateThreads().
  static std::unique_ptr<BrowserProcessSubThread> CreateIOThread();

 protected:
  void Init() override;
  void Run(base::RunLoop* run_loop) override;
  void CleanUp() override;

 private:
  // Second Init() phase that must happen on this thread but can only happen
  // after it's promoted to a BrowserThread in |RegisterAsBrowserThread()|.
  void CompleteInitializationOnBrowserThread();

  // These methods merely forwards to Thread::Run() but are useful to identify
  // which BrowserThread this represents in stack traces.
  void UIThreadRun(base::RunLoop* run_loop);
  void IOThreadRun(base::RunLoop* run_loop);

  // This method encapsulates cleanup that needs to happen on the IO thread.
  void IOThreadCleanUp();

  const BrowserThread::ID identifier_;

  // BrowserThreads are not allowed to do file I/O nor wait on synchronization
  // primivives except when explicitly allowed in tests.
  bool is_blocking_allowed_for_testing_ = false;

  // The BrowserThread registration for this |identifier_|, initialized in
  // RegisterAsBrowserThread().
  std::unique_ptr<BrowserThreadImpl> browser_thread_;

#if defined (OS_WIN)
  std::unique_ptr<base::win::ScopedCOMInitializer> com_initializer_;
#endif

  // Each specialized thread has its own notification service.
  std::unique_ptr<NotificationService> notification_service_;

  THREAD_CHECKER(browser_thread_checker_);

  DISALLOW_COPY_AND_ASSIGN(BrowserProcessSubThread);
};

}  // namespace content

#endif  // CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_
