LLVM: lib/ExecutionEngine/Orc/TaskDispatch.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

10#include "llvm/Config/llvm-config.h"

12

13namespace llvm {

14namespace orc {

15

19

21

22void Task::anchor() {}

23void IdleTask::anchor() {}

24

26

28

30

31#if LLVM_ENABLE_THREADS

32void DynamicThreadPoolTaskDispatcher::dispatch(std::unique_ptr T) {

33

34 enum { Normal, Materialization, Idle } TaskKind;

35

37 TaskKind = Materialization;

39 TaskKind = Idle;

40 else

42

43 {

44 std::lock_guardstd::mutex Lock(DispatchMutex);

45

46

47 if (Shutdown)

48 return;

49

50 if (TaskKind == Materialization) {

51

52

53

54 if (!canRunMaterializationTaskNow())

55 return MaterializationTaskQueue.push_back(std::move(T));

56

57

58 ++NumMaterializationThreads;

59 } else if (TaskKind == Idle) {

60 if (!canRunIdleTaskNow())

61 return IdleTaskQueue.push_back(std::move(T));

62 }

63

64 ++Outstanding;

65 }

66

67 std::thread([this, T = std::move(T), TaskKind]() mutable {

68 while (true) {

69

70

71 T->run();

72

73

74

75

76

77 T.reset();

78

79

80

81 std::lock_guardstd::mutex Lock(DispatchMutex);

82

83 if (TaskKind == Materialization)

84 --NumMaterializationThreads;

85 --Outstanding;

86

87 if (!MaterializationTaskQueue.empty() && canRunMaterializationTaskNow()) {

88

89 T = std::move(MaterializationTaskQueue.front());

90 MaterializationTaskQueue.pop_front();

91 TaskKind = Materialization;

92 ++NumMaterializationThreads;

93 ++Outstanding;

94 } else if (!IdleTaskQueue.empty() && canRunIdleTaskNow()) {

95 T = std::move(IdleTaskQueue.front());

96 IdleTaskQueue.pop_front();

97 TaskKind = Idle;

98 ++Outstanding;

99 } else {

100 if (Outstanding == 0)

101 OutstandingCV.notify_all();

102 return;

103 }

104 }

105 }).detach();

106}

107

108void DynamicThreadPoolTaskDispatcher::shutdown() {

109 std::unique_lockstd::mutex Lock(DispatchMutex);

110 Shutdown = true;

111 OutstandingCV.wait(Lock, [this]() { return Outstanding == 0; });

112}

113

114bool DynamicThreadPoolTaskDispatcher::canRunMaterializationTaskNow() {

115 return !MaxMaterializationThreads ||

116 (NumMaterializationThreads < *MaxMaterializationThreads);

117}

118

119bool DynamicThreadPoolTaskDispatcher::canRunIdleTaskNow() {

120 return !MaxMaterializationThreads ||

121 (Outstanding < *MaxMaterializationThreads);

122}

123

124#endif

125

126}

127}

static LLVM_ABI const char * DefaultDescription

void shutdown() override

Called by ExecutionSession. Waits until all tasks have completed.

Definition TaskDispatch.cpp:29

void dispatch(std::unique_ptr< Task > T) override

Run the given task.

Definition TaskDispatch.cpp:27

virtual ~TaskDispatcher()

This is an optimization pass for GlobalISel generic memory operations.

bool isa(const From &Val)

isa - Return true if the parameter to the template is an instance of one of the template type argu...