delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2004/05/23/00:42:15

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
X-Originating-IP: [65.25.165.241]
X-Originating-Email: [jw2357 AT hotmail DOT com]
X-Sender: jw2357 AT hotmail DOT com
From: "John William" <jw2357 AT hotmail DOT com>
To: cygwin AT cygwin DOT com
Subject: Re: CYGWIN 1.5.9-1 - Is vprintf() not thread safe?
Date: Sun, 23 May 2004 04:41:56 +0000
Mime-Version: 1.0
Message-ID: <BAY1-F733Ob9Lj3FC4o00027e57@hotmail.com>
X-OriginalArrivalTime: 23 May 2004 04:41:56.0709 (UTC) FILETIME=[47293150:01C44080]

<snip>
>How about posting a simple test case.  If you do so, I'll try and take a
>look.
>
>--
>Brian Ford
>Senior Realtime Software Engineer
>VITAL - Visual Simulation Systems
>FlightSafety International
>the best safety device in any aircraft is a well-trained pilot...

#include <stdarg.h>
#include <pthread.h>

pthread_mutex_t printf_mutex;

void *thread_exec();
void myprintf(char *,...);

main()
{
	pthread_t id1,id2;
	char *s1="11111";
	char *s2="22222";

	pthread_mutex_init(&printf_mutex,NULL);

	pthread_create(&id1,0,thread_exec,(void *)s1);
	pthread_create(&id2,0,thread_exec,(void *)s2);

	pthread_join(id1,NULL);
	pthread_join(id2,NULL);}

void *thread_exec(string)
	char *string;
{
	int i;

	for (i=0;i<10;i++)
		myprintf("%s (%d)\n",string,i);

	pthread_exit(NULL);
}

void myprintf(char *msg,...)
{
        va_list arg;

/*	pthread_mutex_lock(&printf_mutex);*/

	va_start(arg, msg);
	vprintf(msg, arg);
	va_end(arg);

/*	pthread_mutex_unlock(&printf_mutex);*/
}

When run, I get:

$ gcc t.c ; ./a.exe
11111 (0)
11111 (1)
11111 (2)
11111 (3)
11111 (4)
11111 (5)
11111 (6)11111 (6)

22222 (6)22
22222 (2)
( 22222 (3)
122222 (4))

22222 (5)11111 (8)

22222 (6)11111 (9)

22222 (7)
22222 (8)
22222 (9)

With the mutexes uncommented, I get:

$ gcc t.c ; ./a.exe
22222 (0)
22222 (1)
22222 (2)
22222 (3)
22222 (4)
22222 (5)
11111 (0)
22222 (6)
11111 (1)
22222 (7)
11111 (2)
22222 (8)
11111 (3)
22222 (9)
11111 (4)
11111 (5)
11111 (6)
11111 (7)
11111 (8)
11111 (9)

which is as expected.

For this simple test case, I was not able to get vprintf() to crash, but it 
does on my more complicated application (lots of parameters passed to 
vprintf()). I'm pretty sure it's not a bug in my application as putting in 
the mutex locking around the vprintf() stops the crashes.

Thanks again for your help.

- John

_________________________________________________________________
Stop worrying about overloading your inbox - get MSN Hotmail Extra Storage! 
http://join.msn.click-url.com/go/onm00200362ave/direct/01/


--
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/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019