|
@@ -30,7 +30,6 @@ import (
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"sync"
|
|
|
- "sync/atomic"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
@@ -92,16 +91,34 @@ type Door struct {
|
|
|
Config DropfileConfig
|
|
|
READFD int
|
|
|
WRITEFD int
|
|
|
- Disconnected int32
|
|
|
- TimeOut time.Time
|
|
|
- StartTime time.Time
|
|
|
- Pushback FIFOBuffer
|
|
|
- LastColor []int
|
|
|
- readerChannel chan byte
|
|
|
- ReaderCanClose bool
|
|
|
- writerChannel chan string
|
|
|
- closeChannel chan struct{}
|
|
|
- wg sync.WaitGroup
|
|
|
+ Disconnected bool
|
|
|
+ TimeOut time.Time
|
|
|
+ StartTime time.Time
|
|
|
+ Pushback FIFOBuffer
|
|
|
+ LastColor []int
|
|
|
+ ReaderClosed bool
|
|
|
+ readerChannel chan byte
|
|
|
+ ReaderCanClose bool
|
|
|
+ WriterClosed bool
|
|
|
+ writerChannel chan string
|
|
|
+ writerMutex sync.RWMutex
|
|
|
+
|
|
|
+ wg sync.WaitGroup
|
|
|
+}
|
|
|
+
|
|
|
+func (d *Door) SafeWriterClose() {
|
|
|
+ d.writerMutex.Lock()
|
|
|
+ defer d.writerMutex.Unlock()
|
|
|
+ if !d.WriterClosed {
|
|
|
+ d.WriterClosed = true
|
|
|
+ close(d.writerChannel)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (d *Door) WriterIsClosed() bool {
|
|
|
+ d.writerMutex.RLock()
|
|
|
+ defer d.writerMutex.RUnlock()
|
|
|
+ return d.WriterClosed
|
|
|
}
|
|
|
|
|
|
|
|
@@ -114,7 +131,7 @@ func (d *Door) TimeUsed() time.Duration {
|
|
|
}
|
|
|
|
|
|
func (d *Door) Disconnect() bool {
|
|
|
- return atomic.LoadInt32(&d.Disconnected) != 0
|
|
|
+ return d.Disconnected
|
|
|
}
|
|
|
|
|
|
|
|
@@ -290,8 +307,10 @@ func (d *Door) Init(doorname string) {
|
|
|
log.Printf("BBS %s, User %s / Handle %s / File %d\n", d.Config.BBSID, d.Config.Real_name, d.Config.Handle, d.Config.Comm_handle)
|
|
|
|
|
|
d.readerChannel = make(chan byte, 8)
|
|
|
- d.writerChannel = make(chan string)
|
|
|
- d.closeChannel = make(chan struct{}, 2)
|
|
|
+ d.writerChannel = make(chan string)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
d.setupChannels()
|
|
|
|
|
@@ -315,7 +334,10 @@ func (d *Door) Close() {
|
|
|
}()
|
|
|
|
|
|
log.Println("Closing...")
|
|
|
- d.closeChannel <- struct{}{}
|
|
|
+
|
|
|
+ if !d.WriterClosed {
|
|
|
+ d.writerChannel <- ""
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|