Merge branch 'bugfix/syscall_write' into 'master'

syscall write: Should return number of bytes written

Fixes bug where sometimes output truncates after a newline, or large
chunks of large output buffers are lost.

Closes #44

See merge request !133
This commit is contained in:
Angus Gratton 2016-10-06 15:58:34 +08:00
commit 12caaed280

View file

@ -143,7 +143,7 @@ int _open_r(struct _reent *r, const char * path, int flags, int mode) {
} }
ssize_t _write_r(struct _reent *r, int fd, const void * data, size_t size) { ssize_t _write_r(struct _reent *r, int fd, const void * data, size_t size) {
const char* p = (const char*) data; const char *data_c = (const char *)data;
if (fd == STDOUT_FILENO) { if (fd == STDOUT_FILENO) {
static _lock_t stdout_lock; /* lazily initialised */ static _lock_t stdout_lock; /* lazily initialised */
/* Even though newlib does stream locking on stdout, we need /* Even though newlib does stream locking on stdout, we need
@ -160,14 +160,13 @@ ssize_t _write_r(struct _reent *r, int fd, const void * data, size_t size) {
which aren't fully valid.) which aren't fully valid.)
*/ */
_lock_acquire_recursive(&stdout_lock); _lock_acquire_recursive(&stdout_lock);
while(size--) { for (size_t i = 0; i < size; i++) {
#if CONFIG_NEWLIB_STDOUT_ADDCR #if CONFIG_NEWLIB_STDOUT_ADDCR
if (*p=='\n') { if (data_c[i]=='\n') {
uart_tx_one_char('\r'); uart_tx_one_char('\r');
} }
#endif #endif
uart_tx_one_char(*p); uart_tx_one_char(data_c[i]);
++p;
} }
_lock_release_recursive(&stdout_lock); _lock_release_recursive(&stdout_lock);
} }