ソースを参照

Use larger readerChannel buffer.

Steve Thielemann 2 年 前
コミット
39fab12b92
2 ファイル変更38 行追加89 行削除
  1. 1 1
      door/door.go
  2. 37 88
      door/input_linux.go

+ 1 - 1
door/door.go

@@ -445,7 +445,7 @@ func (d *Door) Init(doorname string) {
 	log.Printf("Loading dropfile %s\n", dropfile)
 	log.Printf("Loading dropfile %s\n", dropfile)
 	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)
 	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 rune) // was 8 ?
+	d.readerChannel = make(chan rune, 16) // was 8 ?
 	/*
 	/*
 		Ok, here's the issue.  This blocks the go reader when this is full.
 		Ok, here's the issue.  This blocks the go reader when this is full.
 		It seems like it would be better to have a channel that receives
 		It seems like it would be better to have a channel that receives

+ 37 - 88
door/input_linux.go

@@ -3,6 +3,7 @@ package door
 import (
 import (
 	"bufio"
 	"bufio"
 	"bytes"
 	"bytes"
+	"io"
 	"log"
 	"log"
 	"syscall"
 	"syscall"
 	"time"
 	"time"
@@ -24,43 +25,13 @@ func set(fdSetPtr *syscall.FdSet, fd int) {
 	(*fdSetPtr).Bits[fd/64] |= 1 << uint64(fd%64)
 	(*fdSetPtr).Bits[fd/64] |= 1 << uint64(fd%64)
 }
 }
 
 
-/*
-	func main() {
-		var text string = "\x1b\u2415\xff"
-		var buffer []byte = []byte(text)
-		var readbuffer = bytes.NewBuffer(buffer)
-		// bytes.Buffer{}
-		// readbuffer.Write(buffer)
-
-		var runeread = bufio.NewReaderSize(readbuffer, 1)
-
-		//for readbuffer.Len() > 0 {
-		for {
-			r, _, err := runeread.ReadRune()
-			if err != nil {
-				break
-			}
-			if r == unicode.ReplacementChar {
-				runeread.UnreadRune()
-				b, _ := runeread.ReadByte()
-				fmt.Printf("BYTE %#v\n", b)
-			} else {
-				fmt.Printf("%#v\n", r)
-			}
-		}
-*/
-const READ_SIZE = 16
+const READ_SIZE = 16 // Size of read buffer
 
 
 // go routine Reader for input
 // go routine Reader for input
 // This "times out" every ReaderTimeval
 // This "times out" every ReaderTimeval
 func Reader(d *Door) {
 func Reader(d *Door) {
 	// I need non-blocking reads here.
 	// I need non-blocking reads here.
 
 
-	// I'm not really using either of these things.
-
-	// d.readerFile = os.NewFile(uintptr(d.READFD), "Door FD")
-	// d.runereader = bufio.NewReaderSize(d.readerFile, 1)
-
 	defer func() {
 	defer func() {
 		log.Printf("~Reader\n")
 		log.Printf("~Reader\n")
 		if d.ReaderCanClose {
 		if d.ReaderCanClose {
@@ -74,12 +45,9 @@ func Reader(d *Door) {
 	}()
 	}()
 
 
 	var fdset syscall.FdSet
 	var fdset syscall.FdSet
-	var readone []byte = make([]byte, READ_SIZE) //make([]byte, 0, READ_SIZE)
-	// read 1 byte
-	var readbuffer bytes.Buffer // NewBuffer(readone)
-	var runeread = bufio.NewReaderSize(&readbuffer, 1)
-
-	// var buffer []byte = make([]byte, 0)  // unicode read buffer
+	var readbuffer [READ_SIZE]byte
+	var runebuffer bytes.Buffer
+	var runeread = bufio.NewReaderSize(&runebuffer, 1)
 
 
 	for {
 	for {
 		clearAll(&fdset)
 		clearAll(&fdset)
@@ -105,36 +73,14 @@ func Reader(d *Door) {
 
 
 		if v == 0 {
 		if v == 0 {
 			// timeout
 			// timeout
-			/*
-				if len(buffer) > 0 {
-					timeoutCount++
-
-					input, size = utf8.DecodeRune(buffer)
-					if input != utf8.RuneError {
-						d.readerChannel <- input
-						for size > 0 {
-							ArrayDelete(&buffer, 0)
-							size--
-						}
-						timeoutCount = 0
-
-					} else {
-						b, _ := ArrayDelete(&buffer, 0)
-						d.readerChannel <- rune(b)
-					}
-				} else {
-					timeoutCount = 0
-				}
-			*/
 			continue
 			continue
 		}
 		}
 
 
-		log.Println("syscall.Read:", len(readone), cap(readone))
 		// The buffer used here must have len & cap to size you want to read.
 		// The buffer used here must have len & cap to size you want to read.
-
-		r, err := syscall.Read(d.READFD, readone)
+		// use [BUFF_SIZE]byte for readone
+		r, err := syscall.Read(d.READFD, readbuffer[:])
 		if r == -1 {
 		if r == -1 {
-			log.Println("Read -1 (closed)")
+			log.Println("syscall.Read -1 (closed)")
 			d.readerMutex.Lock()
 			d.readerMutex.Lock()
 			defer d.readerMutex.Unlock()
 			defer d.readerMutex.Unlock()
 			if !d.ReaderClosed {
 			if !d.ReaderClosed {
@@ -155,41 +101,44 @@ func Reader(d *Door) {
 			}
 			}
 			return
 			return
 		}
 		}
-		// readone = readone[:r]
 
 
 		if DEBUG_INPUT {
 		if DEBUG_INPUT {
-			log.Printf("Reader << %d, %#v\n", r, readone[:r])
+			log.Printf("Reader << %d, %#v\n", r, readbuffer[:r])
 		}
 		}
 
 
-		// Is this unicode?
-		readbuffer.Write(readone[:r])
-		// reset
-		// readone = readone[0:0]
-		log.Println("readone:", len(readone), cap(readone))
+		runebuffer.Write(readbuffer[:r])
 		var input rune
 		var input rune
 
 
-	RuneRead:
+		// Is this unicode?
 
 
-		input, _, err = runeread.ReadRune()
-		if err != nil {
-			log.Printf("ReadRune: %#v\n", err)
-			// errors EOF
-			continue
-		}
-		if input == unicode.ReplacementChar {
-			runeread.UnreadRune()
-			b, _ := runeread.ReadByte()
-			if DEBUG_INPUT {
-				log.Printf("Reader (byte) >> %x\n", b)
+		err = nil
+		for err == nil {
+			//RuneRead:
+
+			input, _, err = runeread.ReadRune()
+
+			if err == io.EOF {
+				continue
 			}
 			}
-			d.readerChannel <- rune(b)
-		} else {
-			if DEBUG_INPUT {
-				log.Printf("Reader >> %x\n", input)
+			if err != nil {
+				log.Printf("ReadRune: %#v\n", err)
+				// errors EOF
+				continue // break for loop
 			}
 			}
-			d.readerChannel <- input
-		}
-		goto RuneRead
+			if input == unicode.ReplacementChar {
+				runeread.UnreadRune()
+				b, _ := runeread.ReadByte()
+				if DEBUG_INPUT {
+					log.Printf("Reader (byte) >> %x\n", b)
+				}
+				d.readerChannel <- rune(b)
+			} else {
+				if DEBUG_INPUT {
+					log.Printf("Reader >> %x\n", input)
+				}
+				d.readerChannel <- input
+			}
+		} // goto RuneRead
 
 
 		// buffer = append(buffer, readone[0])
 		// buffer = append(buffer, readone[0])