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