// Copyright 2019 The TAL Authors. All rights reserved.
#ifndef LIB_OWCR_EXTENSION_PUBLIC_IEXTENSION_THREAD_DELEGATE_
#define LIB_OWCR_EXTENSION_PUBLIC_IEXTENSION_THREAD_DELEGATE_

namespace owcr {
namespace extension {
class IExtensionThreadDelegate {
 public:
  IExtensionThreadDelegate() {}
  virtual ~IExtensionThreadDelegate() {}
  typedef enum {
    TID_UI = 0,
    TID_FILE,
    TID_IO = 5,
    TID_END = 10
  }THREAD_TYPE;

  class ThreadTask {
   public:
    ThreadTask() {}
    virtual ~ThreadTask() {}

    // \brief 执行任务回调
    // \param thread_id 线程标识或线程类型
    virtual void OnExec(int thread_id) = 0;
  };

  // \brief 创建一个线程
  // return 返回唯一线程标识 不是线程ID
  virtual int CreateThread() = 0;

  // \brief 投递任务到线程上执行
  // \param thread_id 线程标识
  // \param task 要执行的任务
  virtual void PostTaskOnThread(int thread_id, ThreadTask* task) = 0;

  // \brief 等待线程所有任务执行结束
  // \param thread_id 线程标识
  virtual void WaitThread(int thread_id) = 0;

  // \brief 终止当前线程 且继续投递任务无效
  // 使用线程的插件 Uninit函数中必须调用此函数
  // \param thread_id 线程标识
  virtual void DestroyThread(int thread_id) = 0;
};
}  // namespace extension
}  // namespace owcr
#endif  // LIB_OWCR_EXTENSION_PUBLIC_IEXTENSION_THREAD_DELEGATE_
