Convert bytes_left_for_batch_write_ to unsigned integer array.

PiperOrigin-RevId: 328940902
Change-Id: Ia765159ae756b62bef796511dc39987e8dfe00ec
diff --git a/quic/core/quic_write_blocked_list.cc b/quic/core/quic_write_blocked_list.cc
index 3c1edc4..b3602a6 100644
--- a/quic/core/quic_write_blocked_list.cc
+++ b/quic/core/quic_write_blocked_list.cc
@@ -149,8 +149,17 @@
   if (batch_write_stream_id_[last_priority_popped_] == stream_id) {
     // If this was the last data stream popped by PopFront, update the
     // bytes remaining in its batch write.
-    bytes_left_for_batch_write_[last_priority_popped_] -=
-        static_cast<int32_t>(bytes);
+    if (fix_bytes_left_for_batch_write_) {
+      QUIC_RELOADABLE_FLAG_COUNT(quic_fix_bytes_left_for_batch_write);
+      // TODO(fayang): change this static_cast to static_cast<uint32_t> when
+      // deprecating quic_fix_bytes_left_for_batch_write.
+      bytes_left_for_batch_write_[last_priority_popped_] -=
+          std::min(bytes_left_for_batch_write_[last_priority_popped_],
+                   static_cast<int32_t>(bytes));
+    } else {
+      bytes_left_for_batch_write_[last_priority_popped_] -=
+          static_cast<int32_t>(bytes);
+    }
   }
 }
 
diff --git a/quic/core/quic_write_blocked_list.h b/quic/core/quic_write_blocked_list.h
index fd875bc..08f70b3 100644
--- a/quic/core/quic_write_blocked_list.h
+++ b/quic/core/quic_write_blocked_list.h
@@ -13,6 +13,7 @@
 #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_containers.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_map_util.h"
 #include "net/third_party/quiche/src/spdy/core/fifo_write_scheduler.h"
 #include "net/third_party/quiche/src/spdy/core/http2_priority_write_scheduler.h"
@@ -103,6 +104,8 @@
   // Set to kBatchWriteSize when we set a new batch_write_stream_id_ for a given
   // priority.  This is decremented with each write the stream does until it is
   // done with its batch write.
+  // TODO(fayang): switch this to uint32_t when deprecating
+  // quic_fix_bytes_left_for_batch_write.
   int32_t bytes_left_for_batch_write_[spdy::kV3LowestPriority + 1];
   // Tracks the last priority popped for UpdateBytesForStream.
   spdy::SpdyPriority last_priority_popped_;
@@ -153,6 +156,9 @@
   StaticStreamCollection static_stream_collection_;
 
   spdy::WriteSchedulerType scheduler_type_;
+
+  const bool fix_bytes_left_for_batch_write_ =
+      GetQuicReloadableFlag(quic_fix_bytes_left_for_batch_write);
 };
 
 }  // namespace quic