Skip to content

Commit d6f5f4d

Browse files
committed
Cleanups
1 parent cdc59de commit d6f5f4d

File tree

2 files changed

+52
-47
lines changed

2 files changed

+52
-47
lines changed

src/workerd/io/container-client.c++

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,64 @@ kj::Promise<void> ContainerStreamSharedState::waitForMessage() {
4949
return kj::mv(paf.promise);
5050
}
5151

52+
void ContainerAsyncStream::shutdownWrite() {
53+
KJ_DBG("SHUTDOWN_WRITE");
54+
service->shutdown_write();
55+
}
56+
5257
kj::Promise<size_t> ContainerAsyncStream::tryRead(void* buffer, size_t minBytes, size_t maxBytes) {
5358
KJ_DBG("TRY_READ");
5459
KJ_IF_SOME(consumed, sharedState->tryRead(buffer, minBytes, maxBytes)) {
55-
return consumed;
60+
co_return consumed;
5661
}
5762

5863
if (minBytes == 0) {
59-
return minBytes;
64+
co_return minBytes;
6065
}
6166

62-
return sharedState->waitForMessage().then(
63-
[this, buffer, minBytes, maxBytes]() -> kj::Promise<size_t> {
64-
return tryRead(buffer, minBytes, maxBytes);
65-
});
67+
co_await sharedState->waitForMessage();
68+
co_return co_await tryRead(buffer, minBytes, maxBytes);
69+
}
70+
71+
kj::Promise<void> ContainerAsyncStream::write(kj::ArrayPtr<const kj::byte> buffer) {
72+
KJ_DBG("WRITE");
73+
if (service->write_data(buffer.as<Rust>())) {
74+
return kj::READY_NOW;
75+
} else {
76+
KJ_DBG("WRITE FAILED");
77+
return KJ_EXCEPTION(DISCONNECTED, "Write failed: stream is disconnected");
78+
}
79+
}
80+
81+
kj::Promise<void> ContainerAsyncStream::write(
82+
kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) {
83+
KJ_DBG("WRITE_ALL");
84+
for (auto piece: pieces) {
85+
if (!service->write_data(piece.as<Rust>())) {
86+
KJ_DBG("WRITE_ALL FAILED");
87+
return KJ_EXCEPTION(DISCONNECTED, "Write failed: stream is disconnected");
88+
}
89+
}
90+
KJ_DBG("WRITE_ALL FINISHED");
91+
return kj::READY_NOW;
92+
}
93+
94+
kj::Promise<void> ContainerAsyncStream::whenWriteDisconnected() {
95+
// TODO(now): this is wrong, the returned promise should fulfill when the write end disconnects.
96+
// as written this will only return a fulfilled promise if the write end already disconnected.
97+
if (service->is_write_disconnected()) {
98+
return kj::READY_NOW;
99+
}
100+
return kj::NEVER_DONE;
66101
}
67102

68103
kj::Own<ContainerAsyncStream> createContainerRpcStream(
69104
kj::StringPtr address, kj::StringPtr containerName) {
70-
auto sharedState = kj::heap<ContainerStreamSharedState>();
71-
ContainerStreamSharedState* ptr = sharedState.get();
105+
auto sharedState = kj::rc<ContainerStreamSharedState>();
72106

73-
rust::container::MessageCallback callback = [ptr](::rust::Slice<const uint8_t> message) {
74-
ptr->enqueueMessage(message);
107+
rust::container::MessageCallback callback = [sharedState = sharedState.addRef()](
108+
::rust::Slice<const uint8_t> message) mutable {
109+
sharedState->enqueueMessage(message);
75110
};
76111

77112
auto service = rust::container::new_service(address.cStr(), containerName.cStr(), callback);

src/workerd/io/container-client.h

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -31,53 +31,23 @@ class ContainerStreamSharedState;
3131
// tryRead() method (which provides those messages to the C++ side).
3232
struct ContainerAsyncStream final: public kj::AsyncIoStream {
3333
ContainerAsyncStream(::rust::Box<rust::container::ContainerService> service,
34-
kj::Own<ContainerStreamSharedState> sharedState)
34+
kj::Rc<ContainerStreamSharedState> sharedState)
3535
: service(kj::mv(service)),
3636
sharedState(kj::mv(sharedState)) {}
3737

38-
void shutdownWrite() override {
39-
KJ_DBG("SHUTDOWN_WRITE");
40-
service->shutdown_write();
41-
}
42-
38+
void shutdownWrite() override;
4339
kj::Promise<size_t> tryRead(void* buffer, size_t minBytes, size_t maxBytes) override;
44-
45-
kj::Promise<void> write(kj::ArrayPtr<const kj::byte> buffer) override {
46-
KJ_DBG("WRITE");
47-
if (service->write_data(buffer.as<Rust>())) {
48-
return kj::READY_NOW;
49-
} else {
50-
KJ_DBG("WRITE FAILED");
51-
return KJ_EXCEPTION(DISCONNECTED, "Write failed: stream is disconnected");
52-
}
53-
}
54-
55-
kj::Promise<void> write(kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) override {
56-
KJ_DBG("WRITE_ALL");
57-
for (auto piece: pieces) {
58-
if (!service->write_data(piece.as<Rust>())) {
59-
KJ_DBG("WRITE_ALL FAILED");
60-
return KJ_EXCEPTION(DISCONNECTED, "Write failed: stream is disconnected");
61-
}
62-
}
63-
KJ_DBG("WRITE_ALL FINISHED");
64-
return kj::READY_NOW;
65-
}
66-
67-
kj::Promise<void> whenWriteDisconnected() override {
68-
if (service->is_write_disconnected()) {
69-
return kj::READY_NOW;
70-
}
71-
return kj::NEVER_DONE;
72-
}
40+
kj::Promise<void> write(kj::ArrayPtr<const kj::byte> buffer) override;
41+
kj::Promise<void> write(kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) override;
42+
kj::Promise<void> whenWriteDisconnected() override;
7343

7444
private:
7545
::rust::Box<rust::container::ContainerService> service;
76-
kj::Own<ContainerStreamSharedState> sharedState;
46+
kj::Rc<ContainerStreamSharedState> sharedState;
7747
};
7848

7949
// Shared state between MessageCallback and ContainerAsyncStream
80-
class ContainerStreamSharedState {
50+
class ContainerStreamSharedState: public kj::Refcounted {
8151
public:
8252
ContainerStreamSharedState();
8353

0 commit comments

Comments
 (0)