@@ -13626,6 +13626,24 @@ Copyright and License: see header file (000 copyright.h) or top of file
1362613626#endif
1362713627
1362813628#include <signal.h>
13629+ /* ****************************************************************************
13630+ Portable signal aliases (abstract OS differences)
13631+ ***************************************************************************** */
13632+
13633+ #if FIO_OS_POSIX
13634+ #define FIO_SIGNAL_USER1 SIGUSR1
13635+ #define FIO_SIGNAL_USER2 SIGUSR2
13636+ #define FIO_SIGNAL_USER_UNREGISTERED SIGUSR2
13637+ #elif FIO_OS_WIN
13638+ /* Windows has no SIGUSR1/SIGUSR2; map to safe, distinct signals. */
13639+ #define FIO_SIGNAL_USER1 SIGBREAK
13640+ #define FIO_SIGNAL_USER2 SIGABRT
13641+ /*
13642+ * Use SIGBREAK for unregistered-signal tests to avoid clobbering SIGINT/SIGTERM
13643+ * handlers that a test harness might rely on.
13644+ */
13645+ #define FIO_SIGNAL_USER_UNREGISTERED SIGBREAK
13646+ #endif
1362913647/* *****************************************************************************
1363013648Signal Monitoring API
1363113649***************************************************************************** */
@@ -13767,7 +13785,6 @@ SFUNC int fio_signal_forget(int sig) {
1376713785 }
1376813786 return 0;
1376913787 }
13770- sigaction(sig, &act, NULL);
1377113788 return -1;
1377213789}
1377313790
@@ -13869,7 +13886,6 @@ SFUNC int fio_signal_forget(int sig) {
1386913886 fio___signal_watchers[i].old = SIG_DFL;
1387013887 return 0;
1387113888 }
13872- signal(sig, SIG_DFL);
1387313889 return -1;
1387413890sig_error:
1387513891 fio___signal_watchers[i].old = SIG_DFL;
@@ -13902,60 +13918,6 @@ SFUNC int fio_signal_review(void) {
1390213918 return c;
1390313919}
1390413920
13905- /* *****************************************************************************
13906- Signal Monitoring Testing?
13907- ***************************************************************************** */
13908- #ifdef FIO_TEST_ALL
13909- FIO_SFUNC void FIO_NAME_TEST(stl, signal)(void) {
13910-
13911- #define FIO___SIGNAL_MEMBER(a) \
13912- { (int)a, #a }
13913- struct {
13914- int sig;
13915- const char *name;
13916- } t[] = {
13917- FIO___SIGNAL_MEMBER(SIGINT),
13918- FIO___SIGNAL_MEMBER(SIGILL),
13919- FIO___SIGNAL_MEMBER(SIGABRT),
13920- FIO___SIGNAL_MEMBER(SIGSEGV),
13921- FIO___SIGNAL_MEMBER(SIGTERM),
13922- #if FIO_OS_POSIX
13923- FIO___SIGNAL_MEMBER(SIGQUIT),
13924- FIO___SIGNAL_MEMBER(SIGHUP),
13925- FIO___SIGNAL_MEMBER(SIGTRAP),
13926- FIO___SIGNAL_MEMBER(SIGBUS),
13927- FIO___SIGNAL_MEMBER(SIGFPE),
13928- FIO___SIGNAL_MEMBER(SIGUSR1),
13929- FIO___SIGNAL_MEMBER(SIGUSR2),
13930- FIO___SIGNAL_MEMBER(SIGPIPE),
13931- FIO___SIGNAL_MEMBER(SIGALRM),
13932- FIO___SIGNAL_MEMBER(SIGCHLD),
13933- FIO___SIGNAL_MEMBER(SIGCONT),
13934- #endif
13935- };
13936- #undef FIO___SIGNAL_MEMBER
13937- size_t e = 0;
13938- fprintf(stderr, "* testing signal monitoring (setup / cleanup only).\n");
13939- for (size_t i = 0; i < sizeof(t) / sizeof(t[0]); ++i) {
13940- if (fio_signal_monitor(t[i].sig, NULL, NULL, 1)) {
13941- FIO_LOG_ERROR("couldn't set signal monitoring for %s (%d)",
13942- t[i].name,
13943- t[i].sig);
13944- e = 1;
13945- }
13946- }
13947- for (size_t i = 0; i < sizeof(t) / sizeof(t[0]); ++i) {
13948- if (fio_signal_forget(t[i].sig)) {
13949- FIO_LOG_ERROR("couldn't stop signal monitoring for %s (%d)",
13950- t[i].name,
13951- t[i].sig);
13952- e = 1;
13953- }
13954- }
13955- FIO_ASSERT(!e, "signal monitoring error");
13956- }
13957-
13958- #endif /* FIO_TEST_ALL */
1395913921/* *****************************************************************************
1396013922Module Cleanup
1396113923***************************************************************************** */
@@ -19939,12 +19901,16 @@ SFUNC short fio_sock_wait_io(fio_socket_i fd, short events, int timeout) {
1993919901/** Attempts to maximize the allowed open file limits. returns known limit */
1994019902SFUNC size_t fio_sock_maximize_limits(size_t max_limit) {
1994119903 ssize_t capa = 0;
19904+ #if FIO_OS_POSIX
1994219905 if (!max_limit)
1994319906 max_limit = FIO_SOCK_DEFAULT_MAXIMIZE_LIMIT;
19944- #if FIO_OS_POSIX
1994519907
1994619908#ifdef _SC_OPEN_MAX
19947- capa = sysconf(_SC_OPEN_MAX);
19909+ {
19910+ const long sys_max = sysconf(_SC_OPEN_MAX);
19911+ if (sys_max >= 0)
19912+ capa = (ssize_t)sys_max;
19913+ }
1994819914#elif defined(FOPEN_MAX)
1994919915 capa = FOPEN_MAX;
1995019916#endif
@@ -19976,11 +19942,13 @@ SFUNC size_t fio_sock_maximize_limits(size_t max_limit) {
1997619942 getrlimit(RLIMIT_NOFILE, &rlim);
1997719943 capa = rlim.rlim_cur;
1997819944#elif FIO_OS_WIN
19979- capa = 1ULL << 10;
19980- while (_setmaxstdio(capa) > 0)
19981- capa <<= 1;
19982- capa >>= 1;
19983- FIO_LOG_DEBUG("new open file limit: %zd", (ssize_t)capa);
19945+ if (!max_limit)
19946+ max_limit = FIO_SOCK_DEFAULT_MAXIMIZE_LIMIT;
19947+ capa = (ssize_t)max_limit;
19948+ FIO_LOG_DEBUG2(
19949+ "Windows has no RLIMIT_NOFILE-equivalent for sockets; using advisory "
19950+ "per-process cap %zu",
19951+ max_limit);
1998419952#else
1998519953 FIO_LOG_ERROR("No OS detected, couldn't maximize open file limit.");
1998619954#endif
@@ -97116,6 +97084,8 @@ SFUNC void fio_io_start(int workers) {
9711697084 if (workers) {
9711797085 FIO___IO.to_spawn = workers;
9711897086 fio___io_spawn_workers_task(NULL, NULL);
97087+ FIO_LOG_DEBUG2("(%d) starting facil.io IO reactor in single process mode.",
97088+ fio_io_root_pid());
9711997089 } else {
9712097090 FIO_LOG_DEBUG2("(%d) starting facil.io IO reactor in single process mode.",
9712197091 fio_io_root_pid());
@@ -98984,6 +98954,8 @@ FIO_SFUNC void fio___ipc_listen(void *ignr_) {
9898498954 FIO___IPC.ipc_url);
9898598955 }
9898698956
98957+ FIO_LOG_DDEBUG2("(%d) Opening IPC listening socket @ %s", FIO___IPC.ipc_url);
98958+
9898798959 fio_socket_i fd =
9898898960 fio_sock_open2(FIO___IPC.ipc_url,
9898998961 FIO_SOCK_SERVER | FIO_SOCK_TCP | FIO_SOCK_NONBLOCK);
0 commit comments