abstract_task.h 1.03 KB
Newer Older
1 2 3 4

#ifndef PLS_ABSTRACT_TASK_H
#define PLS_ABSTRACT_TASK_H

5
#include "pls/internal/base/swmr_spin_lock.h"
6
#include "pls/internal/helpers/unique_id.h"
7 8

namespace pls {
9 10 11 12 13 14 15 16 17 18
namespace internal {
namespace scheduling {

class abstract_task {
 public:
  using id = helpers::unique_id;

 private:
  unsigned int depth_;
  abstract_task::id unique_id_;
19
  abstract_task *volatile child_task_;
20 21 22 23 24 25 26 27 28

 public:
  abstract_task(const unsigned int depth, const abstract_task::id &unique_id) :
      depth_{depth},
      unique_id_{unique_id},
      child_task_{nullptr} {}

  virtual void execute() = 0;
  void set_child(abstract_task *child_task) { child_task_ = child_task; }
29
  abstract_task *child() const { return child_task_; }
30 31 32 33 34 35

  void set_depth(unsigned int depth) { depth_ = depth; }
  unsigned int depth() const { return depth_; }
  id unique_id() const { return unique_id_; }
 protected:
  virtual bool internal_stealing(abstract_task *other_task) = 0;
36
  virtual bool split_task(base::swmr_spin_lock *lock) = 0;
37 38 39 40 41 42

  bool steal_work();
};

}
}
43 44 45
}

#endif //PLS_ABSTRACT_TASK_H