| // Copyright 2011 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. |
| |
| package cgotest |
| |
| /* |
| // mysleep returns the absolute start time in ms. |
| long long mysleep(int seconds); |
| |
| // twoSleep returns the absolute start time of the first sleep |
| // in ms. |
| long long twoSleep(int); |
| */ |
| import "C" |
| |
| import ( |
| "testing" |
| "time" |
| ) |
| |
| var sleepDone = make(chan int64) |
| |
| // parallelSleep returns the absolute difference between the start time |
| // of the two sleeps. |
| func parallelSleep(n int) int64 { |
| t := int64(C.twoSleep(C.int(n))) - <-sleepDone |
| if t < 0 { |
| return -t |
| } |
| return t |
| } |
| |
| //export BackgroundSleep |
| func BackgroundSleep(n int32) { |
| go func() { |
| sleepDone <- int64(C.mysleep(C.int(n))) |
| }() |
| } |
| |
| func testParallelSleep(t *testing.T) { |
| sleepSec := 1 |
| dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond |
| t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt) |
| // bug used to run sleeps in serial, producing a 2*sleepSec-second delay. |
| // we detect if the start times of those sleeps are > 0.5*sleepSec-second. |
| if dt >= time.Duration(sleepSec)*time.Second/2 { |
| t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds()) |
| } |
| } |