diff --git a/libc/src/spawn/CMakeLists.txt b/libc/src/spawn/CMakeLists.txt --- a/libc/src/spawn/CMakeLists.txt +++ b/libc/src/spawn/CMakeLists.txt @@ -30,6 +30,7 @@ .file_actions libc.include.errno libc.include.spawn + libc.src.__support.CPP.new ) add_entrypoint_object( @@ -42,6 +43,7 @@ .file_actions libc.include.errno libc.include.spawn + libc.src.__support.CPP.new ) add_entrypoint_object( @@ -54,6 +56,7 @@ .file_actions libc.include.errno libc.include.spawn + libc.src.__support.CPP.new ) add_entrypoint_object( @@ -66,6 +69,7 @@ .file_actions libc.include.errno libc.include.spawn + libc.src.__support.CPP.new ) add_entrypoint_object( diff --git a/libc/src/spawn/file_actions.h b/libc/src/spawn/file_actions.h --- a/libc/src/spawn/file_actions.h +++ b/libc/src/spawn/file_actions.h @@ -23,6 +23,21 @@ ActionType type; BaseSpawnFileAction *next; + + static void add_action(posix_spawn_file_actions_t *actions, + BaseSpawnFileAction *act) { + if (actions->__back != nullptr) { + auto *back = reinterpret_cast(actions->__back); + back->next = act; + actions->__back = act; + } else { + // First action is being added. + actions->__front = actions->__back = act; + } + } + +protected: + explicit BaseSpawnFileAction(ActionType t) : type(t), next(nullptr) {} }; struct SpawnFileOpenAction : public BaseSpawnFileAction { @@ -30,28 +45,27 @@ int fd; int oflag; mode_t mode; + + SpawnFileOpenAction(const char *p, int fdesc, int flags, mode_t m) + : BaseSpawnFileAction(BaseSpawnFileAction::OPEN), path(p), fd(fdesc), + oflag(flags), mode(m) {} }; struct SpawnFileCloseAction : public BaseSpawnFileAction { int fd; + + SpawnFileCloseAction(int fdesc) + : BaseSpawnFileAction(BaseSpawnFileAction::CLOSE), fd(fdesc) {} }; struct SpawnFileDup2Action : public BaseSpawnFileAction { int fd; int newfd; -}; -inline void enque_spawn_action(posix_spawn_file_actions_t *actions, - BaseSpawnFileAction *act) { - if (actions->__back != nullptr) { - auto *back = reinterpret_cast(actions->__back); - back->next = act; - actions->__back = act; - } else { - // First action is being added. - actions->__front = actions->__back = act; - } -} + SpawnFileDup2Action(int fdesc, int new_fdesc) + : BaseSpawnFileAction(BaseSpawnFileAction::DUP2), fd(fdesc), + newfd(new_fdesc) {} +}; } // namespace __llvm_libc diff --git a/libc/src/spawn/posix_spawn_file_actions_addclose.cpp b/libc/src/spawn/posix_spawn_file_actions_addclose.cpp --- a/libc/src/spawn/posix_spawn_file_actions_addclose.cpp +++ b/libc/src/spawn/posix_spawn_file_actions_addclose.cpp @@ -9,11 +9,11 @@ #include "posix_spawn_file_actions_addclose.h" #include "file_actions.h" +#include "src/__support/CPP/new.h" #include "src/__support/common.h" #include #include -#include // For malloc namespace __llvm_libc { @@ -24,14 +24,12 @@ if (fd < 0) return EBADF; - auto *act = reinterpret_cast( - malloc(sizeof(SpawnFileCloseAction))); - if (act == nullptr) + AllocChecker ac; + auto *act = new (ac) SpawnFileCloseAction(fd); + if (!ac) return ENOMEM; + BaseSpawnFileAction::add_action(actions, act); - act->type = BaseSpawnFileAction::CLOSE; - act->fd = fd; - enque_spawn_action(actions, act); return 0; } diff --git a/libc/src/spawn/posix_spawn_file_actions_adddup2.cpp b/libc/src/spawn/posix_spawn_file_actions_adddup2.cpp --- a/libc/src/spawn/posix_spawn_file_actions_adddup2.cpp +++ b/libc/src/spawn/posix_spawn_file_actions_adddup2.cpp @@ -9,11 +9,11 @@ #include "posix_spawn_file_actions_adddup2.h" #include "file_actions.h" +#include "src/__support/CPP/new.h" #include "src/__support/common.h" #include #include -#include // For malloc namespace __llvm_libc { @@ -24,16 +24,12 @@ if (fd < 0 || newfd < 0) return EBADF; - auto *act = reinterpret_cast( - malloc(sizeof(SpawnFileDup2Action))); - if (act == nullptr) + AllocChecker ac; + auto *act = new (ac) SpawnFileDup2Action(fd, newfd); + if (!ac) return ENOMEM; + BaseSpawnFileAction::add_action(actions, act); - act->type = BaseSpawnFileAction::DUP2; - act->fd = fd; - act->newfd = newfd; - act->next = nullptr; - enque_spawn_action(actions, act); return 0; } diff --git a/libc/src/spawn/posix_spawn_file_actions_addopen.cpp b/libc/src/spawn/posix_spawn_file_actions_addopen.cpp --- a/libc/src/spawn/posix_spawn_file_actions_addopen.cpp +++ b/libc/src/spawn/posix_spawn_file_actions_addopen.cpp @@ -9,11 +9,11 @@ #include "posix_spawn_file_actions_addopen.h" #include "file_actions.h" +#include "src/__support/CPP/new.h" #include "src/__support/common.h" #include #include -#include // For malloc namespace __llvm_libc { @@ -25,18 +25,12 @@ if (fd < 0) return EBADF; - auto *act = reinterpret_cast( - malloc(sizeof(SpawnFileOpenAction))); + AllocChecker ac; + auto *act = new (ac) SpawnFileOpenAction(path, fd, oflag, mode); if (act == nullptr) return ENOMEM; + BaseSpawnFileAction::add_action(actions, act); - act->type = BaseSpawnFileAction::OPEN; - act->fd = fd; - act->path = path; - act->oflag = oflag; - act->mode = mode; - act->next = nullptr; - enque_spawn_action(actions, act); return 0; } diff --git a/libc/src/spawn/posix_spawn_file_actions_destroy.cpp b/libc/src/spawn/posix_spawn_file_actions_destroy.cpp --- a/libc/src/spawn/posix_spawn_file_actions_destroy.cpp +++ b/libc/src/spawn/posix_spawn_file_actions_destroy.cpp @@ -9,11 +9,11 @@ #include "posix_spawn_file_actions_destroy.h" #include "file_actions.h" +#include "src/__support/CPP/new.h" #include "src/__support/common.h" #include #include -#include // For free namespace __llvm_libc { @@ -27,11 +27,24 @@ auto *act = reinterpret_cast(actions->__front); actions->__front = nullptr; actions->__back = nullptr; + if (act == nullptr) + return 0; + act = act->next; while (act != nullptr) { - auto *next = act->next; - free(act); - act = next; + auto *temp = act; + act = act->next; + switch (temp->type) { + case BaseSpawnFileAction::OPEN: + delete reinterpret_cast(temp); + break; + case BaseSpawnFileAction::CLOSE: + delete reinterpret_cast(temp); + break; + case BaseSpawnFileAction::DUP2: + delete reinterpret_cast(temp); + break; + } } return 0;