From owner-freebsd-hackers Sat Nov 27 18:43:32 1999 Delivered-To: freebsd-hackers@freebsd.org Received: from november.jaded.net (november.jaded.net [216.94.113.4]) by hub.freebsd.org (Postfix) with ESMTP id 0835414D3A for ; Sat, 27 Nov 1999 18:43:29 -0800 (PST) (envelope-from dan@november.jaded.net) Received: (from dan@localhost) by november.jaded.net (8.9.3/8.9.3+trinsec_nospam) id VAA28246; Sat, 27 Nov 1999 21:43:08 -0500 (EST) Date: Sat, 27 Nov 1999 21:43:08 -0500 From: Dan Moschuk To: FengYue Cc: hackers@FreeBSD.ORG Subject: Re: PThreads and Sockets Message-ID: <19991127214308.A27972@november.jaded.net> References: <19991126173228.A2608@spirit.jaded.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 0.95.4i In-Reply-To: ; from FengYue on Sat, Nov 27, 1999 at 03:11:36PM -0800 Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG | > Try this. | > | > void *serverstart(void *ptr) | > { | > int sd2; | > | > sd2 = *((int *) ptr); | > ... | > } | | There is a race condition. You're passing sd2's address to serverstart() | and inside serverstart() you def' the pointer. What if | "sd2=accept(sd, (struct sockaddr*)&cad, &alen)" gets | executed before your previous serverstart() finishs "sd2 = *((int*)ptr)"? Since accept isn't atomic, it would be best to enclose the whole sha-bang in a mutex up until the sd2 = *((int *) ptr) call finishes. -- Dan Moschuk (TFreak!dan@freebsd.org) "Try not. Do, or do not. There is no try." -- Yoda To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message