mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-22 21:32:31 +00:00
Invent systemvpe() function
It goes 5x faster than system() and it's safer too.
This commit is contained in:
parent
1a5ef5ba13
commit
50394064d7
5 changed files with 132 additions and 4 deletions
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue