// Copyright 2018 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef STARBOARD_SHARED_STARBOARD_PLAYER_JOB_THREAD_H_
#define STARBOARD_SHARED_STARBOARD_PLAYER_JOB_THREAD_H_

#include <utility>

#include "starboard/common/log.h"
#include "starboard/common/scoped_ptr.h"
#include "starboard/shared/internal_only.h"
#include "starboard/shared/starboard/player/job_queue.h"
#include "starboard/thread.h"

#ifndef __cplusplus
#error "Only C++ files can include this header."
#endif

namespace starboard {
namespace shared {
namespace starboard {
namespace player {

// This class implements a thread that holds a JobQueue.
class JobThread {
 public:
  explicit JobThread(const char* thread_name,
                     int64_t stack_size = 0,
                     SbThreadPriority priority = kSbThreadPriorityNormal);
  ~JobThread();

  JobQueue* job_queue() { return job_queue_.get(); }
  const JobQueue* job_queue() const { return job_queue_.get(); }

  bool BelongsToCurrentThread() const {
    SB_DCHECK(job_queue_);

    return job_queue_->BelongsToCurrentThread();
  }

  JobQueue::JobToken Schedule(const JobQueue::Job& job,
                              SbTimeMonotonic delay = 0) {
    SB_DCHECK(job_queue_);

    return job_queue_->Schedule(job, delay);
  }
  JobQueue::JobToken Schedule(JobQueue::Job&& job, SbTimeMonotonic delay = 0) {
    SB_DCHECK(job_queue_);

    return job_queue_->Schedule(std::move(job), delay);
  }
  void ScheduleAndWait(const JobQueue::Job& job) {
    SB_DCHECK(job_queue_);

    job_queue_->ScheduleAndWait(job);
  }
  void ScheduleAndWait(JobQueue::Job&& job) {
    SB_DCHECK(job_queue_);

    job_queue_->ScheduleAndWait(std::move(job));
  }

  void RemoveJobByToken(JobQueue::JobToken job_token) {
    SB_DCHECK(job_queue_);

    return job_queue_->RemoveJobByToken(job_token);
  }

 private:
  static void* ThreadEntryPoint(void* context);
  void RunLoop();

  SbThread thread_;
  scoped_ptr<JobQueue> job_queue_;
};

}  // namespace player
}  // namespace starboard
}  // namespace shared
}  // namespace starboard

#endif  // STARBOARD_SHARED_STARBOARD_PLAYER_JOB_THREAD_H_
