 f048872e91
			
		
	
	f048872e91
	
	
	
		
			
			migrating talk/base to webrtc/base. BUG=N/A R=niklas.enbom@webrtc.org Review URL: https://webrtc-codereview.appspot.com/17479005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6129 4adac7df-926f-26a2-2b94-8c16560cd09d
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
 | |
|  *
 | |
|  *  Use of this source code is governed by a BSD-style license
 | |
|  *  that can be found in the LICENSE file in the root of the source
 | |
|  *  tree. An additional intellectual property rights grant can be found
 | |
|  *  in the file PATENTS.  All contributing project authors may
 | |
|  *  be found in the AUTHORS file in the root of the source tree.
 | |
|  */
 | |
| 
 | |
| #include "webrtc/base/worker.h"
 | |
| 
 | |
| #include "webrtc/base/common.h"
 | |
| #include "webrtc/base/logging.h"
 | |
| #include "webrtc/base/thread.h"
 | |
| 
 | |
| namespace rtc {
 | |
| 
 | |
| enum {
 | |
|   MSG_HAVEWORK = 0,
 | |
| };
 | |
| 
 | |
| Worker::Worker() : worker_thread_(NULL) {}
 | |
| 
 | |
| Worker::~Worker() {
 | |
|   // We need to already be stopped before being destroyed. We cannot call
 | |
|   // StopWork() from here because the subclass's data has already been
 | |
|   // destructed, so OnStop() cannot be called.
 | |
|   ASSERT(!worker_thread_);
 | |
| }
 | |
| 
 | |
| bool Worker::StartWork() {
 | |
|   rtc::Thread *me = rtc::Thread::Current();
 | |
|   if (worker_thread_) {
 | |
|     if (worker_thread_ == me) {
 | |
|       // Already working on this thread, so nothing to do.
 | |
|       return true;
 | |
|     } else {
 | |
|       LOG(LS_ERROR) << "Automatically switching threads is not supported";
 | |
|       ASSERT(false);
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
|   worker_thread_ = me;
 | |
|   OnStart();
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool Worker::StopWork() {
 | |
|   if (!worker_thread_) {
 | |
|     // Already not working, so nothing to do.
 | |
|     return true;
 | |
|   } else if (worker_thread_ != rtc::Thread::Current()) {
 | |
|     LOG(LS_ERROR) << "Stopping from a different thread is not supported";
 | |
|     ASSERT(false);
 | |
|     return false;
 | |
|   }
 | |
|   OnStop();
 | |
|   worker_thread_->Clear(this, MSG_HAVEWORK);
 | |
|   worker_thread_ = NULL;
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| void Worker::HaveWork() {
 | |
|   ASSERT(worker_thread_ != NULL);
 | |
|   worker_thread_->Post(this, MSG_HAVEWORK);
 | |
| }
 | |
| 
 | |
| void Worker::OnMessage(rtc::Message *msg) {
 | |
|   ASSERT(msg->message_id == MSG_HAVEWORK);
 | |
|   ASSERT(worker_thread_ == rtc::Thread::Current());
 | |
|   OnHaveWork();
 | |
| }
 | |
| 
 | |
| }  // namespace rtc
 |