From owner-svn-src-user@FreeBSD.ORG Sun Jan 10 23:37:04 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B76B21065670; Sun, 10 Jan 2010 23:37:04 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8DCDA8FC14; Sun, 10 Jan 2010 23:37:04 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o0ANb4qW075906; Sun, 10 Jan 2010 23:37:04 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o0ANb493075904; Sun, 10 Jan 2010 23:37:04 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <201001102337.o0ANb493075904@svn.freebsd.org> From: Kip Macy Date: Sun, 10 Jan 2010 23:37:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r202051 - user/kmacy/releng_8_rump/lib/libunet X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 10 Jan 2010 23:37:04 -0000 Author: kmacy Date: Sun Jan 10 23:37:04 2010 New Revision: 202051 URL: http://svn.freebsd.org/changeset/base/202051 Log: implement hash table for wakeup channel lookups Modified: user/kmacy/releng_8_rump/lib/libunet/unet_kern_synch.c Modified: user/kmacy/releng_8_rump/lib/libunet/unet_kern_synch.c ============================================================================== --- user/kmacy/releng_8_rump/lib/libunet/unet_kern_synch.c Sun Jan 10 22:34:18 2010 (r202050) +++ user/kmacy/releng_8_rump/lib/libunet/unet_kern_synch.c Sun Jan 10 23:37:04 2010 (r202051) @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); int hogticks; typedef struct sleep_entry { + LIST_ENTRY(sleep_entry) list_entry; void *chan; const char *wmesg; pthread_cond_t cond; @@ -45,6 +46,8 @@ SYSINIT(synch_setup, SI_SUB_KICK_SCHEDUL static struct se_head *se_active; static u_long se_hashmask; static pthread_mutex_t synch_lock; +#define SE_HASH(chan) (((uintptr_t)chan) & se_hashmask) +LIST_HEAD(se_head, sleep_entry); static void synch_setup(void *arg) @@ -61,21 +64,33 @@ se_alloc(void *chan, const char *wmesg) { sleep_entry_t se; pthread_condattr_t attr; + struct se_head *hash_list; se = malloc(sizeof(*se), M_DEVBUF, 0); se->chan = chan; se->wmesg = wmesg; + se->waiters = 1; pthread_condattr_init(&attr); pthread_cond_init(&se->cond, &attr); /* insert in hash table */ + hash_list = &se_active[SE_HASH(chan)]; + LIST_INSERT_HEAD(hash_list, se, list_entry); + return (se); } sleep_entry_t se_lookup(void *chan) { - /* lookup in hashtable */ + struct se_head *hash_list; + sleep_entry_t se; + + hash_list = &se_active[SE_HASH(chan)]; + LIST_FOREACH(se, hash_list, list_entry) + if (se->chan == chan) + return (se); + return (NULL); } @@ -84,7 +99,7 @@ se_free(sleep_entry_t se) { if (--se->waiters == 0) { - /* unlink se */ + LIST_REMOVE(se, list_entry); pthread_cond_destroy(&se->cond); free(se, M_DEVBUF); } @@ -120,7 +135,7 @@ _sleep(void *ident, struct lock_object * else se = se_alloc(ident, wmesg); pthread_mutex_unlock(&synch_lock); - + if (timo) rv = pthread_cond_timedwait(&se->cond, &lock->lo_mutex, &ts); else