Skip to content

Commit

Permalink
Fix Solaris stdio signal handling stupidities
Browse files Browse the repository at this point in the history
This uses sigaction() to install the SIGALRM handler with SA_RESTART, so
that Solaris stdio doesn't break completely when a signal interrupts a
read.

Thanks to Jason Riedy for confirming the silly Solaris signal behaviour.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Apr 2, 2006
1 parent 473d404 commit fb7a653
Showing 1 changed file with 19 additions and 8 deletions.
27 changes: 19 additions & 8 deletions pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ static int nr_objects = 0, nr_alloc = 0;
static const char *base_name;
static unsigned char pack_file_sha1[20];
static int progress = 1;
static volatile int progress_update = 0;
static volatile sig_atomic_t progress_update = 0;

/*
* The object names in objects array are hashed with this hashtable,
Expand Down Expand Up @@ -685,7 +685,6 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de

static void progress_interval(int signum)
{
signal(SIGALRM, progress_interval);
progress_update = 1;
}

Expand Down Expand Up @@ -820,6 +819,23 @@ static int reuse_cached_pack(unsigned char *sha1, int pack_to_stdout)
return 1;
}

static void setup_progress_signal(void)
{
struct sigaction sa;
struct itimerval v;

memset(&sa, 0, sizeof(sa));
sa.sa_handler = progress_interval;
sigemptyset(&sa.sa_mask);
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);
}

int main(int argc, char **argv)
{
SHA_CTX ctx;
Expand Down Expand Up @@ -885,13 +901,8 @@ int main(int argc, char **argv)
prepare_packed_git();

if (progress) {
struct itimerval v;
v.it_interval.tv_sec = 1;
v.it_interval.tv_usec = 0;
v.it_value = v.it_interval;
signal(SIGALRM, progress_interval);
setitimer(ITIMER_REAL, &v, NULL);
fprintf(stderr, "Generating pack...\n");
setup_progress_signal();
}

while (fgets(line, sizeof(line), stdin) != NULL) {
Expand Down

0 comments on commit fb7a653

Please sign in to comment.