blob: d8024fe57f51943aac49c7cd8c86e98b85ef08d7 [file] [log] [blame]
// Copyright 2017 The Chromium OS 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 CHAPS_DBUS_SCOPED_BUS_H_
#define CHAPS_DBUS_SCOPED_BUS_H_
#include <base/memory/ref_counted.h>
#include <base/single_thread_task_runner.h>
#include <dbus/bus.h>
namespace chaps {
// After we have an ObjectProxy, there is a reference cycle between the
// Bus and the ObjectProxy. This can be resolved by shutting down the bus
// before we get rid of it. We may need to shut down the bus on another
// thread to satisfy threading restrictions.
class ScopedBus {
public:
ScopedBus();
// Substitute for a normal dbus::Bus constructor.
explicit ScopedBus(const dbus::Bus::Options& options);
// Move constructor.
ScopedBus(ScopedBus&& other);
ScopedBus(const ScopedBus&) = delete;
ScopedBus& operator=(const ScopedBus&) = delete;
virtual ~ScopedBus();
// Move assignment.
ScopedBus& operator=(ScopedBus&& other);
// ScopedBus should be a drop-in replacement for dbus::Bus so
// this overload is provided.
dbus::Bus* operator->() const { return bus_.get(); }
scoped_refptr<dbus::Bus> get() { return bus_; }
private:
scoped_refptr<dbus::Bus> bus_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
};
} // namespace chaps
#endif // CHAPS_DBUS_SCOPED_BUS_H_