Can you include the output from your run so we can see the print messages?  Are 
you sure you are blocked at the pthread_cond_wait and not at the 
pthread_mutex_lock call?

Sincerely,
Chase Maupin
Software Applications
Catalog DSP Products
e-mail: [email protected]<mailto:[email protected]>
phone: (281) 274-3285
________________________________
From: 
davinci-linux-open-source-bounces+chase.maupin=ti....@linux.davincidsp.com 
[mailto:davinci-linux-open-source-bounces+chase.maupin=ti....@linux.davincidsp.com]
 On Behalf Of Neeraj Tandon
Sent: Friday, January 09, 2009 12:34 AM
To: [email protected]
Subject: pthread_cond_wait issue

Hi,

I have used usb.c ( as posted on Wavinci Wiki page for USB to PCI loopback). I 
modified this by removing some of PCI waitforInterrupt calls and was testing 
with two sink and source threads with pthread_cond_wait and 
pthread_cond_broadcast. Essentially

-  The source thread blocks with a call to pthread_cond_wait
- The sink thread receives data from USB bus and after reading in a buffer 
broadcast to source thread
- The source thread should wake up and write back this data

The issue is I do see the call for broadcast to test_cond ( my conditional 
variable) but never see the source thread being woken up by this. Is there 
anything I am doing wrong in this code snippet:

WRITE (source thread)

do {
      /* original LinuxThreads cancelation didn't work right
* so test for it explicitly.
*/
pthread_testcancel ();
pthread_mutex_lock(&test_mutex);
if (data_received == 0) {
printf("blocked on cond\n");
ret = pthread_cond_wait(&test_cond, &test_mutex);
printf("write ret = %d\n", ret);
}
printf("Got data \n");
status = write (source_fd, buffer, USB_BUFSIZE);
data_received = 0;
pthread_mutex_unlock(&test_mutex);
} while (status >= 0);


Read (or Sink Thread )

do {
/* original LinuxThreads cancelation didn't work right
* so test for it explicitly.
*/
/* pthread_testcancel ();*/
errno = 0;
/* get mutex as we need to protect buffer and data_sent flag */
pthread_mutex_lock(&test_mutex);
/* Read the data from USB into mmap'ed buffer */
status = read (sink_fd, buffer, USB_BUFSIZE);
if (status < 0) {
/* give up mutex */
pthread_mutex_unlock(&test_mutex);
break;
}
data_received=1;
if (data_received == 1) {
/* signal write task */
printf("broadcast to cond\n");
ret = pthread_cond_broadcast(&test_cond);
printf("read ret= %d\n", ret);
}
/* give up mutex */
pthread_mutex_unlock(&test_mutex);
printf("Read data from buffer\n");
printf("read unlocking mutex\n status = %d", status);
} while (status > 0);








_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to