Home | History | Annotate | Download | only in base
      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 
     17 namespace rtc {
     18 
     19 enum {
     20   MSG_HAVEWORK = 0,
     21 };
     22 
     23 Worker::Worker() : worker_thread_(NULL) {}
     24 
     25 Worker::~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 
     32 bool 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 
     49 bool 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 
     64 void Worker::HaveWork() {
     65   ASSERT(worker_thread_ != NULL);
     66   worker_thread_->Post(this, MSG_HAVEWORK);
     67 }
     68 
     69 void 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