Browse Source

When queuing messages for sending, store the original "send" error handler alongside them.

This ensures that the error handler that was submitted with the message gets called for that message, instead of the one that was passed when messages started to "spill" into the qeueue.
Daniel Alm 7 years ago
parent
commit
e39f5f7501
1 changed files with 4 additions and 5 deletions
  1. 4 5
      Sources/gRPC/Call.swift

+ 4 - 5
Sources/gRPC/Call.swift

@@ -155,7 +155,7 @@ public class Call {
   private var owned: Bool
   private var owned: Bool
 
 
   /// A queue of pending messages to send over the call
   /// A queue of pending messages to send over the call
-  private var messageQueue: Array<Data>
+  private var messageQueue: [(dataToSend: Data, errorHandler: (Error) -> Void)] = []
 
 
   /// True if a message write operation is underway
   /// True if a message write operation is underway
   private var writing: Bool
   private var writing: Bool
@@ -174,7 +174,6 @@ public class Call {
     self.underlyingCall = underlyingCall
     self.underlyingCall = underlyingCall
     self.owned = owned
     self.owned = owned
     self.completionQueue = completionQueue
     self.completionQueue = completionQueue
-    messageQueue = []
     writing = false
     writing = false
     sendMutex = Mutex()
     sendMutex = Mutex()
   }
   }
@@ -258,7 +257,7 @@ public class Call {
         (messageQueue.count == Call.messageQueueMaxLength) {
         (messageQueue.count == Call.messageQueueMaxLength) {
         throw CallWarning.blocked
         throw CallWarning.blocked
       }
       }
-      messageQueue.append(data)
+      messageQueue.append((dataToSend: data, errorHandler: errorHandler))
     } else {
     } else {
       writing = true
       writing = true
       try sendWithoutBlocking(data: data, errorHandler: errorHandler)
       try sendWithoutBlocking(data: data, errorHandler: errorHandler)
@@ -274,9 +273,9 @@ public class Call {
             self.sendMutex.synchronize {
             self.sendMutex.synchronize {
               // if there are messages pending, send the next one
               // if there are messages pending, send the next one
               if self.messageQueue.count > 0 {
               if self.messageQueue.count > 0 {
-                let nextMessage = self.messageQueue.removeFirst()
+                let (nextMessage, nextErrorHandler) = self.messageQueue.removeFirst()
                 do {
                 do {
-                  try self.sendWithoutBlocking(data: nextMessage, errorHandler: errorHandler)
+                  try self.sendWithoutBlocking(data: nextMessage, errorHandler: nextErrorHandler)
                 } catch (let callError) {
                 } catch (let callError) {
                   errorHandler(callError)
                   errorHandler(callError)
                 }
                 }