Skip to content

Commit b03c545

Browse files
committed
Refactor File to store error_code instead of error flag
1 parent 71554f9 commit b03c545

File tree

2 files changed

+35
-33
lines changed

2 files changed

+35
-33
lines changed

libc/src/__support/File/file.cpp

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace LIBC_NAMESPACE_DECL {
2020

2121
FileIOResult File::write_unlocked(const void *data, size_t len) {
2222
if (!write_allowed()) {
23-
err = true;
23+
error_code = EBADF;
2424
return {0, EBADF};
2525
}
2626

@@ -45,16 +45,16 @@ FileIOResult File::write_unlocked_nbf(const uint8_t *data, size_t len) {
4545
FileIOResult write_result = platform_write(this, buf, write_size);
4646
pos = 0; // Buffer is now empty so reset pos to the beginning.
4747
// If less bytes were written than expected, then an error occurred.
48-
if (write_result < write_size) {
49-
err = true;
48+
if (write_result.has_error() || write_result < write_size) {
49+
error_code = write_result.has_error() ? write_result.error : EIO;
5050
// No bytes from data were written, so return 0.
51-
return {0, write_result.error};
51+
return {0, error_code};
5252
}
5353
}
5454

5555
FileIOResult write_result = platform_write(this, data, len);
56-
if (write_result < len)
57-
err = true;
56+
if (write_result.has_error() || write_result < len)
57+
error_code = write_result.has_error() ? write_result.error : EIO;
5858
return write_result;
5959
}
6060

@@ -106,9 +106,9 @@ FileIOResult File::write_unlocked_fbf(const uint8_t *data, size_t len) {
106106
// If less bytes were written than expected, then an error occurred. Return
107107
// the number of bytes that have been written from |data|.
108108
if (buf_result.has_error() || bytes_written < write_size) {
109-
err = true;
109+
error_code = buf_result.has_error() ? buf_result.error : EIO;
110110
return {bytes_written <= init_pos ? 0 : bytes_written - init_pos,
111-
buf_result.error};
111+
error_code};
112112
}
113113

114114
// The second piece is handled basically the same as the first, although we
@@ -128,8 +128,8 @@ FileIOResult File::write_unlocked_fbf(const uint8_t *data, size_t len) {
128128
// If less bytes were written than expected, then an error occurred. Return
129129
// the number of bytes that have been written from |data|.
130130
if (result.has_error() || bytes_written < remainder.size()) {
131-
err = true;
132-
return {primary.size() + bytes_written, result.error};
131+
error_code = result.has_error() ? result.error : EIO;
132+
return {primary.size() + bytes_written, error_code};
133133
}
134134
}
135135

@@ -166,26 +166,28 @@ FileIOResult File::write_unlocked_lbf(const uint8_t *data, size_t len) {
166166

167167
size_t written = 0;
168168

169-
written = write_unlocked_nbf(primary.data(), primary.size());
170-
if (written < primary.size()) {
171-
err = true;
172-
return written;
169+
auto write_result = write_unlocked_nbf(primary.data(), primary.size());
170+
written += write_result;
171+
if (write_result.has_error() || written < primary.size()) {
172+
error_code = write_result.has_error() ? write_result.error : EIO;
173+
return {written, error_code};
173174
}
174175

175176
flush_unlocked();
176177

177-
written += write_unlocked_fbf(remainder.data(), remainder.size());
178-
if (written < len) {
179-
err = true;
180-
return written;
178+
write_result = write_unlocked_fbf(remainder.data(), remainder.size());
179+
written += write_result;;
180+
if (write_result.has_error() || written < len) {
181+
error_code = write_result.has_error() ? write_result.error : EIO;
182+
return {written, error_code};
181183
}
182184

183185
return len;
184186
}
185187

186188
FileIOResult File::read_unlocked(void *data, size_t len) {
187189
if (!read_allowed()) {
188-
err = true;
190+
error_code = EBADF;
189191
return {0, EBADF};
190192
}
191193

@@ -244,7 +246,7 @@ FileIOResult File::read_unlocked_fbf(uint8_t *data, size_t len) {
244246
if (!result.has_error())
245247
eof = true;
246248
else
247-
err = true;
249+
error_code = result.error;
248250
return {available_data + fetched_size, result.error};
249251
}
250252
return len;
@@ -262,7 +264,7 @@ FileIOResult File::read_unlocked_fbf(uint8_t *data, size_t len) {
262264
if (!result.has_error())
263265
eof = true;
264266
else
265-
err = true;
267+
error_code = result.error;
266268
}
267269
return {transfer_size + available_data, result.error};
268270
}
@@ -282,7 +284,7 @@ FileIOResult File::read_unlocked_nbf(uint8_t *data, size_t len) {
282284
if (!result.has_error())
283285
eof = true;
284286
else
285-
err = true;
287+
error_code = result.error;
286288
}
287289
return {result + available_data, result.error};
288290
}
@@ -321,7 +323,7 @@ int File::ungetc_unlocked(int c) {
321323
}
322324

323325
eof = false; // There is atleast one character that can be read now.
324-
err = false; // This operation was a success.
326+
error_code = 0; // This operation was a success.
325327
return c;
326328
}
327329

@@ -331,8 +333,8 @@ ErrorOr<int> File::seek(off_t offset, int whence) {
331333

332334
FileIOResult buf_result = platform_write(this, buf, pos);
333335
if (buf_result.has_error() || buf_result.value < pos) {
334-
err = true;
335-
return Error(buf_result.error);
336+
error_code = buf_result.has_error() ? buf_result.error : EIO;
337+
return Error(error_code);
336338
}
337339
} else if (prev_op == FileOp::READ && whence == SEEK_CUR) {
338340
// More data could have been read out from the platform file than was
@@ -369,8 +371,8 @@ int File::flush_unlocked() {
369371
if (prev_op == FileOp::WRITE && pos > 0) {
370372
FileIOResult buf_result = platform_write(this, buf, pos);
371373
if (buf_result.has_error() || buf_result.value < pos) {
372-
err = true;
373-
return buf_result.error;
374+
error_code = buf_result.has_error() ? buf_result.error : EIO;
375+
return error_code;
374376
}
375377
pos = 0;
376378
}

libc/src/__support/File/file.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class File {
118118
size_t read_limit;
119119

120120
bool eof;
121-
bool err;
121+
int error_code;
122122

123123
// This is a convenience RAII class to lock and unlock file objects.
124124
class FileLock {
@@ -161,7 +161,7 @@ class File {
161161
/*robust=*/false, /*pshared=*/false),
162162
ungetc_buf(0), buf(buffer), bufsize(buffer_size), bufmode(buffer_mode),
163163
own_buf(owned), mode(modeflags), pos(0), prev_op(FileOp::NONE),
164-
read_limit(0), eof(false), err(false) {
164+
read_limit(0), eof(false), error_code(0) {
165165
adjust_buf();
166166
}
167167

@@ -214,8 +214,8 @@ class File {
214214
if (prev_op == FileOp::WRITE && pos > 0) {
215215
auto buf_result = platform_write(this, buf, pos);
216216
if (buf_result.has_error() || buf_result.value < pos) {
217-
err = true;
218-
return buf_result.error;
217+
error_code = buf_result.has_error() ? buf_result.error : EIO;
218+
return error_code;
219219
}
220220
}
221221
}
@@ -250,14 +250,14 @@ class File {
250250
void lock() { mutex.lock(); }
251251
void unlock() { mutex.unlock(); }
252252

253-
bool error_unlocked() const { return err; }
253+
bool error_unlocked() const { return error_code != 0; }
254254

255255
bool error() {
256256
FileLock l(this);
257257
return error_unlocked();
258258
}
259259

260-
void clearerr_unlocked() { err = false; }
260+
void clearerr_unlocked() { error_code = 0; }
261261

262262
void clearerr() {
263263
FileLock l(this);

0 commit comments

Comments
 (0)