blob: 18dd90d5f79fcffccb4b5e617849e86cdf741b82 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 SRC_DEVICES_BIN_DRIVER_HOST_CONNECTION_DESTROYER_H_
#define SRC_DEVICES_BIN_DRIVER_HOST_CONNECTION_DESTROYER_H_
#include <lib/async/cpp/receiver.h>
#include <zircon/syscalls.h>
class DeviceControllerConnection;
struct ProxyIostate;
// Handles destroying Connection objects in the single-threaded DriverHostContext::loop().
// This allows us to prevent races between canceling waiting on the connection
// channel and executing the connection's handler.
class ConnectionDestroyer {
public:
static ConnectionDestroyer* Get() {
static ConnectionDestroyer destroyer;
return &destroyer;
}
zx_status_t QueueDeviceControllerConnection(async_dispatcher_t* dispatcher,
DeviceControllerConnection* conn);
zx_status_t QueueProxyConnection(async_dispatcher_t* dispatcher, ProxyIostate* conn);
private:
ConnectionDestroyer() = default;
ConnectionDestroyer(const ConnectionDestroyer&) = delete;
ConnectionDestroyer& operator=(const ConnectionDestroyer&) = delete;
ConnectionDestroyer(ConnectionDestroyer&&) = delete;
ConnectionDestroyer& operator=(ConnectionDestroyer&&) = delete;
static void Handler(async_dispatcher_t* dispatcher, async::Receiver* receiver, zx_status_t status,
const zx_packet_user_t* data);
enum class Type {
DeviceController,
Proxy,
};
async::Receiver receiver_{ConnectionDestroyer::Handler};
};
#endif // SRC_DEVICES_BIN_DRIVER_HOST_CONNECTION_DESTROYER_H_