1/* 2 * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 2000, 2001 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* $Id: quota.c,v 1.18 2007/06/19 23:47:17 tbox Exp $ */ 19 20/*! \file */ 21 22#include <config.h> 23 24#include <stddef.h> 25 26#include <isc/quota.h> 27#include <isc/util.h> 28 29isc_result_t 30isc_quota_init(isc_quota_t *quota, int max) { 31 quota->max = max; 32 quota->used = 0; 33 quota->soft = 0; 34 return (isc_mutex_init("a->lock)); 35} 36 37void 38isc_quota_destroy(isc_quota_t *quota) { 39 INSIST(quota->used == 0); 40 quota->max = 0; 41 quota->used = 0; 42 quota->soft = 0; 43 DESTROYLOCK("a->lock); 44} 45 46void 47isc_quota_soft(isc_quota_t *quota, int soft) { 48 LOCK("a->lock); 49 quota->soft = soft; 50 UNLOCK("a->lock); 51} 52 53void 54isc_quota_max(isc_quota_t *quota, int max) { 55 LOCK("a->lock); 56 quota->max = max; 57 UNLOCK("a->lock); 58} 59 60isc_result_t 61isc_quota_reserve(isc_quota_t *quota) { 62 isc_result_t result; 63 LOCK("a->lock); 64 if (quota->max == 0 || quota->used < quota->max) { 65 if (quota->soft == 0 || quota->used < quota->soft) 66 result = ISC_R_SUCCESS; 67 else 68 result = ISC_R_SOFTQUOTA; 69 quota->used++; 70 } else 71 result = ISC_R_QUOTA; 72 UNLOCK("a->lock); 73 return (result); 74} 75 76void 77isc_quota_release(isc_quota_t *quota) { 78 LOCK("a->lock); 79 INSIST(quota->used > 0); 80 quota->used--; 81 UNLOCK("a->lock); 82} 83 84isc_result_t 85isc_quota_attach(isc_quota_t *quota, isc_quota_t **p) 86{ 87 isc_result_t result; 88 INSIST(p != NULL && *p == NULL); 89 result = isc_quota_reserve(quota); 90 if (result == ISC_R_SUCCESS || result == ISC_R_SOFTQUOTA) 91 *p = quota; 92 return (result); 93} 94 95void 96isc_quota_detach(isc_quota_t **p) 97{ 98 INSIST(p != NULL && *p != NULL); 99 isc_quota_release(*p); 100 *p = NULL; 101} 102