// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef REMOTING_BASE_TASK_THREAD_PROXY_H_ #define REMOTING_BASE_TASK_THREAD_PROXY_H_ #include "base/message_loop.h" namespace remoting { // This is a refcounted class that is used to switch to the appropriate thread // before running a task on a target object. It should be used whenever you // need to post to an object, but: // (1) You don't know when the object might be deleted, and // (2) You cannot subclass the target from RefCountedThreadSafe. // // Example usage: // Instead of: // MyClass* obj; // obj->Method(param); // Use: // proxy->Call(base::Bind(&MyClass::Method, // base::Unretained(obj), // param); class TaskThreadProxy : public base::RefCountedThreadSafe { public: TaskThreadProxy(MessageLoop* loop); // Detach should be called when the target of the posted task is being // destroyed. void Detach(); void Call(const base::Closure& closure); private: friend class base::RefCountedThreadSafe; virtual ~TaskThreadProxy(); void CallClosure(const base::Closure& closure); MessageLoop* message_loop_; DISALLOW_COPY_AND_ASSIGN(TaskThreadProxy); }; } // namespace remoting #endif // REMOTING_BASE_TASK_THREAD_PROXY_H_