mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-05 11:01:49 +00:00
Merge branch 'MihailRis:main' into main
This commit is contained in:
commit
879987486e
11 changed files with 105 additions and 9 deletions
|
|
@ -405,6 +405,20 @@ static int l_start_background_instance(lua::State* L) {
|
|||
|
||||
auto scriptPath = lua::require_lstring(L, 1);
|
||||
io::path outputPath = lua::isstring(L, 2) ? lua::require_lstring(L, 2) : "";
|
||||
|
||||
std::vector<std::pair<std::string, std::string>> projectArgs;
|
||||
if (lua::istable(L, 3)) {
|
||||
lua::pushnil(L);
|
||||
while (lua::next(L, 3)) {
|
||||
lua::pushvalue(L, -2);
|
||||
auto key = lua::tolstring(L, -1);
|
||||
auto value = lua::tolstring(L, -2);
|
||||
projectArgs.emplace_back(key, value);
|
||||
lua::pop(L, 2);
|
||||
}
|
||||
lua::pop(L);
|
||||
}
|
||||
|
||||
const auto& paths = engine->getPaths();
|
||||
|
||||
std::vector<std::string> args {
|
||||
|
|
@ -419,6 +433,17 @@ static int l_start_background_instance(lua::State* L) {
|
|||
args.emplace_back("--project");
|
||||
args.emplace_back(io::resolve(engine->getProject().path).u8string());
|
||||
|
||||
if (!projectArgs.empty()) {
|
||||
args.emplace_back("--");
|
||||
for (const auto& [key, value] : projectArgs) {
|
||||
if (key.empty()) {
|
||||
throw std::runtime_error("empty project argument name passed");
|
||||
}
|
||||
args.emplace_back("--" + key);
|
||||
args.emplace_back(value);
|
||||
}
|
||||
}
|
||||
|
||||
int handle = -1;
|
||||
for (int i = 0; i < ::processes.size(); i++) {
|
||||
if (!::processes[i] || !::processes[i]->isActive()) {
|
||||
|
|
|
|||
|
|
@ -237,7 +237,7 @@ static int l_udp_server_send_to(lua::State* L, network::Network& network) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int l_recv(lua::State* L, network::Network& network) {
|
||||
static int read(lua::State* L, network::Network& network, int (*fn)(network::TcpConnection*, char*, int)) {
|
||||
u64id_t id = lua::tointeger(L, 1);
|
||||
int length = lua::tointeger(L, 2);
|
||||
|
||||
|
|
@ -248,11 +248,12 @@ static int l_recv(lua::State* L, network::Network& network) {
|
|||
}
|
||||
|
||||
auto tcpConnection = dynamic_cast<network::TcpConnection*>(connection);
|
||||
auto tcp = dynamic_cast<network::TcpConnection*>(connection);
|
||||
|
||||
length = glm::min(length, tcpConnection->available());
|
||||
util::Buffer<char> buffer(length);
|
||||
|
||||
int size = tcpConnection->recv(buffer.data(), length);
|
||||
|
||||
int size = fn(tcp, buffer.data(), length);
|
||||
if (size == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -268,6 +269,18 @@ static int l_recv(lua::State* L, network::Network& network) {
|
|||
}
|
||||
}
|
||||
|
||||
static int l_recv(lua::State* L, network::Network& network) {
|
||||
return read(L, network, [](auto* tcp, char* buf, int len) {
|
||||
return tcp->recv(buf, len);
|
||||
});
|
||||
}
|
||||
|
||||
static int l_peek(lua::State* L, network::Network& network) {
|
||||
return read(L, network, [](auto* tcp, char* buf, int len) {
|
||||
return tcp->peek(buf, len);
|
||||
});
|
||||
}
|
||||
|
||||
static int l_available(lua::State* L, network::Network& network) {
|
||||
u64id_t id = lua::tointeger(L, 1);
|
||||
|
||||
|
|
@ -566,6 +579,7 @@ const luaL_Reg networklib[] = {
|
|||
{"__close", wrap<l_close>},
|
||||
{"__send", wrap<l_send>},
|
||||
{"__recv", wrap<l_recv>},
|
||||
{"__peek", wrap<l_peek>},
|
||||
{"__available", wrap<l_available>},
|
||||
{"__is_alive", wrap<l_is_alive>},
|
||||
{"__is_connected", wrap<l_is_connected>},
|
||||
|
|
|
|||
|
|
@ -196,15 +196,26 @@ public:
|
|||
});
|
||||
}
|
||||
|
||||
int recv(char* buffer, size_t length) override {
|
||||
std::lock_guard lock(mutex);
|
||||
|
||||
int read(char* buffer, size_t length) {
|
||||
if (state != ConnectionState::CONNECTED && readBatch.empty()) {
|
||||
return -1;
|
||||
}
|
||||
int size = std::min(readBatch.size(), length);
|
||||
std::memcpy(buffer, readBatch.data(), size);
|
||||
readBatch.erase(readBatch.begin(), readBatch.begin() + size);
|
||||
return size;
|
||||
}
|
||||
|
||||
int peek(char* buffer, size_t length) override {
|
||||
std::lock_guard lock(mutex);
|
||||
return read(buffer, length);
|
||||
}
|
||||
|
||||
int recv(char* buffer, size_t length) override {
|
||||
std::lock_guard lock(mutex);
|
||||
int size = read(buffer, length);
|
||||
if (size != -1) {
|
||||
readBatch.erase(readBatch.begin(), readBatch.begin() + size);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ namespace network {
|
|||
class ReadableConnection : public Connection {
|
||||
public:
|
||||
virtual int recv(char* buffer, size_t length) = 0;
|
||||
virtual int peek(char* buffer, size_t length) = 0;
|
||||
virtual int available() = 0;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -281,6 +281,9 @@ public:
|
|||
return exitCode == STILL_ACTIVE;
|
||||
}
|
||||
return false;
|
||||
#elif defined(__APPLE__)
|
||||
// FIXME: completely implement SystemProcess for MacOS
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue