|  | #ifndef DMReporter_DEFINED | 
|  | #define DMReporter_DEFINED | 
|  |  | 
|  | #include "SkString.h" | 
|  | #include "SkTArray.h" | 
|  | #include "SkThread.h" | 
|  | #include "SkTime.h" | 
|  | #include "SkTypes.h" | 
|  |  | 
|  | // Used to report status changes including failures.  All public methods are threadsafe. | 
|  | namespace DM { | 
|  |  | 
|  | class Reporter : SkNoncopyable { | 
|  | public: | 
|  | Reporter() : fPending(0), fFailed(0) {} | 
|  |  | 
|  | void taskCreated()   { sk_atomic_inc(&fPending); } | 
|  | void taskDestroyed() { sk_atomic_dec(&fPending); } | 
|  | void fail(SkString msg); | 
|  |  | 
|  | void printStatus(SkString name, SkMSec timeMs) const; | 
|  |  | 
|  | void getFailures(SkTArray<SkString>*) const; | 
|  |  | 
|  | private: | 
|  | int32_t fPending; // atomic | 
|  | int32_t fFailed;  // atomic, == fFailures.count(). | 
|  |  | 
|  | mutable SkMutex fMutex;  // Guards fFailures. | 
|  | SkTArray<SkString> fFailures; | 
|  | }; | 
|  |  | 
|  |  | 
|  | }  // namespace DM | 
|  |  | 
|  | #endif  // DMReporter_DEFINED |