fixed close sync issue
Juan Batiz-Benet committed
Sep 27, 2014 at 18:28 UTC
6aa15ddb945364cbfb04864e314e2d6bc8857bb4
2 files changed
+15
-6
daemon/daemon.go
+14
-5
@@ -7,13 +7,14 @@ import (
7
"net"
8
"os"
9
"path"
10
+ "sync"
11
12
core "github.com/jbenet/go-ipfs/core"
13
"github.com/jbenet/go-ipfs/core/commands"
14
u "github.com/jbenet/go-ipfs/util"
15
logging "github.com/op/go-logging"
16
16
- "github.com/camlistore/lock"
17
+ lock "github.com/camlistore/lock"
18
ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
19
)
20
@@ -28,6 +29,7 @@ type DaemonListener struct {
29
node *core.IpfsNode
30
list net.Listener
31
closed bool
32
+ wg sync.WaitGroup
33
lk io.Closer
34
}
35
@@ -88,13 +90,17 @@ func NewCommand() *Command {
90
}
91
92
func (dl *DaemonListener) Listen() {
91
- fmt.Println("listen.")
93
+ if dl.closed {
94
+ panic("attempting to listen on a closed daemon Listener")
95
+ }
96
+
97
+ dl.wg.Add(1)
98
+ log.Info("daemon listening")
99
for {
100
conn, err := dl.list.Accept()
94
- fmt.Println("Loop!")
101
if err != nil {
102
if !dl.closed {
97
- u.PErr("DaemonListener Accept: %v\n", err)
103
+ log.Warning("DaemonListener Accept: %v", err)
104
}
105
dl.lk.Close()
106
return
@@ -135,7 +141,10 @@ func (dl *DaemonListener) handleConnection(conn net.Conn) {
141
142
func (dl *DaemonListener) Close() error {
143
dl.closed = true
138
- return dl.list.Close()
144
+ err := dl.list.Close()
145
+ dl.wg.Wait() // wait till done before releasing lock.
146
+ dl.lk.Close()
147
+ return err
148
}
149
150
func daemonLock(confdir string) (io.Closer, error) {
daemon/daemon_test.go
+1
-1
@@ -63,7 +63,7 @@ func TestInitializeDaemonListener(t *testing.T) {
63
if err != nil {
64
t.Fatal(err)
65
}
66
- dl, initErr := NewDaemonListener(node, addr)
66
+ dl, initErr := NewDaemonListener(node, addr, ".")
67
if initErr != nil {
68
t.Fatal(initErr)
69
}