소스 검색

Merge pull request #1106 from reillyeon:run_many

PiperOrigin-RevId: 520171344
main
Victor Costan 2 년 전
부모
커밋
80d858fb2a
1개의 변경된 파일16개의 추가작업 그리고 11개의 파일을 삭제
  1. +16
    -11
      util/env_test.cc

+ 16
- 11
util/env_test.cc 파일 보기

@ -96,40 +96,45 @@ TEST_F(EnvTest, RunMany) {
struct RunState { struct RunState {
port::Mutex mu; port::Mutex mu;
port::CondVar cvar{&mu}; port::CondVar cvar{&mu};
int last_id = 0; int run_count = 0;
}; };
struct Callback { struct Callback {
RunState* state_; // Pointer to shared state. RunState* const state_; // Pointer to shared state.
const int id_; // Order# for the execution of this callback. bool run = false;
Callback(RunState* s, int id) : state_(s), id_(id) {} Callback(RunState* s) : state_(s) {}
static void Run(void* arg) { static void Run(void* arg) {
Callback* callback = reinterpret_cast<Callback*>(arg); Callback* callback = reinterpret_cast<Callback*>(arg);
RunState* state = callback->state_; RunState* state = callback->state_;
MutexLock l(&state->mu); MutexLock l(&state->mu);
ASSERT_EQ(state->last_id, callback->id_ - 1); state->run_count++;
state->last_id = callback->id_; callback->run = true;
state->cvar.Signal(); state->cvar.Signal();
} }
}; };
RunState state; RunState state;
Callback callback1(&state, 1); Callback callback1(&state);
Callback callback2(&state, 2); Callback callback2(&state);
Callback callback3(&state, 3); Callback callback3(&state);
Callback callback4(&state, 4); Callback callback4(&state);
env_->Schedule(&Callback::Run, &callback1); env_->Schedule(&Callback::Run, &callback1);
env_->Schedule(&Callback::Run, &callback2); env_->Schedule(&Callback::Run, &callback2);
env_->Schedule(&Callback::Run, &callback3); env_->Schedule(&Callback::Run, &callback3);
env_->Schedule(&Callback::Run, &callback4); env_->Schedule(&Callback::Run, &callback4);
MutexLock l(&state.mu); MutexLock l(&state.mu);
while (state.last_id != 4) { while (state.run_count != 4) {
state.cvar.Wait(); state.cvar.Wait();
} }
ASSERT_TRUE(callback1.run);
ASSERT_TRUE(callback2.run);
ASSERT_TRUE(callback3.run);
ASSERT_TRUE(callback4.run);
} }
struct State { struct State {

||||||
x
 
000:0
불러오는 중...
취소
저장