From owner-freebsd-threads@FreeBSD.ORG Wed May 24 22:14:27 2006 Return-Path: X-Original-To: freebsd-threads@freebsd.org Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 03C1216A581 for ; Wed, 24 May 2006 22:14:27 +0000 (UTC) (envelope-from lists@intricatesoftware.com) Received: from mta1.srv.hcvlny.cv.net (mta1.srv.hcvlny.cv.net [167.206.4.196]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5ECF543D46 for ; Wed, 24 May 2006 22:14:25 +0000 (GMT) (envelope-from lists@intricatesoftware.com) Received: from [172.16.1.72] (ool-457a77e8.dyn.optonline.net [69.122.119.232]) by mta1.srv.hcvlny.cv.net (Sun Java System Messaging Server 6.2-6.01 (built Apr 3 2006)) with ESMTP id <0IZS00JNTJ3OZRO0@mta1.srv.hcvlny.cv.net> for freebsd-threads@freebsd.org; Wed, 24 May 2006 18:14:12 -0400 (EDT) Date: Wed, 24 May 2006 18:14:11 -0400 From: Kurt Miller To: freebsd-threads@freebsd.org Message-id: <200605241814.11452.lists@intricatesoftware.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: inline User-Agent: KMail/1.9.1 Subject: pthread_cond_signal w/suspended threads X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: kurt@intricatesoftware.com List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 May 2006 22:14:31 -0000 I've been working on an intermittent deadlock in the jvm and have isolated it to the following issue. When multiple threads are waiting on a condition variable and some of those threads have been suspended with pthread_suspend_np(), there is an expectation that pthread_cond_signal() will signal an unsuspended thread first. However, the following program shows this is not the case on 6.1-release/kse (thr works as expected). Can kse behavior be changed to signal unsuspended threads first? #include #include #include #include pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static void * start_routine(void *arg) { pthread_mutex_lock(&mutex); pthread_cond_wait(&cond, &mutex); printf("unblocked %d\n", (int)arg); pthread_mutex_unlock(&mutex); return (0); } int main(int argc, char *argv[]) { pthread_t thread1; pthread_t thread2; pthread_create(&thread1, NULL, start_routine, (void *)1); sleep(1); pthread_create(&thread2, NULL, start_routine, (void *)2); sleep(1); pthread_suspend_np(thread1); pthread_cond_signal(&cond); sleep(1); pthread_resume_np(thread1); sleep(1); return (0); }