
This CL makes AddRef() and Release() const member methods and the refcount integer mutable. This is reasonable, because they only manage the lifetime of the object, and this is also how it's done in Chromium. The purpose is to be able to capture a const pointer in a scoped_refptr, which is currenty impossible. The practial problem this CL solves is this: void Foo::Bar() const {} rtc::Callback0<void> Foo::MakeClosure() const { return rtc::Bind(&Foo::Bar, this); } We currently capture |this| as const Foo*. With this CL, |this| will be captured as scoped_refptr<const Foo>. A test is also added in bind_unittest to check this behaviour. BUG=webrtc:5065 R=perkj@webrtc.org, tommi@webrtc.org Review URL: https://codereview.webrtc.org/1403683004 . Cr-Commit-Position: refs/heads/master@{#10253}
82 lines
2.8 KiB
C++
82 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) 2012 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.
|
|
*/
|
|
|
|
#ifndef MODULES_INTERFACE_MODULE_H_
|
|
#define MODULES_INTERFACE_MODULE_H_
|
|
|
|
#include "webrtc/typedefs.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class ProcessThread;
|
|
|
|
class Module {
|
|
public:
|
|
// Returns the number of milliseconds until the module wants a worker
|
|
// thread to call Process.
|
|
// This method is called on the same worker thread as Process will
|
|
// be called on.
|
|
// TODO(tommi): Almost all implementations of this function, need to know
|
|
// the current tick count. Consider passing it as an argument. It could
|
|
// also improve the accuracy of when the next callback occurs since the
|
|
// thread that calls Process() will also have it's tick count reference
|
|
// which might not match with what the implementations use.
|
|
virtual int64_t TimeUntilNextProcess() = 0;
|
|
|
|
// Process any pending tasks such as timeouts.
|
|
// Called on a worker thread.
|
|
virtual int32_t Process() = 0;
|
|
|
|
// This method is called when the module is attached to a *running* process
|
|
// thread or detached from one. In the case of detaching, |process_thread|
|
|
// will be nullptr.
|
|
//
|
|
// This method will be called in the following cases:
|
|
//
|
|
// * Non-null process_thread:
|
|
// * ProcessThread::RegisterModule() is called while the thread is running.
|
|
// * ProcessThread::Start() is called and RegisterModule has previously
|
|
// been called. The thread will be started immediately after notifying
|
|
// all modules.
|
|
//
|
|
// * Null process_thread:
|
|
// * ProcessThread::DeRegisterModule() is called while the thread is
|
|
// running.
|
|
// * ProcessThread::Stop() was called and the thread has been stopped.
|
|
//
|
|
// NOTE: This method is not called from the worker thread itself, but from
|
|
// the thread that registers/deregisters the module or calls Start/Stop.
|
|
virtual void ProcessThreadAttached(ProcessThread* process_thread) {}
|
|
|
|
protected:
|
|
virtual ~Module() {}
|
|
};
|
|
|
|
// Reference counted version of the Module interface.
|
|
class RefCountedModule : public Module {
|
|
public:
|
|
// Increase the reference count by one.
|
|
// Returns the incremented reference count.
|
|
virtual int32_t AddRef() const = 0;
|
|
|
|
// Decrease the reference count by one.
|
|
// Returns the decreased reference count.
|
|
// Returns 0 if the last reference was just released.
|
|
// When the reference count reaches 0 the object will self-destruct.
|
|
virtual int32_t Release() const = 0;
|
|
|
|
protected:
|
|
~RefCountedModule() override = default;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_INTERFACE_MODULE_H_
|