Return to quota.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / lib / isc |
1.1 ! misho 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: ! 29: isc_result_t ! 30: isc_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: ! 37: void ! 38: isc_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: ! 46: void ! 47: isc_quota_soft(isc_quota_t *quota, int soft) { ! 48: LOCK("a->lock); ! 49: quota->soft = soft; ! 50: UNLOCK("a->lock); ! 51: } ! 52: ! 53: void ! 54: isc_quota_max(isc_quota_t *quota, int max) { ! 55: LOCK("a->lock); ! 56: quota->max = max; ! 57: UNLOCK("a->lock); ! 58: } ! 59: ! 60: isc_result_t ! 61: isc_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: ! 76: void ! 77: isc_quota_release(isc_quota_t *quota) { ! 78: LOCK("a->lock); ! 79: INSIST(quota->used > 0); ! 80: quota->used--; ! 81: UNLOCK("a->lock); ! 82: } ! 83: ! 84: isc_result_t ! 85: isc_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: ! 95: void ! 96: isc_quota_detach(isc_quota_t **p) ! 97: { ! 98: INSIST(p != NULL && *p != NULL); ! 99: isc_quota_release(*p); ! 100: *p = NULL; ! 101: }