Add hack of explicitly locking stdout

This shouldn't be necessary as stdout is already locked by libc (see
comment.) Not sure which part isn't working.
This commit is contained in:
Angus Gratton 2016-08-23 17:10:52 +08:00 committed by Wu Jian Gang
parent bd2f9e03f0
commit 94104f0fe8

View File

@ -138,6 +138,13 @@ 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* p = (const char*) data;
if (fd == STDOUT_FILENO) { if (fd == STDOUT_FILENO) {
/* THIS IS A HACK!!! The stdout "file" should be locked while
this code is called (it's locked fflush.c:280 before
__sflush_r is called.) It shouldn't be necessary to
re-lock, but due to some unknown bug it is...
*/
static _lock_t stdout_lock;
_lock_acquire_recursive(&stdout_lock);
while(size--) { while(size--) {
#if CONFIG_NEWLIB_STDOUT_ADDCR #if CONFIG_NEWLIB_STDOUT_ADDCR
if (*p=='\n') { if (*p=='\n') {
@ -147,6 +154,7 @@ ssize_t _write_r(struct _reent *r, int fd, const void * data, size_t size) {
uart_tx_one_char(*p); uart_tx_one_char(*p);
++p; ++p;
} }
_lock_release_recursive(&stdout_lock);
} }
return size; return size;
} }