changeset 2157:1674688917d0

Fix locking between read/write operations and DSRs
author bartv
date Fri, 10 Mar 2006 20:49:54 +0000
parents 1cde7dd73fff
children b2eee5fc1db7
files packages/io/usb/slave/current/ChangeLog packages/io/usb/slave/current/src/usbs.c
diffstat 2 files changed, 9 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/packages/io/usb/slave/current/ChangeLog
+++ b/packages/io/usb/slave/current/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-10  Bart Veer  <bartv@ecoscentric.com>
+
+	* src/usbs.c (usbs_devtab_cwrite, usbs_devtab_cwrite): add
+	DSR locking
+
 2005-06-26  Bart Veer  <bartv@ecoscentric.com>
 
 	* host/usbhost.c, host/configure.in: cope with incompatible
--- a/packages/io/usb/slave/current/src/usbs.c
+++ b/packages/io/usb/slave/current/src/usbs.c
@@ -111,9 +111,11 @@ usbs_devtab_cwrite(cyg_io_handle_t handl
     (*endpoint->start_tx_fn)(endpoint);
     
     cyg_drv_mutex_lock(&wait.lock);
+    cyg_drv_dsr_lock();
     while (!wait.completed) {
         cyg_drv_cond_wait(&wait.signal);
     }
+    cyg_drv_dsr_unlock();
     cyg_drv_mutex_unlock(&wait.lock);
     if (wait.result < 0) {
         result = wait.result;
@@ -155,9 +157,11 @@ usbs_devtab_cread(cyg_io_handle_t handle
     endpoint->complete_data     = (void*) &wait;
     (*endpoint->start_rx_fn)(endpoint);
     cyg_drv_mutex_lock(&wait.lock);
+    cyg_drv_dsr_lock();
     while (!wait.completed) {
         cyg_drv_cond_wait(&wait.signal);
     }
+    cyg_drv_dsr_unlock();
     cyg_drv_mutex_unlock(&wait.lock);
     if (wait.result < 0) {
         result = wait.result;