1
0
mirror of https://github.com/golang/go synced 2024-11-11 21:10:21 -07:00

misc/cgo/testcarchive, misc/cgo/testcshared: sleep instead of sched_yield

Apparently when GOMAXPROCS == 1 a simple sched_yield in a tight loop is
not necessarily sufficient to permit a signal handler to run. Instead,
sleep for 1/1000 of a second.

Fixes #16649.

Change-Id: I83910144228556e742b7a92a441732ef61aa49d9
Reviewed-on: https://go-review.googlesource.com/33239
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Ian Lance Taylor 2016-11-14 16:50:15 -08:00
parent 1e91731251
commit b687d6a788
5 changed files with 33 additions and 24 deletions

View File

@ -112,6 +112,7 @@ int main(int argc, char** argv) {
int verbose; int verbose;
sigset_t mask; sigset_t mask;
int i; int i;
struct timespec ts;
verbose = argc > 1; verbose = argc > 1;
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
@ -161,9 +162,9 @@ int main(int argc, char** argv) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (!sigioSeen) { while (!sigioSeen) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");

View File

@ -9,6 +9,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#include <sched.h> #include <sched.h>
#include "libgo3.h" #include "libgo3.h"
@ -28,6 +29,7 @@ int main(int argc, char** argv) {
int verbose; int verbose;
struct sigaction sa; struct sigaction sa;
int i; int i;
struct timespec ts;
verbose = argc > 2; verbose = argc > 2;
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
@ -64,9 +66,9 @@ int main(int argc, char** argv) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (!sigioSeen) { while (!sigioSeen) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");
@ -138,9 +140,9 @@ int main(int argc, char** argv) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (!sigioSeen) { while (!sigioSeen) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");

View File

@ -8,6 +8,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#include <sched.h> #include <sched.h>
#include <pthread.h> #include <pthread.h>
@ -48,6 +49,7 @@ static void* thread1(void* arg __attribute__ ((unused))) {
stack_t ss; stack_t ss;
int i; int i;
stack_t nss; stack_t nss;
struct timespec ts;
// Set up an alternate signal stack for this thread. // Set up an alternate signal stack for this thread.
memset(&ss, 0, sizeof ss); memset(&ss, 0, sizeof ss);
@ -73,9 +75,9 @@ static void* thread1(void* arg __attribute__ ((unused))) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (SIGIOCount() == 0) { while (SIGIOCount() == 0) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");
@ -105,6 +107,7 @@ static void* thread2(void* arg __attribute__ ((unused))) {
int i; int i;
int oldcount; int oldcount;
pthread_t tid; pthread_t tid;
struct timespec ts;
stack_t nss; stack_t nss;
// Set up an alternate signal stack for this thread. // Set up an alternate signal stack for this thread.
@ -129,9 +132,9 @@ static void* thread2(void* arg __attribute__ ((unused))) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (SIGIOCount() == oldcount) { while (SIGIOCount() == oldcount) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");

View File

@ -77,6 +77,7 @@ int main(int argc, char** argv) {
void (*fn)(void); void (*fn)(void);
sigset_t mask; sigset_t mask;
int i; int i;
struct timespec ts;
verbose = argc > 2; verbose = argc > 2;
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
@ -166,9 +167,9 @@ int main(int argc, char** argv) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (!sigioSeen) { while (!sigioSeen) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");

View File

@ -10,6 +10,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#include <sched.h> #include <sched.h>
#include <dlfcn.h> #include <dlfcn.h>
@ -31,6 +32,7 @@ int main(int argc, char** argv) {
void (*fn1)(void); void (*fn1)(void);
int (*sawSIGIO)(void); int (*sawSIGIO)(void);
int i; int i;
struct timespec ts;
verbose = argc > 2; verbose = argc > 2;
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
@ -77,9 +79,9 @@ int main(int argc, char** argv) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (!sigioSeen) { while (!sigioSeen) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");
@ -182,9 +184,9 @@ int main(int argc, char** argv) {
// Wait until the signal has been delivered. // Wait until the signal has been delivered.
i = 0; i = 0;
while (!sigioSeen) { while (!sigioSeen) {
if (sched_yield() < 0) { ts.tv_sec = 0;
perror("sched_yield"); ts.tv_nsec = 1000000;
} nanosleep(&ts, NULL);
i++; i++;
if (i > 100000) { if (i > 100000) {
fprintf(stderr, "looping too long waiting for signal\n"); fprintf(stderr, "looping too long waiting for signal\n");