mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 22:21:18 +00:00
Add support for non-blocking IO mode to OS.execute_with_pipe.
This commit is contained in:
parent
05d985496c
commit
10f3c1f587
16 changed files with 67 additions and 26 deletions
|
|
@ -41,7 +41,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
Error FileAccessUnixPipe::open_existing(int p_rfd, int p_wfd) {
|
||||
Error FileAccessUnixPipe::open_existing(int p_rfd, int p_wfd, bool p_blocking) {
|
||||
// Open pipe using handles created by pipe(fd) call in the OS.execute_with_pipe.
|
||||
_close();
|
||||
|
||||
|
|
@ -51,6 +51,11 @@ Error FileAccessUnixPipe::open_existing(int p_rfd, int p_wfd) {
|
|||
fd[0] = p_rfd;
|
||||
fd[1] = p_wfd;
|
||||
|
||||
if (!p_blocking) {
|
||||
fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK);
|
||||
fcntl(fd[1], F_SETFL, fcntl(fd[1], F_GETFL) | O_NONBLOCK);
|
||||
}
|
||||
|
||||
last_error = OK;
|
||||
return OK;
|
||||
}
|
||||
|
|
@ -74,7 +79,7 @@ Error FileAccessUnixPipe::open_internal(const String &p_path, int p_mode_flags)
|
|||
ERR_FAIL_COND_V_MSG(!S_ISFIFO(st.st_mode), ERR_ALREADY_IN_USE, "Pipe name is already used by file.");
|
||||
}
|
||||
|
||||
int f = ::open(path.utf8().get_data(), O_RDWR | O_CLOEXEC);
|
||||
int f = ::open(path.utf8().get_data(), O_RDWR | O_CLOEXEC | O_NONBLOCK);
|
||||
if (f < 0) {
|
||||
switch (errno) {
|
||||
case ENOENT: {
|
||||
|
|
@ -129,8 +134,11 @@ uint64_t FileAccessUnixPipe::get_buffer(uint8_t *p_dst, uint64_t p_length) const
|
|||
ERR_FAIL_COND_V_MSG(fd[0] < 0, -1, "Pipe must be opened before use.");
|
||||
ERR_FAIL_COND_V(!p_dst && p_length > 0, -1);
|
||||
|
||||
uint64_t read = ::read(fd[0], p_dst, p_length);
|
||||
if (read == p_length) {
|
||||
ssize_t read = ::read(fd[0], p_dst, p_length);
|
||||
if (read == -1) {
|
||||
last_error = ERR_FILE_CANT_READ;
|
||||
read = 0;
|
||||
} else if (read != (ssize_t)p_length) {
|
||||
last_error = ERR_FILE_CANT_READ;
|
||||
} else {
|
||||
last_error = OK;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue