diff options
author | trhodes <trhodes@FreeBSD.org> | 2004-09-19 01:30:24 +0000 |
---|---|---|
committer | trhodes <trhodes@FreeBSD.org> | 2004-09-19 01:30:24 +0000 |
commit | 06246360f70ba2ce65a63d5c52289cd33256bc99 (patch) | |
tree | 97706b7f62557da0a2539b026e5cf66008ddf8c6 /contrib/bind9/lib/isc/taskpool.c | |
download | FreeBSD-src-06246360f70ba2ce65a63d5c52289cd33256bc99.zip FreeBSD-src-06246360f70ba2ce65a63d5c52289cd33256bc99.tar.gz |
Vender import of BIND 9.3.0rc4.
Diffstat (limited to 'contrib/bind9/lib/isc/taskpool.c')
-rw-r--r-- | contrib/bind9/lib/isc/taskpool.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/contrib/bind9/lib/isc/taskpool.c b/contrib/bind9/lib/isc/taskpool.c new file mode 100644 index 0000000..0b400bf --- /dev/null +++ b/contrib/bind9/lib/isc/taskpool.c @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 1999-2001 Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: taskpool.c,v 1.10.12.3 2004/03/08 09:04:50 marka Exp $ */ + +#include <config.h> + +#include <isc/mem.h> +#include <isc/taskpool.h> +#include <isc/util.h> + +/*** + *** Types. + ***/ + +struct isc_taskpool { + isc_mem_t * mctx; + unsigned int ntasks; + isc_task_t ** tasks; +}; +/*** + *** Functions. + ***/ + +isc_result_t +isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, + unsigned int ntasks, unsigned int quantum, + isc_taskpool_t **poolp) +{ + unsigned int i; + isc_taskpool_t *pool; + isc_result_t result; + + INSIST(ntasks > 0); + pool = isc_mem_get(mctx, sizeof(*pool)); + if (pool == NULL) + return (ISC_R_NOMEMORY); + pool->mctx = mctx; + pool->ntasks = ntasks; + pool->tasks = isc_mem_get(mctx, ntasks * sizeof(isc_task_t *)); + for (i = 0; i < ntasks; i++) + pool->tasks[i] = NULL; + for (i = 0; i < ntasks; i++) { + result = isc_task_create(tmgr, quantum, &pool->tasks[i]); + if (result != ISC_R_SUCCESS) { + isc_taskpool_destroy(&pool); + return (result); + } + } + *poolp = pool; + return (ISC_R_SUCCESS); +} + +void isc_taskpool_gettask(isc_taskpool_t *pool, unsigned int hash, + isc_task_t **targetp) +{ + isc_task_attach(pool->tasks[hash % pool->ntasks], targetp); +} + +void +isc_taskpool_destroy(isc_taskpool_t **poolp) { + unsigned int i; + isc_taskpool_t *pool = *poolp; + for (i = 0; i < pool->ntasks; i++) { + if (pool->tasks[i] != NULL) { + isc_task_detach(&pool->tasks[i]); + } + } + isc_mem_put(pool->mctx, pool->tasks, + pool->ntasks * sizeof(isc_task_t *)); + isc_mem_put(pool->mctx, pool, sizeof(*pool)); + *poolp = NULL; +} + + |