summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/log.c27
-rw-r--r--progress.c20
2 files changed, 33 insertions, 14 deletions
diff --git a/builtin/log.c b/builtin/log.c
index 4389722b4b..1eca66c62b 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -229,12 +229,13 @@ static void show_early_header(struct rev_info *rev, const char *stage, int nr)
printf(_("Final output: %d %s\n"), nr, stage);
}
-static struct itimerval early_output_timer;
+static timer_t early_output_timer;
static void log_show_early(struct rev_info *revs, struct commit_list *list)
{
int i = revs->early_output;
int show_header = 1;
+ struct itimerspec value;
sort_in_topological_order(&list, revs->sort_order);
while (list && i) {
@@ -271,9 +272,11 @@ static void log_show_early(struct rev_info *revs, struct commit_list *list)
* trigger every second even if we're blocked on a
* reader!
*/
- early_output_timer.it_value.tv_sec = 0;
- early_output_timer.it_value.tv_usec = 500000;
- setitimer(ITIMER_REAL, &early_output_timer, NULL);
+ value.it_value.tv_sec = 0;
+ value.it_value.tv_nsec = 500000L * 1000L;
+ value.it_interval.tv_sec = 0;
+ value.it_interval.tv_nsec = 0;
+ timer_settime(early_output_timer, 0, &value, NULL);
}
static void early_output(int signal)
@@ -284,6 +287,8 @@ static void early_output(int signal)
static void setup_early_output(struct rev_info *rev)
{
struct sigaction sa;
+ struct sigevent sev;
+ struct itimerspec value;
/*
* Set up the signal handler, minimally intrusively:
@@ -305,14 +310,22 @@ static void setup_early_output(struct rev_info *rev)
*
* This is a one-time-only trigger.
*/
- early_output_timer.it_value.tv_sec = 0;
- early_output_timer.it_value.tv_usec = 100000;
- setitimer(ITIMER_REAL, &early_output_timer, NULL);
+ memset(&sev, 0, sizeof(sev));
+ sev.sigev_notify = SIGEV_SIGNAL;
+ sev.sigev_signo = SIGALRM;
+ timer_create(CLOCK_MONOTONIC, &sev, &early_output_timer);
+
+ value.it_value.tv_sec = 0;
+ value.it_value.tv_nsec = 100000L * 1000L;
+ value.it_interval.tv_sec = 0;
+ value.it_interval.tv_nsec = 0;
+ timer_settime(early_output_timer, 0, &value, NULL);
}
static void finish_early_output(struct rev_info *rev)
{
int n = estimate_commit_count(rev, rev->commits);
+ timer_delete(early_output_timer);
signal(SIGALRM, SIG_IGN);
show_early_header(rev, "done", n);
}
diff --git a/progress.c b/progress.c
index 412e6b1ecc..2321143db0 100644
--- a/progress.c
+++ b/progress.c
@@ -38,6 +38,7 @@ struct progress {
struct throughput *throughput;
};
+static timer_t progress_timer;
static volatile sig_atomic_t progress_update;
static void progress_interval(int signum)
@@ -48,7 +49,8 @@ static void progress_interval(int signum)
static void set_progress_signal(void)
{
struct sigaction sa;
- struct itimerval v;
+ struct sigevent sev;
+ struct itimerspec value;
progress_update = 0;
@@ -58,16 +60,20 @@ static void set_progress_signal(void)
sa.sa_flags = SA_RESTART;
sigaction(SIGALRM, &sa, NULL);
- v.it_interval.tv_sec = 1;
- v.it_interval.tv_usec = 0;
- v.it_value = v.it_interval;
- setitimer(ITIMER_REAL, &v, NULL);
+ memset(&sev, 0, sizeof(sev));
+ sev.sigev_notify = SIGEV_SIGNAL;
+ sev.sigev_signo = SIGALRM;
+ timer_create(CLOCK_MONOTONIC, &sev, &progress_timer);
+
+ value.it_interval.tv_sec = 1;
+ value.it_interval.tv_nsec = 0;
+ value.it_value = value.it_interval;
+ timer_settime(progress_timer, 0, &value, NULL);
}
static void clear_progress_signal(void)
{
- struct itimerval v = {{0,},};
- setitimer(ITIMER_REAL, &v, NULL);
+ timer_delete(progress_timer);
signal(SIGALRM, SIG_IGN);
progress_update = 0;
}