Skip to content

Commit ef4a87e

Browse files
committed
"better" management of native process objects
1 parent 0362f2d commit ef4a87e

3 files changed

Lines changed: 152 additions & 226 deletions

File tree

src/hx/libs/asys/libuv/system/LibuvChildProcess.cpp

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,29 @@
55
#include <memory>
66
#include "LibuvChildProcess.h"
77

8-
hx::asys::libuv::system::LibuvChildProcess::LibuvChildProcess()
9-
: request(std::move(std::make_unique<uv_process_t>()))
10-
, options(std::move(std::make_unique<uv_process_options_t>()))
11-
, exitCallback(null())
12-
, closeCallback(null())
8+
hx::asys::libuv::system::LibuvChildProcess::Ctx::Ctx()
9+
: request()
10+
, options()
11+
, arguments()
12+
, environment()
1313
, containers(3)
14+
, currentExitCode()
15+
, exitCallback(null())
1416
{
15-
hx::GCSetFinalizer(this, [](hx::Object* obj) -> void {
16-
reinterpret_cast<LibuvChildProcess*>(obj)->~LibuvChildProcess();
17-
});
17+
}
18+
19+
hx::asys::libuv::system::LibuvChildProcess::LibuvChildProcess(Ctx* ctx, Writable oStdin, Readable oStdout, Readable oStderr) : ctx(ctx)
20+
{
21+
HX_OBJ_WB_NEW_MARKED_OBJECT(this);
22+
23+
stdio_in = oStdin;
24+
stdio_out = oStdout;
25+
stdio_err = oStderr;
1826
}
1927

2028
hx::asys::Pid hx::asys::libuv::system::LibuvChildProcess::pid()
2129
{
22-
return request->pid;
30+
return ctx->request.pid;
2331
}
2432

2533
void hx::asys::libuv::system::LibuvChildProcess::sendSignal(hx::EnumBase signal, Dynamic cbSuccess, Dynamic cbFailure)
@@ -69,7 +77,7 @@ void hx::asys::libuv::system::LibuvChildProcess::sendSignal(hx::EnumBase signal,
6977
}
7078

7179
auto result = 0;
72-
if ((result = uv_process_kill(request.get(), signum)) < 0)
80+
if ((result = uv_process_kill(&ctx->request, signum)) < 0)
7381
{
7482
cbFailure(hx::asys::libuv::uv_err_to_enum(result));
7583
}
@@ -81,42 +89,19 @@ void hx::asys::libuv::system::LibuvChildProcess::sendSignal(hx::EnumBase signal,
8189

8290
void hx::asys::libuv::system::LibuvChildProcess::exitCode(Dynamic cbSuccess, Dynamic cbFailure)
8391
{
84-
if (currentExitCode.has_value())
92+
if (ctx->currentExitCode.has_value())
8593
{
86-
cbSuccess(static_cast<int>(currentExitCode.value()));
94+
cbSuccess(static_cast<int>(ctx->currentExitCode.value()));
8795
}
8896
else
8997
{
90-
exitCallback = cbSuccess.mPtr;
98+
ctx->exitCallback.rooted = cbSuccess.mPtr;
9199
}
92100
}
93101

94102
void hx::asys::libuv::system::LibuvChildProcess::close(Dynamic cbSuccess, Dynamic cbFailure)
95103
{
96-
closeCallback = cbSuccess.mPtr;
97-
98-
uv_close(reinterpret_cast<uv_handle_t*>(request.get()), [](uv_handle_t* handle) {
99-
auto gcZone = hx::AutoGCZone();
100-
auto process = std::unique_ptr<hx::RootedObject<hx::asys::libuv::system::LibuvChildProcess>>(reinterpret_cast<hx::RootedObject<hx::asys::libuv::system::LibuvChildProcess>*>(handle->data));
101-
auto callback = Dynamic(process->rooted->closeCallback);
102-
103-
if (null() != callback)
104-
{
105-
callback();
106-
}
107-
});
108-
}
109-
110-
void hx::asys::libuv::system::LibuvChildProcess::__Mark(hx::MarkContext* __inCtx)
111-
{
112-
HX_MARK_MEMBER(exitCallback);
113-
HX_MARK_MEMBER(closeCallback);
114-
}
104+
uv_close(reinterpret_cast<uv_handle_t*>(&ctx->request), hx::asys::libuv::clean_handle);
115105

116-
#ifdef HXCPP_VISIT_ALLOCS
117-
void hx::asys::libuv::system::LibuvChildProcess::__Visit(hx::VisitContext* __inCtx)
118-
{
119-
HX_VISIT_MEMBER(exitCallback);
120-
HX_VISIT_MEMBER(closeCallback);
121-
}
122-
#endif
106+
cbSuccess();
107+
}

src/hx/libs/asys/libuv/system/LibuvChildProcess.h

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,21 @@ namespace hx::asys::libuv::system
1313
class LibuvChildProcess final : public hx::asys::system::ChildProcess_obj
1414
{
1515
public:
16-
std::unique_ptr<uv_process_t> request;
17-
std::unique_ptr<uv_process_options_t> options;
18-
std::vector<char*> arguments;
19-
std::vector<char*> environment;
20-
std::vector<uv_stdio_container_t> containers;
21-
std::optional<int64_t> currentExitCode;
16+
struct Ctx {
17+
uv_process_t request;
18+
uv_process_options_t options;
19+
std::vector<char*> arguments;
20+
std::vector<char*> environment;
21+
std::vector<uv_stdio_container_t> containers;
22+
std::optional<int64_t> currentExitCode;
23+
hx::RootedObject<hx::Object> exitCallback;
2224

23-
Dynamic exitCallback;
24-
Dynamic closeCallback;
25+
Ctx();
26+
};
2527

26-
LibuvChildProcess();
27-
~LibuvChildProcess() = default;
28+
Ctx* ctx;
29+
30+
LibuvChildProcess(Ctx* ctx, Writable oStdin, Readable oStdout, Readable oStderr);
2831

2932
Pid pid() override;
3033

@@ -33,10 +36,5 @@ namespace hx::asys::libuv::system
3336
void exitCode(Dynamic cbSuccess, Dynamic cbFailure) override;
3437

3538
void close(Dynamic cbSuccess, Dynamic cbFailure) override;
36-
37-
void __Mark(hx::MarkContext* __inCtx) override;
38-
#ifdef HXCPP_VISIT_ALLOCS
39-
void __Visit(hx::VisitContext* __inCtx) override;
40-
#endif
4139
};
4240
}

0 commit comments

Comments
 (0)