瀏覽代碼

Allow `bufio.Reader` and `bufio.Writer` to have a configurable `max_consecutive_empty_(reads|writes)` field

gingerBill 4 年之前
父節點
當前提交
3803bdff5f
共有 2 個文件被更改,包括 16 次插入4 次删除
  1. 8 2
      core/bufio/reader.odin
  2. 8 2
      core/bufio/writer.odin

+ 8 - 2
core/bufio/reader.odin

@@ -17,6 +17,8 @@ Reader :: struct {
 
 
 	last_byte:      int, // last byte read, invalid is -1
 	last_byte:      int, // last byte read, invalid is -1
 	last_rune_size: int, // size of last rune read, invalid is -1
 	last_rune_size: int, // size of last rune read, invalid is -1
+
+	max_consecutive_empty_reads: int,
 }
 }
 
 
 
 
@@ -25,7 +27,7 @@ DEFAULT_BUF_SIZE :: 4096;
 @(private)
 @(private)
 MIN_READ_BUFFER_SIZE :: 16;
 MIN_READ_BUFFER_SIZE :: 16;
 @(private)
 @(private)
-MAX_CONSECUTIVE_EMPTY_READS :: 128;
+DEFAULT_MAX_CONSECUTIVE_EMPTY_READS :: 128;
 
 
 reader_init :: proc(b: ^Reader, rd: io.Reader, size: int = DEFAULT_BUF_SIZE, allocator := context.allocator) {
 reader_init :: proc(b: ^Reader, rd: io.Reader, size: int = DEFAULT_BUF_SIZE, allocator := context.allocator) {
 	size := size;
 	size := size;
@@ -71,8 +73,12 @@ _reader_read_new_chunk :: proc(b: ^Reader) -> io.Error {
 		return .Buffer_Full;
 		return .Buffer_Full;
 	}
 	}
 
 
+	if b.max_consecutive_empty_reads <= 0 {
+		b.max_consecutive_empty_reads = DEFAULT_MAX_CONSECUTIVE_EMPTY_READS;
+	}
+
 	// read new data, and try a limited number of times
 	// read new data, and try a limited number of times
-	for i := MAX_CONSECUTIVE_EMPTY_READS; i > 0; i -= 1 {
+	for i := b.max_consecutive_empty_reads; i > 0; i -= 1 {
 		n, err := io.read(b.rd, b.buf[b.w:]);
 		n, err := io.read(b.rd, b.buf[b.w:]);
 		if n < 0 {
 		if n < 0 {
 			return .Negative_Read;
 			return .Negative_Read;

+ 8 - 2
core/bufio/writer.odin

@@ -15,6 +15,8 @@ Writer :: struct {
 
 
 	err: io.Error,
 	err: io.Error,
 
 
+	max_consecutive_empty_writes: int,
+
 }
 }
 
 
 writer_init :: proc(b: ^Writer, wr: io.Writer, size: int = DEFAULT_BUF_SIZE, allocator := context.allocator) {
 writer_init :: proc(b: ^Writer, wr: io.Writer, size: int = DEFAULT_BUF_SIZE, allocator := context.allocator) {
@@ -185,16 +187,20 @@ writer_read_from :: proc(b: ^Writer, r: io.Reader) -> (n: i64, err: io.Error) {
 				return n, ferr;
 				return n, ferr;
 			}
 			}
 		}
 		}
+		if b.max_consecutive_empty_writes <= 0 {
+			b.max_consecutive_empty_writes = DEFAULT_MAX_CONSECUTIVE_EMPTY_READS;
+		}
+
 		m: int;
 		m: int;
 		nr := 0;
 		nr := 0;
-		for nr < MAX_CONSECUTIVE_EMPTY_READS {
+		for nr < b.max_consecutive_empty_writes {
 			m, err = io.read(r, b.buf[b.n:]);
 			m, err = io.read(r, b.buf[b.n:]);
 			if m != 0 || err != nil {
 			if m != 0 || err != nil {
 				break;
 				break;
 			}
 			}
 			nr += 1;
 			nr += 1;
 		}
 		}
-		if nr == MAX_CONSECUTIVE_EMPTY_READS {
+		if nr == b.max_consecutive_empty_writes {
 			return n, .No_Progress;
 			return n, .No_Progress;
 		}
 		}
 		b.n += m;
 		b.n += m;