/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
#define WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_

#include <list>
#include <queue>

#include "webrtc/base/criticalsection.h"
#include "webrtc/base/platform_thread.h"
#include "webrtc/base/thread_checker.h"
#include "webrtc/modules/utility/include/process_thread.h"
#include "webrtc/system_wrappers/include/event_wrapper.h"
#include "webrtc/typedefs.h"

namespace webrtc {

class ProcessThreadImpl : public ProcessThread {
 public:
  explicit ProcessThreadImpl(const char* thread_name);
  ~ProcessThreadImpl() override;

  void Start() override;
  void Stop() override;

  void WakeUp(Module* module) override;
  void PostTask(rtc::scoped_ptr<ProcessTask> task) override;

  void RegisterModule(Module* module) override;
  void DeRegisterModule(Module* module) override;

 protected:
  static bool Run(void* obj);
  bool Process();

 private:
  struct ModuleCallback {
    ModuleCallback() : module(nullptr), next_callback(0) {}
    ModuleCallback(const ModuleCallback& cb)
        : module(cb.module), next_callback(cb.next_callback) {}
    ModuleCallback(Module* module) : module(module), next_callback(0) {}
    bool operator==(const ModuleCallback& cb) const {
      return cb.module == module;
    }

    Module* const module;
    int64_t next_callback;  // Absolute timestamp.

   private:
    ModuleCallback& operator=(ModuleCallback&);
  };

  typedef std::list<ModuleCallback> ModuleList;

  // Warning: For some reason, if |lock_| comes immediately before |modules_|
  // with the current class layout, we will  start to have mysterious crashes
  // on Mac 10.9 debug.  I (Tommi) suspect we're hitting some obscure alignemnt
  // issues, but I haven't figured out what they are, if there are alignment
  // requirements for mutexes on Mac or if there's something else to it.
  // So be careful with changing the layout.
  rtc::CriticalSection lock_;  // Used to guard modules_, tasks_ and stop_.

  rtc::ThreadChecker thread_checker_;
  const rtc::scoped_ptr<EventWrapper> wake_up_;
  // TODO(pbos): Remove scoped_ptr and stop recreating the thread.
  rtc::scoped_ptr<rtc::PlatformThread> thread_;

  ModuleList modules_;
  // TODO(tommi): Support delayed tasks.
  std::queue<ProcessTask*> queue_;
  bool stop_;
  const char* thread_name_;
};

}  // namespace webrtc

#endif // WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
