Fix concurrent serial port read and write.

This commit is contained in:
Jonas 'Sortie' Termansen 2016-10-22 23:44:46 +02:00
parent 77defc5e24
commit eacfc72f2f
1 changed files with 7 additions and 1 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, 2012, 2014 Jonas 'Sortie' Termansen. * Copyright (c) 2011, 2012, 2014, 2015, 2016 Jonas 'Sortie' Termansen.
* *
* Permission to use, copy, modify, and distribute this software for any * Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above * purpose with or without fee is hereby granted, provided that the above
@ -193,7 +193,9 @@ ssize_t DevCOMPort::read(ioctx_t* ctx, uint8_t* dest, size_t count)
continue; continue;
if ( attempt <= 15 && !(ctx->dflags & O_NONBLOCK) ) if ( attempt <= 15 && !(ctx->dflags & O_NONBLOCK) )
{ {
kthread_mutex_unlock(&port_lock);
kthread_yield(); kthread_yield();
kthread_mutex_lock(&port_lock);
continue; continue;
} }
if ( i ) if ( i )
@ -202,7 +204,9 @@ ssize_t DevCOMPort::read(ioctx_t* ctx, uint8_t* dest, size_t count)
return errno = EWOULDBLOCK, -1; return errno = EWOULDBLOCK, -1;
if ( Signal::IsPending() ) if ( Signal::IsPending() )
return errno = EINTR, -1; return errno = EINTR, -1;
kthread_mutex_unlock(&port_lock);
kthread_yield(); kthread_yield();
kthread_mutex_lock(&port_lock);
} }
uint8_t value = has_pending_input_byte ? uint8_t value = has_pending_input_byte ?
@ -235,7 +239,9 @@ ssize_t DevCOMPort::write(ioctx_t* ctx, const uint8_t* src, size_t count)
continue; continue;
if ( attempt <= 15 && !(ctx->dflags & O_NONBLOCK) ) if ( attempt <= 15 && !(ctx->dflags & O_NONBLOCK) )
{ {
kthread_mutex_unlock(&port_lock);
kthread_yield(); kthread_yield();
kthread_mutex_lock(&port_lock);
continue; continue;
} }
if ( i ) if ( i )