cherry pick ff2d4d2cedc09db23cc46d3eeb8b402bca6d819d for package rjeczalik

This commit is contained in:
vsmk98 2018-10-23 10:40:34 +08:00
parent d6352b30c3
commit 501f798b6f
5 changed files with 33 additions and 16 deletions

View File

@ -6,6 +6,7 @@ package notify
import ( import (
"errors" "errors"
"fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
@ -70,11 +71,7 @@ Traverse:
case errSkip: case errSkip:
continue Traverse continue Traverse
default: default:
return &os.PathError{ return fmt.Errorf("error while traversing %q: %v", nd.Name, err)
Op: "error while traversing",
Path: nd.Name,
Err: err,
}
} }
// TODO(rjeczalik): tolerate open failures - add failed names to // TODO(rjeczalik): tolerate open failures - add failed names to
// AddDirError and notify users which names are not added to the tree. // AddDirError and notify users which names are not added to the tree.

View File

@ -26,9 +26,9 @@ import "C"
import ( import (
"errors" "errors"
"os" "os"
"runtime"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time"
"unsafe" "unsafe"
) )
@ -48,7 +48,7 @@ var wg sync.WaitGroup // used to wait until the runloop starts
// started and is ready via the wg. It also serves purpose of a dummy source, // started and is ready via the wg. It also serves purpose of a dummy source,
// thanks to it the runloop does not return as it also has at least one source // thanks to it the runloop does not return as it also has at least one source
// registered. // registered.
var source = C.CFRunLoopSourceCreate(nil, 0, &C.CFRunLoopSourceContext{ var source = C.CFRunLoopSourceCreate(refZero, 0, &C.CFRunLoopSourceContext{
perform: (C.CFRunLoopPerformCallBack)(C.gosource), perform: (C.CFRunLoopPerformCallBack)(C.gosource),
}) })
@ -63,10 +63,6 @@ var (
func init() { func init() {
wg.Add(1) wg.Add(1)
go func() { go func() {
// There is exactly one run loop per thread. Lock this goroutine to its
// thread to ensure that it's not rescheduled on a different thread while
// setting up the run loop.
runtime.LockOSThread()
runloop = C.CFRunLoopGetCurrent() runloop = C.CFRunLoopGetCurrent()
C.CFRunLoopAddSource(runloop, source, C.kCFRunLoopDefaultMode) C.CFRunLoopAddSource(runloop, source, C.kCFRunLoopDefaultMode)
C.CFRunLoopRun() C.CFRunLoopRun()
@ -77,6 +73,7 @@ func init() {
//export gosource //export gosource
func gosource(unsafe.Pointer) { func gosource(unsafe.Pointer) {
time.Sleep(time.Second)
wg.Done() wg.Done()
} }
@ -162,8 +159,8 @@ func (s *stream) Start() error {
return nil return nil
} }
wg.Wait() wg.Wait()
p := C.CFStringCreateWithCStringNoCopy(nil, C.CString(s.path), C.kCFStringEncodingUTF8, nil) p := C.CFStringCreateWithCStringNoCopy(refZero, C.CString(s.path), C.kCFStringEncodingUTF8, refZero)
path := C.CFArrayCreate(nil, (*unsafe.Pointer)(unsafe.Pointer(&p)), 1, nil) path := C.CFArrayCreate(refZero, (*unsafe.Pointer)(unsafe.Pointer(&p)), 1, nil)
ctx := C.FSEventStreamContext{} ctx := C.FSEventStreamContext{}
ref := C.EventStreamCreate(&ctx, C.uintptr_t(s.info), path, C.FSEventStreamEventId(atomic.LoadUint64(&since)), latency, flags) ref := C.EventStreamCreate(&ctx, C.uintptr_t(s.info), path, C.FSEventStreamEventId(atomic.LoadUint64(&since)), latency, flags)
if ref == nilstream { if ref == nilstream {

View File

@ -0,0 +1,9 @@
// Copyright (c) 2017 The Notify Authors. All rights reserved.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
// +build darwin,!kqueue,go1.10
package notify
const refZero = 0

View File

@ -0,0 +1,14 @@
// Copyright (c) 2017 The Notify Authors. All rights reserved.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
// +build darwin,!kqueue,cgo,!go1.10
package notify
/*
#include <CoreServices/CoreServices.h>
*/
import "C"
var refZero = (*C.struct___CFAllocator)(nil)

6
vendor/vendor.json vendored
View File

@ -346,10 +346,10 @@
"revisionTime": "2017-08-14T17:01:13Z" "revisionTime": "2017-08-14T17:01:13Z"
}, },
{ {
"checksumSHA1": "28UVHMmHx0iqO0XiJsjx+fwILyI=", "checksumSHA1": "d2rQHpL6cSf3NQiWJCVoEiJhsOI=",
"path": "github.com/rjeczalik/notify", "path": "github.com/rjeczalik/notify",
"revision": "c31e5f2cb22b3e4ef3f882f413847669bf2652b9", "revision": "ff2d4d2cedc09db23cc46d3eeb8b402bca6d819d",
"revisionTime": "2018-02-03T14:01:15Z" "revisionTime": "2017-12-09T07:29:52Z"
}, },
{ {
"checksumSHA1": "5uqO4ITTDMklKi3uNaE/D9LQ5nM=", "checksumSHA1": "5uqO4ITTDMklKi3uNaE/D9LQ5nM=",