mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix udp BorrowMutError (#6221)
This commit is contained in:
parent
d9c6b109df
commit
54c3f8e27f
2 changed files with 26 additions and 9 deletions
|
@ -161,6 +161,7 @@ fn receive_udp(
|
||||||
Ok(JsonOp::Async(op.boxed_local()))
|
Ok(JsonOp::Async(op.boxed_local()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(ry) Rename to op_datagram_receive
|
||||||
fn op_receive(
|
fn op_receive(
|
||||||
isolate_state: &mut CoreIsolateState,
|
isolate_state: &mut CoreIsolateState,
|
||||||
state: &State,
|
state: &State,
|
||||||
|
@ -191,6 +192,7 @@ struct SendArgs {
|
||||||
transport_args: ArgsEnum,
|
transport_args: ArgsEnum,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(ry) Rename to op_datagram_send
|
||||||
fn op_send(
|
fn op_send(
|
||||||
isolate_state: &mut CoreIsolateState,
|
isolate_state: &mut CoreIsolateState,
|
||||||
state: &State,
|
state: &State,
|
||||||
|
@ -208,21 +210,21 @@ fn op_send(
|
||||||
transport_args: ArgsEnum::Ip(args),
|
transport_args: ArgsEnum::Ip(args),
|
||||||
} if transport == "udp" => {
|
} if transport == "udp" => {
|
||||||
state.check_net(&args.hostname, args.port)?;
|
state.check_net(&args.hostname, args.port)?;
|
||||||
|
let addr = resolve_addr(&args.hostname, args.port)?;
|
||||||
let op = async move {
|
let f = poll_fn(move |cx| {
|
||||||
let mut resource_table = resource_table.borrow_mut();
|
let mut resource_table = resource_table.borrow_mut();
|
||||||
let resource = resource_table
|
let resource = resource_table
|
||||||
.get_mut::<UdpSocketResource>(rid as u32)
|
.get_mut::<UdpSocketResource>(rid as u32)
|
||||||
.ok_or_else(|| {
|
.ok_or_else(|| {
|
||||||
OpError::bad_resource("Socket has been closed".to_string())
|
OpError::bad_resource("Socket has been closed".to_string())
|
||||||
})?;
|
})?;
|
||||||
let socket = &mut resource.socket;
|
resource
|
||||||
let addr = resolve_addr(&args.hostname, args.port)?;
|
.socket
|
||||||
socket.send_to(&zero_copy, addr).await?;
|
.poll_send_to(cx, &zero_copy, &addr)
|
||||||
Ok(json!({}))
|
.map_err(OpError::from)
|
||||||
};
|
.map_ok(|_| json!({}))
|
||||||
|
});
|
||||||
Ok(JsonOp::Async(op.boxed_local()))
|
Ok(JsonOp::Async(f.boxed_local()))
|
||||||
}
|
}
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
SendArgs {
|
SendArgs {
|
||||||
|
|
|
@ -254,6 +254,21 @@ unitTest(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
unitTest(
|
||||||
|
{ ignore: Deno.build.os === "windows", perms: { net: true } },
|
||||||
|
async function netUdpBorrowMutError(): Promise<void> {
|
||||||
|
const socket = Deno.listenDatagram({
|
||||||
|
port: 4501,
|
||||||
|
transport: "udp",
|
||||||
|
});
|
||||||
|
// Panic happened on second send: BorrowMutError
|
||||||
|
const a = socket.send(new Uint8Array(), socket.addr);
|
||||||
|
const b = socket.send(new Uint8Array(), socket.addr);
|
||||||
|
await Promise.all([a, b]);
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
unitTest(
|
unitTest(
|
||||||
{ ignore: Deno.build.os === "windows", perms: { read: true, write: true } },
|
{ ignore: Deno.build.os === "windows", perms: { read: true, write: true } },
|
||||||
async function netUnixPacketSendReceive(): Promise<void> {
|
async function netUnixPacketSendReceive(): Promise<void> {
|
||||||
|
|
Loading…
Add table
Reference in a new issue