ParallelJob.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "anki/core/ParallelJob.h"
  2. #include "anki/core/ParallelManager.h"
  3. namespace anki {
  4. //==============================================================================
  5. // Constructor =
  6. //==============================================================================
  7. ParallelJob::ParallelJob(int id_, const ParallelManager& manager_,
  8. boost::barrier& barrier_)
  9. : id(id_), barrier(barrier_), callback(NULL), manager(manager_)
  10. {
  11. start();
  12. }
  13. //==============================================================================
  14. // assignNewJob =
  15. //==============================================================================
  16. void ParallelJob::assignNewJob(ParallelJobCallback callback_,
  17. ParallelJobParameters& jobParams_)
  18. {
  19. boost::mutex::scoped_lock lock(mutex);
  20. callback = callback_;
  21. params = &jobParams_;
  22. lock.unlock();
  23. condVar.notify_one();
  24. }
  25. //==============================================================================
  26. // workingFunc =
  27. //==============================================================================
  28. void ParallelJob::workingFunc()
  29. {
  30. while(1)
  31. {
  32. // Wait for something
  33. {
  34. boost::mutex::scoped_lock lock(mutex);
  35. while(callback == NULL)
  36. {
  37. condVar.wait(lock);
  38. }
  39. }
  40. // Exec
  41. callback(*params, *this);
  42. // Nullify
  43. {
  44. boost::mutex::scoped_lock lock(mutex);
  45. callback = NULL;
  46. }
  47. barrier.wait();
  48. }
  49. }
  50. } // end namespace