From 3dada5cdf16b3a5f6a70f0afa744483fe4366d42 Mon Sep 17 00:00:00 2001 From: eb Date: Tue, 19 Dec 2006 22:54:23 +0000 Subject: [PATCH] applied patch for ticket:115 git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@4153 221aa14e-8319-0410-a670-987f0aec2ac5 --- host/lib/fusb_win32.cc | 74 +++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/host/lib/fusb_win32.cc b/host/lib/fusb_win32.cc index 43c2d8b..c6e3c97 100644 --- a/host/lib/fusb_win32.cc +++ b/host/lib/fusb_win32.cc @@ -168,33 +168,33 @@ fusb_ephandle_win32::write (const void *buffer, int nbytes) if (d_output_short == 0) usb_submit_async(d_context[d_curr], &d_buffer[d_curr*d_block_size], d_block_size); - - if (bytes_to_write == 0) - return nbytes; - - assert(d_output_short == 0); } - d_curr = (d_curr+1)%d_nblocks; - buf = &d_buffer[d_curr*d_block_size]; + while (bytes_to_write > 0) { + d_curr = (d_curr+1)%d_nblocks; + buf = &d_buffer[d_curr*d_block_size]; - if (d_outstanding_write != d_nblocks) { - d_outstanding_write++; - } else { - retval = usb_reap_async(d_context[d_curr], USB_TIMEOUT); - if (retval < 0) { - fprintf(stderr, "%s: usb_reap_async: %s\n", - __FUNCTION__, usb_strerror()); - return retval; - } + if (d_outstanding_write != d_nblocks) { + d_outstanding_write++; + } else { + retval = usb_reap_async(d_context[d_curr], USB_TIMEOUT); + if (retval < 0) { + fprintf(stderr, "%s: usb_reap_async: %s\n", + __FUNCTION__, usb_strerror()); + return retval; + } + } + + int ncopy = std::min(bytes_to_write, d_block_size); + memcpy(buf, (void *) &(((char*)buffer)[a]), ncopy); + bytes_to_write -= ncopy; + a += ncopy; + + d_output_short = d_block_size - ncopy; + if (d_output_short == 0) + usb_submit_async(d_context[d_curr], buf, d_block_size); } - memcpy(buf, (void *) &(((char*)buffer)[a]), bytes_to_write); - - d_output_short = d_block_size - bytes_to_write; - if (d_output_short == 0) - usb_submit_async(d_context[d_curr], buf, d_block_size); - return retval < 0 ? retval : nbytes; } @@ -224,27 +224,27 @@ fusb_ephandle_win32::read (void *buffer, int nbytes) if (d_input_leftover == 0) usb_submit_async(d_context[d_curr], &d_buffer[d_curr*d_block_size], d_block_size); - - if (bytes_to_read == 0) - return nbytes; - - assert(d_input_leftover == 0); } + while (bytes_to_read > 0) { - d_curr = (d_curr+1)%d_nblocks; - buf = &d_buffer[d_curr*d_block_size]; + d_curr = (d_curr+1)%d_nblocks; + buf = &d_buffer[d_curr*d_block_size]; - retval = usb_reap_async(d_context[d_curr], USB_TIMEOUT); - if (retval < 0) - fprintf(stderr, "%s: usb_reap_async: %s\n", - __FUNCTION__, usb_strerror()); + retval = usb_reap_async(d_context[d_curr], USB_TIMEOUT); + if (retval < 0) + fprintf(stderr, "%s: usb_reap_async: %s\n", + __FUNCTION__, usb_strerror()); - memcpy((void *) &(((char*)buffer)[a]), buf, bytes_to_read); + int ncopy = std::min(bytes_to_read, d_block_size); + memcpy((void *) &(((char*)buffer)[a]), buf, ncopy); + bytes_to_read -= ncopy; + a += ncopy; - d_input_leftover = d_block_size - bytes_to_read; - if (d_input_leftover == 0) - usb_submit_async(d_context[d_curr], buf, d_block_size); + d_input_leftover = d_block_size - ncopy; + if (d_input_leftover == 0) + usb_submit_async(d_context[d_curr], buf, d_block_size); + } return retval < 0 ? retval : nbytes; }