gdbm: add upstream patch for test issues

Emily e73384a7 f86f7531

+193
+1
pkgs/by-name/gd/gdbm/package.nix
··· 18 18 patches = [ 19 19 # Remove on next release. 20 20 ./upstream-darwin-clock-nanosleep-fix.patch 21 + ./upstream-lockwait-test-fixes.patch 21 22 ]; 22 23 23 24 nativeBuildInputs = [ updateAutotoolsGnuConfigScriptsHook ];
+192
pkgs/by-name/gd/gdbm/upstream-lockwait-test-fixes.patch
··· 1 + From 5be83b4c5da7c6a68817908b19f8925af09e9b2c Mon Sep 17 00:00:00 2001 2 + From: Sergey Poznyakoff <gray@gnu.org> 3 + Date: Thu, 10 Apr 2025 17:31:56 +0300 4 + Subject: Fix timeout calculation in lockwait signal test. 5 + 6 + * tests/t_lockwait.c (runtest_signal): mark start time right 7 + after setting alarm, not before it. 8 + --- 9 + tests/t_lockwait.c | 5 ++--- 10 + 1 file changed, 2 insertions(+), 3 deletions(-) 11 + 12 + diff --git a/tests/t_lockwait.c b/tests/t_lockwait.c 13 + index a5e74c8..3547af7 100644 14 + --- a/tests/t_lockwait.c 15 + +++ b/tests/t_lockwait.c 16 + @@ -323,9 +323,6 @@ runtest_signal (struct timespec *ts) 17 + struct sigaction act; 18 + struct timeval now; 19 + 20 + - gettimeofday (&now, NULL); 21 + - start = tv_to_ms (&now); 22 + - 23 + if (pipe (sig_fd)) 24 + { 25 + perror ("pipe"); 26 + @@ -341,6 +338,8 @@ runtest_signal (struct timespec *ts) 27 + return -1; 28 + } 29 + alarm (ts_to_ms (&ts[1]) / MILLI); 30 + + gettimeofday (&now, NULL); 31 + + start = tv_to_ms (&now); 32 + } 33 + 34 + op.lock_wait = GDBM_LOCKWAIT_SIGNAL; 35 + -- 36 + cgit v1.2.3 37 + 38 + From 6f165a8e1745dbd9b88f6fb6882dff7997cfdf74 Mon Sep 17 00:00:00 2001 39 + From: Sergey Poznyakoff <gray@gnu.org> 40 + Date: Thu, 10 Apr 2025 21:07:41 +0300 41 + Subject: More fixes to lockwait test 42 + 43 + * tests/t_lockwait.c (sighan): Close fd. 44 + (runtest_signal): compensate for alarm(2) second precision 45 + --- 46 + tests/t_lockwait.c | 4 +++- 47 + 1 file changed, 3 insertions(+), 1 deletion(-) 48 + 49 + diff --git a/tests/t_lockwait.c b/tests/t_lockwait.c 50 + index 3547af7..b378819 100644 51 + --- a/tests/t_lockwait.c 52 + +++ b/tests/t_lockwait.c 53 + @@ -170,6 +170,7 @@ static void 54 + sighan (int sig) 55 + { 56 + write (sig_fd[1], &sig, sizeof (sig)); 57 + + close (sig_fd[1]); 58 + } 59 + 60 + static int runtest_retry (struct timespec *ts); 61 + @@ -364,7 +365,8 @@ runtest_signal (struct timespec *ts) 62 + 63 + pfd.fd = sig_fd[0]; 64 + pfd.events = POLLIN; 65 + - switch (poll (&pfd, 1, ts_to_ms (&ts[1]) - tv_to_ms (&now) + start)) { 66 + + switch (poll (&pfd, 1, 67 + + ts_to_ms (&ts[1]) - tv_to_ms (&now) + start + MILLI)) { 68 + case 1: 69 + break; 70 + 71 + -- 72 + cgit v1.2.3 73 + 74 + From aa9baca52ad155ae501ba586ff7b08f4b08e5434 Mon Sep 17 00:00:00 2001 75 + From: Sergey Poznyakoff <gray@gnu.org> 76 + Date: Fri, 11 Apr 2025 07:53:58 +0300 77 + Subject: Adjust timeouts for setitimer interface in lockwait test. 78 + 79 + * tests/t_lockwait.c: Setitimer (at least on some systems) restarts 80 + the timer set by alarm(2). To calculate the ETA of SIGALRM, call 81 + alarm after gdbm_open_ext returns. 82 + --- 83 + tests/t_lockwait.c | 66 ++++++++++++++++++++++++++++++++---------------------- 84 + 1 file changed, 39 insertions(+), 27 deletions(-) 85 + 86 + diff --git a/tests/t_lockwait.c b/tests/t_lockwait.c 87 + index b378819..dfae838 100644 88 + --- a/tests/t_lockwait.c 89 + +++ b/tests/t_lockwait.c 90 + @@ -322,7 +322,6 @@ runtest_signal (struct timespec *ts) 91 + if (!(ts[1].tv_sec == 0 && ts[1].tv_nsec == 0)) 92 + { 93 + struct sigaction act; 94 + - struct timeval now; 95 + 96 + if (pipe (sig_fd)) 97 + { 98 + @@ -338,9 +337,6 @@ runtest_signal (struct timespec *ts) 99 + fprintf (stderr, "%s: sigaction: %s", progname, strerror (errno)); 100 + return -1; 101 + } 102 + - alarm (ts_to_ms (&ts[1]) / MILLI); 103 + - gettimeofday (&now, NULL); 104 + - start = tv_to_ms (&now); 105 + } 106 + 107 + op.lock_wait = GDBM_LOCKWAIT_SIGNAL; 108 + @@ -354,42 +350,58 @@ runtest_signal (struct timespec *ts) 109 + } 110 + gdbm_close (dbf); 111 + 112 + - if (start > 0) 113 + + if (!(ts[1].tv_sec == 0 && ts[1].tv_nsec == 0)) 114 + { 115 + struct pollfd pfd; 116 + struct timeval now; 117 + - int sig; 118 + + int n, t, sig; 119 + 120 + - restart: 121 + + alarm (ts_to_ms (&ts[1]) / MILLI); 122 + gettimeofday (&now, NULL); 123 + + start = tv_to_ms (&now); 124 + 125 + pfd.fd = sig_fd[0]; 126 + pfd.events = POLLIN; 127 + - switch (poll (&pfd, 1, 128 + - ts_to_ms (&ts[1]) - tv_to_ms (&now) + start + MILLI)) { 129 + - case 1: 130 + - break; 131 + 132 + - case 0: 133 + - fprintf (stderr, "%s: failed waiting for alarm\n", progname); 134 + - return 1; 135 + - 136 + - default: 137 + - if (errno == EINTR) goto restart; 138 + - fprintf (stderr, "%s: poll: %s\n", progname, strerror (errno)); 139 + - return 1; 140 + - } 141 + - 142 + - if (read (sig_fd[0], &sig, sizeof (sig)) != sizeof (sig)) 143 + + do 144 + { 145 + - fprintf (stderr, "%s: read: %s\n", progname, strerror (errno)); 146 + - return 1; 147 + + gettimeofday (&now, NULL); 148 + + t = ts_to_ms (&ts[1]) - tv_to_ms (&now) + start + MILLI; 149 + + if (t < 0) 150 + + { 151 + + n = 0; 152 + + break; 153 + + } 154 + } 155 + - close (sig_fd[0]); 156 + - if (sig != SIGALRM) 157 + + while ((n = poll (&pfd, 1, t)) == -1 && errno == EINTR); 158 + + 159 + + switch (n) 160 + { 161 + - fprintf (stderr, "%s: unexpected data read\n", progname); 162 + + case 1: 163 + + if (read (sig_fd[0], &sig, sizeof (sig)) != sizeof (sig)) 164 + + { 165 + + fprintf (stderr, "%s: read: %s\n", progname, strerror (errno)); 166 + + return 1; 167 + + } 168 + + close (sig_fd[0]); 169 + + if (sig != SIGALRM) 170 + + { 171 + + fprintf (stderr, "%s: unexpected data read\n", progname); 172 + + return 1; 173 + + } 174 + + break; 175 + + 176 + + case 0: 177 + + fprintf (stderr, "%s: failed waiting for alarm\n", progname); 178 + return 1; 179 + + 180 + + default: 181 + + if (errno != EINTR) 182 + + { 183 + + fprintf (stderr, "%s: poll: %s\n", 184 + + progname, strerror (errno)); 185 + + return 1; 186 + + } 187 + } 188 + } 189 + 190 + -- 191 + cgit v1.2.3 192 +