// Copyright (c) 2012 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 CONTENT_RENDERER_MEDIA_SCOPED_LOOP_OBSERVER_H_ #define CONTENT_RENDERER_MEDIA_SCOPED_LOOP_OBSERVER_H_ #pragma once #include "base/memory/ref_counted.h" #include "base/message_loop.h" #include "base/message_loop_proxy.h" namespace base { class WaitableEvent; } // A common base class for AudioDevice and AudioInputDevice that manages // a message loop pointer and monitors it for destruction. If the object goes // out of scope before the message loop, the object will automatically remove // itself from the message loop's list of destruction observers. // NOTE: The class that inherits from this class must implement the // WillDestroyCurrentMessageLoop virtual method from DestructionObserver. class ScopedLoopObserver : public MessageLoop::DestructionObserver { public: explicit ScopedLoopObserver(MessageLoop* message_loop); virtual ~ScopedLoopObserver(); protected: // Accessor to the loop that's used by the derived class. base::MessageLoopProxy* message_loop() { return loop_; } private: // Call to add or remove ourselves from the list of destruction observers for // the message loop. void ObserveLoopDestruction(bool enable, base::WaitableEvent* done); // A pointer to the message loop's proxy. In case the loop gets destroyed // before this object goes out of scope, PostTask etc will fail but not crash. scoped_refptr loop_; DISALLOW_COPY_AND_ASSIGN(ScopedLoopObserver); }; #endif // CONTENT_RENDERER_MEDIA_SCOPED_LOOP_OBSERVER_H_