package door import ( "fmt" "log" "strings" "syscall" ) func Writer(d *Door) { var handle syscall.Handle = syscall.Handle(d.WRITEFD) // Config.Comm_handle) // handle syscall.Handle, writerChannel *chan string log.Println("Writer") defer d.wg.Done() var Closed bool = false for { /* select { case <-d.closeChannel: close(d.writerChannel) log.Println("~Writer") return default: } */ select { /* case <-d.closeChannel: close(d.writerChannel) log.Println("~Writer") return */ case output, ok := <-d.writerChannel: if !ok { log.Println("closeChannel") d.writerMutex.Lock() if !d.WriterClosed { d.WriterClosed = true } d.writerMutex.Unlock() log.Println("~Writer") return } else { if output == "" { Closed = true continue } if Closed { log.Println("Ignoring write output.") continue } if strings.HasSuffix(output, RestorePos) { output += Color(d.LastColor...) } else { d.UpdateLastColor(output, &d.LastColor) } var l uint32 = uint32(len(output)) var buffer []byte = []byte(output) WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]} var UitnZero_1 uint32 = uint32(0) var DataWrite uint32 = uint32(0) var err error err = syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil) if err != nil { fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err) } if (err != nil) || (l != DataWrite) { log.Println("CloseChannel") Closed = true d.writerMutex.Lock() if !d.WriterClosed { d.WriterClosed = true } d.writerMutex.Unlock() /* if !d.Disconnect() { atomic.StoreInt32(&d.Disconnected, 1) close(d.writerChannel) } log.Println("~Writer") return */ } } } } /* for output := range *writerChannel { l := uint32(len(output)) buffer := []byte(output) WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]} UitnZero_1 := uint32(0) DataWrite := uint32(0) err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil) if err != nil { fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err) } if (err != nil) || (l != DataWrite) { close(*writerChannel) break } } */ }