mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
Allow bufio.Reader and bufio.Writer to have a configurable max_consecutive_empty_(reads|writes) field
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user