@@ -34,51 +34,90 @@ ulong pmin, pmax;
34
34
prime_iterator ip , iq , ir ;
35
35
t_divisors * divisors ;
36
36
37
- uint diag_delay = 1 ;
38
- timer_t diag_timerid ;
37
+ uint diag_delay = 1 , log_delay = 600 ;
38
+ timer_t diag_timerid , log_timerid ;
39
39
volatile bool need_work = 0 ;
40
40
bool clock_is_realtime = 0 ;
41
+ struct rusage rusage_buf ;
42
+ static inline double utime (void ) {
43
+ getrusage (RUSAGE_SELF , & rusage_buf );
44
+ return (double )rusage_buf .ru_utime .tv_sec
45
+ + (double )rusage_buf .ru_utime .tv_usec / 1000000 ;
46
+ }
47
+
48
+ char * rpath = NULL ; /* path to log file */
49
+ FILE * rfp = NULL ; /* file handle to log file */
41
50
42
51
void fail (char * format , ...) {
43
52
va_list ap ;
44
53
va_start (ap , format );
45
54
vfprintf (stderr , format , ap );
46
55
fprintf (stderr , "\n" );
47
56
va_end (ap );
57
+ if (rfp )
58
+ fclose (rfp );
48
59
exit (1 );
49
60
}
50
61
62
+ void report (char * format , ...) {
63
+ keep_diag ();
64
+ va_list ap ;
65
+ va_start (ap , format );
66
+ gmp_vfprintf (stdout , format , ap );
67
+ va_end (ap );
68
+
69
+ if (rfp ) {
70
+ va_start (ap , format );
71
+ gmp_vfprintf (rfp , format , ap );
72
+ va_end (ap );
73
+ fflush (rfp );
74
+ }
75
+ }
76
+
51
77
char buf [256 ];
78
+ void do_diag (void ) {
79
+ if (need_work & 1 ) {
80
+ diag (buf );
81
+ need_work &= ~1 ;
82
+ }
83
+ if (rfp && (need_work & 2 )) {
84
+ fprintf (rfp , "305 %s (%.2fs)\n" , buf , utime ());
85
+ need_work &= ~2 ;
86
+ }
87
+ }
88
+
52
89
void diag_p (ulong p ) {
53
90
sprintf (buf , "%lu" , p );
54
- diag (buf );
55
- need_work = 0 ;
91
+ do_diag ();
56
92
}
57
93
void diag_pq (ulong p , ulong q ) {
58
94
sprintf (buf , "%lu %lu" , p , q );
59
- diag (buf );
60
- need_work = 0 ;
95
+ do_diag ();
61
96
}
62
97
void diag_pqr (ulong p , ulong q , ulong r ) {
63
98
sprintf (buf , "%lu %lu %lu" , p , q , r );
64
- diag (buf );
65
- need_work = 0 ;
99
+ do_diag ();
66
100
}
67
101
68
102
void handle_sig (int sig ) {
69
- need_work = 1 ;
103
+ if (sig == SIGUSR1 )
104
+ need_work |= 1 ;
105
+ else
106
+ need_work |= 2 ;
70
107
}
71
108
72
109
void init_time (void ) {
73
110
struct sigaction sa ;
74
111
struct sigevent sev ;
75
- struct itimerspec diag_timer ;
112
+ struct itimerspec diag_timer , log_timer ;
76
113
77
114
sa .sa_handler = & handle_sig ;
78
115
sa .sa_flags = SA_RESTART ;
79
116
sigemptyset (& sa .sa_mask );
80
117
if (sigaction (SIGUSR1 , & sa , NULL ))
81
118
fail ("Could not set USR1 handler: %s\n" , strerror (errno ));
119
+ if (sigaction (SIGUSR2 , & sa , NULL ))
120
+ fail ("Could not set USR2 handler: %s\n" , strerror (errno ));
82
121
83
122
sev .sigev_notify = SIGEV_SIGNAL ;
84
123
sev .sigev_signo = SIGUSR1 ;
@@ -91,12 +130,25 @@ void init_time(void) {
91
130
clock_is_realtime = 1 ;
92
131
}
93
132
133
+ sev .sigev_signo = SIGUSR2 ;
134
+ sev .sigev_value .sival_ptr = & log_timerid ;
135
+ clockid_t clock = clock_is_realtime
136
+ ? CLOCK_REALTIME : CLOCK_PROCESS_CPUTIME_ID ;
137
+ if (timer_create (clock , & sev , & log_timerid ))
138
+ fail ("Could not create log timer: %s\n" , strerror (errno ));
139
+
94
140
diag_timer .it_value .tv_sec = diag_delay ;
95
141
diag_timer .it_value .tv_nsec = 0 ;
96
142
diag_timer .it_interval .tv_sec = diag_delay ;
97
143
diag_timer .it_interval .tv_nsec = 0 ;
98
144
if (timer_settime (diag_timerid , 0 , & diag_timer , NULL ))
99
145
fail ("Could not set diag timer: %s\n" , strerror (errno ));
146
+ log_timer .it_value .tv_sec = log_delay ;
147
+ log_timer .it_value .tv_nsec = 0 ;
148
+ log_timer .it_interval .tv_sec = log_delay ;
149
+ log_timer .it_interval .tv_nsec = 0 ;
150
+ if (timer_settime (log_timerid , 0 , & log_timer , NULL ))
151
+ fail ("Could not set log timer: %s\n" , strerror (errno ));
100
152
}
101
153
102
154
void init (void ) {
@@ -191,7 +243,7 @@ void tryvalue(mpz_t zv) {
191
243
if (!is_taux (Z (temp ), 12 , 1 ))
192
244
return ;
193
245
keep_diag ();
194
- gmp_printf ( " hit near %Zu\n" , Z (v ));
246
+ report ( "209 hit near %Zu (%.2fs) \n" , Z (v ), utime ( ));
195
247
}
196
248
197
249
void tryp (ulong p ) {
@@ -232,14 +284,33 @@ void tryp(ulong p) {
232
284
}
233
285
234
286
int main (int argc , char * * argv , char * * envp ) {
287
+ int i = 1 ;
235
288
init ();
236
- if (argc != 4 )
289
+ while (i < argc && argv [i ][0 ] == '-' ) {
290
+ char * arg = argv [i ++ ];
291
+ if (arg [1 ] == 'r' ) {
292
+ rpath = (char * )malloc (strlen (& arg [2 ]) + 1 );
293
+ strcpy (rpath , & arg [2 ]);
294
+ } else
295
+ fail ("unknown option '%s'" , arg );
296
+ }
297
+ if (i + 3 != argc )
237
298
fail ("wrong number of arguments" );
238
- ston (Z (lim ), argv [1 ]);
239
- ulong pmin = ulston (argv [2 ]);
240
- ulong pmax = ulston (argv [3 ]);
299
+ ston (Z (lim ), argv [i ++ ]);
300
+ ulong pmin = ulston (argv [i ++ ]);
301
+ ulong pmax = ulston (argv [i ++ ]);
302
+
303
+ if (rpath ) {
304
+ printf ("path %s\n" , rpath );
305
+ rfp = fopen (rpath , "a" );
306
+ if (rfp == NULL )
307
+ fail ("%s: %s" , rpath , strerror (errno ));
308
+ setlinebuf (rfp );
309
+ }
310
+ report ("001 sq12 %Zu %lu %lu\n" , Z (lim ), pmin , pmax );
241
311
242
- prime_iterator_setprime (& ip , pmax + 1 );
312
+ prime_iterator_setprime (& ip , pmax );
313
+ prime_iterator_next (& ip );
243
314
while (1 ) {
244
315
ulong p = prime_iterator_prev (& ip );
245
316
if (p < pmin )
@@ -248,6 +319,8 @@ int main(int argc, char **argv, char **envp) {
248
319
diag_p (p );
249
320
tryp (p );
250
321
}
251
- keep_diag ();
322
+ report ("200 sq12 %Zu %lu %lu (%.2fs)\n" , Z (lim ), pmin , pmax , utime ());
323
+ if (rfp )
324
+ fclose (rfp );
252
325
return 0 ;
253
326
}
0 commit comments