1
0
mirror of https://github.com/golang/go synced 2024-09-29 10:34:36 -06:00
go/misc/cgo/testcarchive/main5.c
Joe Sylve df2b2eb63d runtime: improve last ditch signal forwarding for Unix libraries
The current runtime attempts to forward signals generated by non-Go
code to the original signal handler.  If it can't call the original
handler directly, it currently attempts to re-raise the signal after
resetting the handler.  In this case, the original context is lost.

This fix prevents that problem by simply returning from the go signal
handler after resetting the original handler.  It only does this when
the original handler is the system default handler, which in all cases
is known to not recover.  The signal is not reset, so it is retriggered
and the original handler takes over with the proper context.

Fixes #14899

Change-Id: Ib1c19dfa4b50d9732d7a453de3784c8141e1cbb3
Reviewed-on: https://go-review.googlesource.com/21006
Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-03-24 19:34:17 +00:00

64 lines
1.0 KiB
C

// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Test for verifying that the Go runtime properly forwards
// signals when non-Go signals are raised.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "libgo2.h"
int main(int argc, char** argv) {
int verbose;
int test;
if (argc < 2) {
printf("Missing argument");
return 1;
}
test = atoi(argv[1]);
verbose = (argc > 2);
if (verbose) {
printf("calling RunGoroutines\n");
}
RunGoroutines();
switch (test) {
case 1: {
if (verbose) {
printf("attempting segfault\n");
}
volatile int crash = *(int *) 0;
break;
}
case 2: {
if (verbose) {
printf("attempting external signal test\n");
}
fprintf(stderr, "OK\n");
fflush(stderr);
// The program should be interrupted before this sleep finishes.
sleep(60);
break;
}
default:
printf("Unknown test: %d\n", test);
return 0;
}
printf("FAIL\n");
return 0;
}