annotate libgo/misc/cgo/test/issue3250.go @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // Copyright 2013 The Go Authors. All rights reserved.
kono
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
3 // license that can be found in the LICENSE file.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 // +build !windows
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 package cgotest
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 /*
kono
parents:
diff changeset
10 #include <signal.h>
kono
parents:
diff changeset
11 #include <pthread.h>
kono
parents:
diff changeset
12 #include <unistd.h>
kono
parents:
diff changeset
13 #include <stdlib.h>
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 static void *thread(void *p) {
kono
parents:
diff changeset
16 const int M = 100;
kono
parents:
diff changeset
17 int i;
kono
parents:
diff changeset
18 (void)p;
kono
parents:
diff changeset
19 for (i = 0; i < M; i++) {
kono
parents:
diff changeset
20 pthread_kill(pthread_self(), SIGCHLD);
kono
parents:
diff changeset
21 usleep(rand() % 20 + 5);
kono
parents:
diff changeset
22 }
kono
parents:
diff changeset
23 return NULL;
kono
parents:
diff changeset
24 }
kono
parents:
diff changeset
25 void testSendSIG() {
kono
parents:
diff changeset
26 const int N = 20;
kono
parents:
diff changeset
27 int i;
kono
parents:
diff changeset
28 pthread_t tid[N];
kono
parents:
diff changeset
29 for (i = 0; i < N; i++) {
kono
parents:
diff changeset
30 usleep(rand() % 200 + 100);
kono
parents:
diff changeset
31 pthread_create(&tid[i], 0, thread, NULL);
kono
parents:
diff changeset
32 }
kono
parents:
diff changeset
33 for (i = 0; i < N; i++)
kono
parents:
diff changeset
34 pthread_join(tid[i], 0);
kono
parents:
diff changeset
35 }
kono
parents:
diff changeset
36 */
kono
parents:
diff changeset
37 import "C"
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 import (
kono
parents:
diff changeset
40 "os"
kono
parents:
diff changeset
41 "os/signal"
kono
parents:
diff changeset
42 "syscall"
kono
parents:
diff changeset
43 "testing"
kono
parents:
diff changeset
44 "time"
kono
parents:
diff changeset
45 )
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 func test3250(t *testing.T) {
kono
parents:
diff changeset
48 t.Skip("skipped, see golang.org/issue/5885")
kono
parents:
diff changeset
49 const (
kono
parents:
diff changeset
50 thres = 1
kono
parents:
diff changeset
51 sig = syscall.SIGCHLD
kono
parents:
diff changeset
52 )
kono
parents:
diff changeset
53 type result struct {
kono
parents:
diff changeset
54 n int
kono
parents:
diff changeset
55 sig os.Signal
kono
parents:
diff changeset
56 }
kono
parents:
diff changeset
57 var (
kono
parents:
diff changeset
58 sigCh = make(chan os.Signal, 10)
kono
parents:
diff changeset
59 waitStart = make(chan struct{})
kono
parents:
diff changeset
60 waitDone = make(chan result)
kono
parents:
diff changeset
61 )
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 signal.Notify(sigCh, sig)
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 go func() {
kono
parents:
diff changeset
66 n := 0
kono
parents:
diff changeset
67 alarm := time.After(time.Second * 3)
kono
parents:
diff changeset
68 for {
kono
parents:
diff changeset
69 select {
kono
parents:
diff changeset
70 case <-waitStart:
kono
parents:
diff changeset
71 waitStart = nil
kono
parents:
diff changeset
72 case v := <-sigCh:
kono
parents:
diff changeset
73 n++
kono
parents:
diff changeset
74 if v != sig || n > thres {
kono
parents:
diff changeset
75 waitDone <- result{n, v}
kono
parents:
diff changeset
76 return
kono
parents:
diff changeset
77 }
kono
parents:
diff changeset
78 case <-alarm:
kono
parents:
diff changeset
79 waitDone <- result{n, sig}
kono
parents:
diff changeset
80 return
kono
parents:
diff changeset
81 }
kono
parents:
diff changeset
82 }
kono
parents:
diff changeset
83 }()
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 waitStart <- struct{}{}
kono
parents:
diff changeset
86 C.testSendSIG()
kono
parents:
diff changeset
87 r := <-waitDone
kono
parents:
diff changeset
88 if r.sig != sig {
kono
parents:
diff changeset
89 t.Fatalf("received signal %v, but want %v", r.sig, sig)
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91 t.Logf("got %d signals\n", r.n)
kono
parents:
diff changeset
92 if r.n <= thres {
kono
parents:
diff changeset
93 t.Fatalf("expected more than %d", thres)
kono
parents:
diff changeset
94 }
kono
parents:
diff changeset
95 }