@@ -2,7 +2,6 @@ package quickfix
22
33import (
44 "fmt"
5- "sync"
65 "time"
76
87 "github.com/quickfixgo/quickfix/config"
@@ -18,11 +17,8 @@ type session struct {
1817 sessionID SessionID
1918
2019 messageOut chan []byte
21-
22- //application messages are queued up to be sent during the run loop.
23- toSend []Message
24- //mutex for access to toSend
25- sendMutex sync.Mutex
20+ messageIn chan fixIn
21+ toSend chan sendRequest
2622
2723 sessionEvent chan event
2824 messageEvent chan bool
@@ -189,35 +185,8 @@ func (s *session) resend(msg Message) {
189185 s .sendBytes (msg .rawMessage )
190186}
191187
192- //queueForSend will queue up a message to be sent by the session during the next iteration of the run loop
193- func (s * session ) queueForSend (msg Message ) {
194- s .sendMutex .Lock ()
195- defer s .sendMutex .Unlock ()
196- s .toSend = append (s .toSend , msg )
197- select {
198- case s .messageEvent <- true :
199- default :
200- }
201- }
202-
203- //sends queued messages if session is logged on
204- func (s * session ) sendQueued () {
205- if ! s .IsLoggedOn () {
206- return
207- }
208-
209- s .sendMutex .Lock ()
210- defer s .sendMutex .Unlock ()
211-
212- for _ , msg := range s .toSend {
213- s .send (msg )
214- }
215-
216- s .toSend = s .toSend [:0 ]
217- }
218-
219188//send should NOT be called outside of the run loop
220- func (s * session ) send (msg Message ) {
189+ func (s * session ) send (msg Message ) error {
221190 s .fillDefaultHeader (msg )
222191
223192 seqNum := s .store .NextSenderMsgSeqNum ()
@@ -230,12 +199,13 @@ func (s *session) send(msg Message) {
230199 s .application .ToApp (msg , s .sessionID )
231200 }
232201 if msgBytes , err := msg .Build (); err != nil {
233- panic ( err )
202+ return err
234203 } else {
235204 s .store .SaveMessage (seqNum , msgBytes )
236205 s .sendBytes (msgBytes )
237206 s .store .IncrNextSenderMsgSeqNum ()
238207 }
208+ return nil
239209}
240210
241211func (s * session ) sendBytes (msg []byte ) {
@@ -511,7 +481,13 @@ type fixIn struct {
511481 receiveTime time.Time
512482}
513483
484+ type sendRequest struct {
485+ msg Message
486+ err chan error
487+ }
488+
514489func (s * session ) run (msgIn chan fixIn , msgOut chan []byte , quit chan bool ) {
490+ s .messageIn = msgIn
515491 s .messageOut = msgOut
516492
517493 defer func () {
@@ -549,9 +525,13 @@ func (s *session) run(msgIn chan fixIn, msgOut chan []byte, quit chan bool) {
549525 return
550526 }
551527
552- s .sendQueued ()
553-
554528 select {
529+ case request := <- s .toSend :
530+ if s .IsLoggedOn () {
531+ request .err <- s .send (request .msg )
532+ } else {
533+ request .err <- fmt .Errorf ("Not logged on" )
534+ }
555535 case fixIn , ok := <- msgIn :
556536 if ok {
557537 s .log .OnIncoming (string (fixIn .bytes ))
@@ -575,7 +555,6 @@ func (s *session) run(msgIn chan fixIn, msgOut chan []byte, quit chan bool) {
575555 }
576556 case evt := <- s .sessionEvent :
577557 s .sessionState = s .Timeout (s , evt )
578- case <- s .messageEvent :
579558 }
580559 }
581560}
0 commit comments