1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/*
2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc.
3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger *
4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file.
6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */
7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkCountdown.h"
9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkThread.h"
10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerSkCountdown::SkCountdown(int32_t count)
12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger: fCount(count) {}
13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCountdown::reset(int32_t count) {
15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fCount = count;
16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCountdown::run() {
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    if (sk_atomic_dec(&fCount) == 1) {
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fReady.lock();
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fReady.signal();
22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fReady.unlock();
23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkCountdown::wait() {
27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fReady.lock();
28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    while (fCount > 0) {
29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fReady.wait();
30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    fReady.unlock();
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
33