[pa3efu@yahoo.com: Re: setvbuf/setlinebuf issue] Thomas can you comment?

Thomas Pfaff tpfaff@gmx.net
Fri Sep 19 06:11:00 GMT 2003


This is another problem with __DYNAMIC_REENT__, where every thread has 
its own stdin, stdout and stderr FIL pointer.

I already submitted a patch to newlib which should hopefully fix this. 
After its acceptance it requires 3 additional functions to be exported 
in cygwin.din.

The bad news are that this patch again needs a recompilation of all user 
apps, starting with gcc to get it into libstdc++, because the stdin, 
stdout and stderr defines have changed again.

Thomas

Christopher Faylor wrote:
> I was getting ready to roll out a 1.5.5 release and then I rememebered
> this problem.
> 
> Thomas, can you comment on this?
> 
> cgf
> 
> ----- Forwarded message from Jan Jaeger <pa3efu@yahoo.com> -----
> 
> From: Jan Jaeger <pa3efu@yahoo.com>
> To: cygwin@cygwin.com
> Subject: Re: setvbuf/setlinebuf issue
> Date: Wed, 17 Sep 2003 10:44:16 -0700 (PDT)
> Mail-Followup-To: cygwin@cygwin.com
> 
> The issue appears related to the use of the pthread
> library, where is almost appears if every thread now
> has its own streams buffer, rather then a shared
> buffer as the threading model dictates.
> 
> In the belowlisted sample, the 'main' thread creates a
> logger thread which issues the setvbuf and
> subsequently signals a condition that the main thread
> is waiting on.
> When the main thread resumes and it issues printf()'s
> these are not line buffered as requested in the logger
> thread.  
> The test case should display test1 and test 2, wait
> for 5 seconds and then display test2, instead it
> displays test 1, then is waits, then test2 and test3
> are displayed, eventhough there is no sleep between
> test 1 and test 2.
> What is not in this testcase, is that any printf()
> from any other thread is not line buffered once again,
> so the it appears that the buffering indicator has
> become thread dependent, rather then stream dependent.
> 
> Thanks, 
> 
> Jan Jaeger
> 
> Test case:
> 
> #include <unistd.h>
> #include <stdio.h>
> #include <signal.h>
> #include <pthread.h>
> 
> static pthread_attr_t  logger_attr;
> static pthread_cond_t  logger_cond;
> static pthread_mutex_t  logger_lock;
> static pthread_t   logger_tid;
> 
> 
> static int pipefd[2];
> 
> void *logger_thread(void *arg)
> {
> int n;
> char buffer[80];
> 
> 
>   setvbuf(stdout, NULL, _IOLBF, 0); // *** THIS DOES
> NOT WORK PROPERLY ***
> 
>   pthread_mutex_lock(&logger_lock);
>   pthread_cond_signal(&logger_cond);
>   pthread_mutex_unlock(&logger_lock);
> 
>   while(1)
>   {
>     n = read(pipefd[0], buffer, sizeof(buffer));
>     buffer[n] = '\0';
>     fprintf(stderr,buffer);
>   }
> }
> 
> main()
> {
> 
>   pipe(pipefd);
>   dup2(pipefd[1],STDOUT_FILENO);
> 
>   pthread_attr_init(&logger_attr);
>   pthread_attr_setstacksize(&logger_attr,1048576);
>  
> pthread_attr_setdetachstate(&logger_attr,PTHREAD_CREATE_DETACHED);
>   pthread_cond_init (&logger_cond,NULL);
>   pthread_mutex_init (&logger_lock,NULL);
>   pthread_create (&logger_tid, &logger_attr,
> logger_thread, NULL);
>   pthread_mutex_lock(&logger_lock);
>   pthread_cond_wait(&logger_cond,&logger_lock);
>   pthread_mutex_unlock(&logger_lock);
> 
> 
> //setvbuf(stdout, NULL, _IOLBF, 0);
> 
> printf("test1\n");
> fflush(stdout);
> 
> printf("test2\n");
> sleep(5);
> 
> printf("test3\n");
> fflush(stdout);
> 
> sleep(5);
> 
> pthread_kill(logger_tid,SIGKILL);
> fprintf(stderr,"done\n");
> }
> 
> ============================================================================================================
> From: Christopher Faylor <cgf-rcm at cygwin dot com> 
> To: cygwin at cygwin dot com 
> Date: Tue, 16 Sep 2003 16:04:00 -0400 
> Subject: Re: setvbuf/setlinebuf issue 
> References:
> <20030916191331.85685.qmail@web40017.mail.yahoo.com> 
> Reply-to: cygwin at cygwin dot com 
> 
> --------------------------------------------------------------------------------
> 
> On Tue, Sep 16, 2003 at 12:13:31PM -0700, Jan Jaeger
> wrote:
> 
>>We have always used setvbuf(stdout, NULL, _IOLBF, 0)
> 
> to ensure that
> 
>>each line is read by the logger as it is written.
>>
>>However this has now stopped working in the current
> 
> release of cygwin,
> 
>>adding a fflush() after every printf() bypasses the
> 
> error, but at the
> 
>>moment setvbuf does not seem to work correctly for
> 
> us.
> 
> Do you have a simple test case which demonstrates
> this?  I wrote the
> below and piped it into cat and it works as expected. 
> "foo" is printed,
> there is a five second pause, and "bar is printed.
> 
> cgf
> 
> #include <stdio.h>
> int
> main (int argc, char **argv)
> {
>   setvbuf(stdout, NULL, _IOLBF, 0);
>   printf ("foo\n");
>   sleep (5);
>   printf ("bar");
> }
> 
> 
> 
> __________________________________
> Do you Yahoo!?
> Yahoo! SiteBuilder - Free, easy-to-use web site design software
> http://sitebuilder.yahoo.com
> 
> --
> Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
> Problem reports:       http://cygwin.com/problems.html
> Documentation:         http://cygwin.com/docs.html
> FAQ:                   http://cygwin.com/faq/
> 
> ----- End forwarded message -----
> 




More information about the Cygwin-developers mailing list