blob: 3e90d64568a2c19f64b552fb18a795d3bb8474ab [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.
#include "connection_destroyer.h"
#include <inttypes.h>
#include "device_controller_connection.h"
#include "proxy_iostate.h"
#include "src/devices/lib/log/log.h"
#include "zx_device.h"
zx_status_t ConnectionDestroyer::QueueProxyConnection(async_dispatcher_t* dispatcher,
ProxyIostate* conn) {
zx_packet_user_t pkt = {};
pkt.u64[0] = static_cast<uint64_t>(Type::Proxy);
pkt.u64[1] = reinterpret_cast<uintptr_t>(conn);
return receiver_.QueuePacket(dispatcher, &pkt);
}
zx_status_t ConnectionDestroyer::QueueDeviceControllerConnection(async_dispatcher_t* dispatcher,
DeviceControllerConnection* conn) {
zx_packet_user_t pkt = {};
pkt.u64[0] = static_cast<uint64_t>(Type::DeviceController);
pkt.u64[1] = reinterpret_cast<uintptr_t>(conn);
return receiver_.QueuePacket(dispatcher, &pkt);
}
void ConnectionDestroyer::Handler(async_dispatcher_t* dispatcher, async::Receiver* receiver,
zx_status_t status, const zx_packet_user_t* data) {
Type type = static_cast<Type>(data->u64[0]);
uintptr_t ptr = data->u64[1];
switch (type) {
case Type::DeviceController: {
auto conn = reinterpret_cast<DeviceControllerConnection*>(ptr);
VLOGF(1, "Destroying driver_manager connection %p", conn);
delete conn;
break;
}
case Type::Proxy: {
auto conn = reinterpret_cast<ProxyIostate*>(ptr);
VLOGF(1, "Destroying proxy connection %p", conn);
delete conn;
break;
}
default:
ZX_ASSERT_MSG(false, "Unknown IosDestructionType %" PRIu64 "\n", data->u64[0]);
}
}