From owner-freebsd-threads@FreeBSD.ORG Wed May 15 09:06:15 2013 Return-Path: Delivered-To: threads@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 0EF87470; Wed, 15 May 2013 09:06:15 +0000 (UTC) (envelope-from davidxu@freebsd.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 01579A33; Wed, 15 May 2013 09:06:15 +0000 (UTC) Received: from xyf.my.dom (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id r4F96DYK084352; Wed, 15 May 2013 09:06:14 GMT (envelope-from davidxu@freebsd.org) Message-ID: <51935024.3080107@freebsd.org> Date: Wed, 15 May 2013 17:06:44 +0800 From: David Xu User-Agent: Mozilla/5.0 (X11; FreeBSD i386; rv:17.0) Gecko/20130416 Thunderbird/17.0.5 MIME-Version: 1.0 To: Poul-Henning Kamp Subject: Re: pthread_key_create() should avoid key#0 References: <79159.1368525129@critter.freebsd.dk> In-Reply-To: <79159.1368525129@critter.freebsd.dk> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: threads@freebsd.org X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 May 2013 09:06:15 -0000 On 2013/05/14 17:52, Poul-Henning Kamp wrote: > > I think this patch would be a good idea, it avoids allocing > a thread specific key with numeric value zero, which helps > expose cases where a key hasn't been allocated in the first > place. > > > Index: libkse/thread/thr_spec.c > =================================================================== > --- libkse/thread/thr_spec.c (revision 248293) > +++ libkse/thread/thr_spec.c (working copy) > @@ -59,7 +59,7 @@ > > /* Lock the key table: */ > THR_LOCK_ACQUIRE(curthread, &_keytable_lock); > - for (i = 0; i < PTHREAD_KEYS_MAX; i++) { > + for (i = 1; i < PTHREAD_KEYS_MAX; i++) { > > if (_thread_keytable[i].allocated == 0) { > _thread_keytable[i].allocated = 1; > @@ -84,7 +84,7 @@ > struct pthread *curthread = _get_curthread(); > int ret = 0; > > - if ((unsigned int)key < PTHREAD_KEYS_MAX) { > + if (key > 0 && (unsigned int)key < PTHREAD_KEYS_MAX) { > /* Lock the key table: */ > THR_LOCK_ACQUIRE(curthread, &_keytable_lock); > > Index: libthr/thread/thr_spec.c > =================================================================== > --- libthr/thread/thr_spec.c (revision 248293) > +++ libthr/thread/thr_spec.c (working copy) > @@ -61,7 +61,7 @@ > > /* Lock the key table: */ > THR_LOCK_ACQUIRE(curthread, &_keytable_lock); > - for (i = 0; i < PTHREAD_KEYS_MAX; i++) { > + for (i = 1; i < PTHREAD_KEYS_MAX; i++) { > > if (_thread_keytable[i].allocated == 0) { > _thread_keytable[i].allocated = 1; > @@ -86,7 +86,7 @@ > struct pthread *curthread = _get_curthread(); > int ret = 0; > > - if ((unsigned int)key < PTHREAD_KEYS_MAX) { > + if (key > 0 && (unsigned int)key < PTHREAD_KEYS_MAX) { > /* Lock the key table: */ > THR_LOCK_ACQUIRE(curthread, &_keytable_lock); > > while key#0 is avoided, I would like to see we still support PTHREAD_KEYS_MAX keys. I am working on it.