1/* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#include "webrtc/base/worker.h" 12 13#include "webrtc/base/common.h" 14#include "webrtc/base/logging.h" 15#include "webrtc/base/thread.h" 16 17namespace rtc { 18 19enum { 20 MSG_HAVEWORK = 0, 21}; 22 23Worker::Worker() : worker_thread_(NULL) {} 24 25Worker::~Worker() { 26 // We need to already be stopped before being destroyed. We cannot call 27 // StopWork() from here because the subclass's data has already been 28 // destructed, so OnStop() cannot be called. 29 ASSERT(!worker_thread_); 30} 31 32bool Worker::StartWork() { 33 rtc::Thread *me = rtc::Thread::Current(); 34 if (worker_thread_) { 35 if (worker_thread_ == me) { 36 // Already working on this thread, so nothing to do. 37 return true; 38 } else { 39 LOG(LS_ERROR) << "Automatically switching threads is not supported"; 40 ASSERT(false); 41 return false; 42 } 43 } 44 worker_thread_ = me; 45 OnStart(); 46 return true; 47} 48 49bool Worker::StopWork() { 50 if (!worker_thread_) { 51 // Already not working, so nothing to do. 52 return true; 53 } else if (worker_thread_ != rtc::Thread::Current()) { 54 LOG(LS_ERROR) << "Stopping from a different thread is not supported"; 55 ASSERT(false); 56 return false; 57 } 58 OnStop(); 59 worker_thread_->Clear(this, MSG_HAVEWORK); 60 worker_thread_ = NULL; 61 return true; 62} 63 64void Worker::HaveWork() { 65 ASSERT(worker_thread_ != NULL); 66 worker_thread_->Post(this, MSG_HAVEWORK); 67} 68 69void Worker::OnMessage(rtc::Message *msg) { 70 ASSERT(msg->message_id == MSG_HAVEWORK); 71 ASSERT(worker_thread_ == rtc::Thread::Current()); 72 OnHaveWork(); 73} 74 75} // namespace rtc 76