Invent systemvpe() function

It goes 5x faster than system() and it's safer too.
This commit is contained in:
Justine Tunney 2023-08-09 00:27:55 -07:00
parent 1a5ef5ba13
commit 50394064d7
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
5 changed files with 132 additions and 4 deletions

View file

@ -19,6 +19,7 @@
#include "libc/calls/struct/sigaction.h"
#include "libc/calls/calls.h"
#include "libc/calls/struct/rusage.h"
#include "libc/calls/struct/sigaction.h"
#include "libc/calls/struct/siginfo.h"
#include "libc/calls/struct/sigset.h"
#include "libc/calls/struct/sigset.internal.h"
@ -248,3 +249,19 @@ TEST(uc_sigmask, signalHandlerCanChangeSignalMaskOfTrappedThread) {
sigdelset(&want, SIGUSR1);
ASSERT_SYS(0, 0, sigprocmask(SIG_SETMASK, &want, 0));
}
TEST(sig_ign, discardsPendingSignalsEvenIfBlocked) {
sigset_t block, oldmask;
struct sigaction sa, oldsa;
ASSERT_SYS(0, 0, sigemptyset(&block));
ASSERT_SYS(0, 0, sigaddset(&block, SIGUSR1));
ASSERT_SYS(0, 0, sigprocmask(SIG_BLOCK, &block, &oldmask));
raise(SIGUSR1); // enqueue
sa.sa_flags = 0;
sa.sa_handler = SIG_IGN;
ASSERT_SYS(0, 0, sigemptyset(&sa.sa_mask));
ASSERT_SYS(0, 0, sigaction(SIGUSR1, &sa, &oldsa)); // discard
ASSERT_SYS(0, 0, sigprocmask(SIG_UNBLOCK, &block, 0));
ASSERT_SYS(0, 0, sigaction(SIGUSR1, &oldsa, 0));
ASSERT_SYS(0, 0, sigprocmask(SIG_SETMASK, &oldmask, 0));
}

View file

@ -17,6 +17,7 @@
PERFORMANCE OF THIS SOFTWARE.
*/
#include "libc/calls/calls.h"
#include "libc/cosmo.h"
#include "libc/dce.h"
#include "libc/mem/gc.h"
#include "libc/mem/gc.internal.h"
@ -243,6 +244,8 @@ int system2(const char *);
BENCH(system, bench) {
testlib_extract("/zip/echo.com", "echo.com", 0755);
EZBENCH2("system cmd", donothing, system("./echo.com hi >/dev/null"));
EZBENCH2("systemvpe cmd", donothing,
systemvpe("./echo.com", (char *[]){"./echo.com", "hi", 0}, 0));
EZBENCH2("cocmd echo", donothing, system("echo hi >/dev/null"));
EZBENCH2("cocmd exit", donothing, system("exit"));
}