📄 alloc.c
字号:
/* alloc.c Memory allocation... *//* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1996-2003 by 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. * * Internet Systems Consortium, Inc. * 950 Charter Street * Redwood City, CA 94063 * <info@isc.org> * http://www.isc.org/ * * This software has been written for Internet Systems Consortium * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc. * To learn more about Internet Systems Consortium, see * ``http://www.isc.org/''. To learn more about Vixie Enterprises, * see ``http://www.vix.com''. To learn more about Nominum, Inc., see * ``http://www.nominum.com''. */#ifndef lintstatic char copyright[] ="$Id: alloc.c,v 1.53.2.10 2004/06/10 17:59:14 dhankins Exp $ Copyright (c) 2004 Internet Systems Consortium. All rights reserved.\n";#endif /* not lint */#include "dhcpd.h"#include <omapip/omapip_p.h>struct dhcp_packet *dhcp_free_list;struct packet *packet_free_list;int option_chain_head_allocate (ptr, file, line) struct option_chain_head **ptr; const char *file; int line;{ int size; struct option_chain_head *h; if (!ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (*ptr) { log_error ("%s(%d): non-null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else *ptr = (struct option_chain_head *)0;#endif } h = dmalloc (sizeof *h, file, line); if (h) { memset (h, 0, sizeof *h); return option_chain_head_reference (ptr, h, file, line); } return 0;}int option_chain_head_reference (ptr, bp, file, line) struct option_chain_head **ptr; struct option_chain_head *bp; const char *file; int line;{ if (!ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (*ptr) { log_error ("%s(%d): non-null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else *ptr = (struct option_chain_head *)0;#endif } *ptr = bp; bp -> refcnt++; rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); return 1;}int option_chain_head_dereference (ptr, file, line) struct option_chain_head **ptr; const char *file; int line;{ int i; struct option_chain_head *option_chain_head; pair car, cdr; if (!ptr || !*ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } option_chain_head = *ptr; *ptr = (struct option_chain_head *)0; --option_chain_head -> refcnt; rc_register (file, line, ptr, option_chain_head, option_chain_head -> refcnt, 1, RC_MISC); if (option_chain_head -> refcnt > 0) return 1; if (option_chain_head -> refcnt < 0) { log_error ("%s(%d): negative refcnt!", file, line);#if defined (DEBUG_RC_HISTORY) dump_rc_history (option_chain_head);#endif#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } /* If there are any options on this head, free them. */ for (car = option_chain_head -> first; car; car = cdr) { cdr = car -> cdr; if (car -> car) option_cache_dereference ((struct option_cache **) (&car -> car), MDL); dfree (car, MDL); car = cdr; } dfree (option_chain_head, file, line); return 1;}int group_allocate (ptr, file, line) struct group **ptr; const char *file; int line;{ int size; struct group *g; if (!ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (*ptr) { log_error ("%s(%d): non-null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else *ptr = (struct group *)0;#endif } g = dmalloc (sizeof *g, file, line); if (g) { memset (g, 0, sizeof *g); return group_reference (ptr, g, file, line); } return 0;}int group_reference (ptr, bp, file, line) struct group **ptr; struct group *bp; const char *file; int line;{ if (!ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (*ptr) { log_error ("%s(%d): non-null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else *ptr = (struct group *)0;#endif } *ptr = bp; bp -> refcnt++; rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); return 1;}int group_dereference (ptr, file, line) struct group **ptr; const char *file; int line;{ int i; struct group *group; if (!ptr || !*ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } group = *ptr; *ptr = (struct group *)0; --group -> refcnt; rc_register (file, line, ptr, group, group -> refcnt, 1, RC_MISC); if (group -> refcnt > 0) return 1; if (group -> refcnt < 0) { log_error ("%s(%d): negative refcnt!", file, line);#if defined (DEBUG_RC_HISTORY) dump_rc_history (group);#endif#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (group -> object) group_object_dereference (&group -> object, file, line); if (group -> subnet) subnet_dereference (&group -> subnet, file, line); if (group -> shared_network) shared_network_dereference (&group -> shared_network, file, line); if (group -> statements) executable_statement_dereference (&group -> statements, file, line); if (group -> next) group_dereference (&group -> next, file, line); dfree (group, file, line); return 1;}struct dhcp_packet *new_dhcp_packet (file, line) const char *file; int line;{ struct dhcp_packet *rval; rval = (struct dhcp_packet *)dmalloc (sizeof (struct dhcp_packet), file, line); return rval;}struct protocol *new_protocol (file, line) const char *file; int line;{ struct protocol *rval = dmalloc (sizeof (struct protocol), file, line); return rval;}struct domain_search_list *new_domain_search_list (file, line) const char *file; int line;{ struct domain_search_list *rval = dmalloc (sizeof (struct domain_search_list), file, line); return rval;}struct name_server *new_name_server (file, line) const char *file; int line;{ struct name_server *rval = dmalloc (sizeof (struct name_server), file, line); return rval;}void free_name_server (ptr, file, line) struct name_server *ptr; const char *file; int line;{ dfree ((VOIDPTR)ptr, file, line);}struct option *new_option (file, line) const char *file; int line;{ struct option *rval = dmalloc (sizeof (struct option), file, line); if (rval) memset (rval, 0, sizeof *rval); return rval;}void free_option (ptr, file, line) struct option *ptr; const char *file; int line;{/* XXX have to put all options on heap before this is possible. */#if 0 if (ptr -> name) dfree ((VOIDPTR)option -> name, file, line); dfree ((VOIDPTR)ptr, file, line);#endif}struct universe *new_universe (file, line) const char *file; int line;{ struct universe *rval = dmalloc (sizeof (struct universe), file, line); return rval;}void free_universe (ptr, file, line) struct universe *ptr; const char *file; int line;{ dfree ((VOIDPTR)ptr, file, line);}void free_domain_search_list (ptr, file, line) struct domain_search_list *ptr; const char *file; int line;{ dfree ((VOIDPTR)ptr, file, line);}void free_protocol (ptr, file, line) struct protocol *ptr; const char *file; int line;{ dfree ((VOIDPTR)ptr, file, line);}void free_dhcp_packet (ptr, file, line) struct dhcp_packet *ptr; const char *file; int line;{ dfree ((VOIDPTR)ptr, file, line);}struct client_lease *new_client_lease (file, line) const char *file; int line;{ return (struct client_lease *)dmalloc (sizeof (struct client_lease), file, line);}void free_client_lease (lease, file, line) struct client_lease *lease; const char *file; int line;{ dfree (lease, file, line);}pair free_pairs;pair new_pair (file, line) const char *file; int line;{ pair foo; if (free_pairs) { foo = free_pairs; free_pairs = foo -> cdr; memset (foo, 0, sizeof *foo); dmalloc_reuse (foo, file, line, 0); return foo; } foo = dmalloc (sizeof *foo, file, line); if (!foo) return foo; memset (foo, 0, sizeof *foo); return foo;}void free_pair (foo, file, line) pair foo; const char *file; int line;{ foo -> cdr = free_pairs; free_pairs = foo; dmalloc_reuse (free_pairs, (char *)0, 0, 0);}#if defined (DEBUG_MEMORY_LEAKAGE) || \ defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)void relinquish_free_pairs (){ pair pf, pc; for (pf = free_pairs; pf; pf = pc) { pc = pf -> cdr; dfree (pf, MDL); } free_pairs = (pair)0;}#endifstruct expression *free_expressions;int expression_allocate (cptr, file, line) struct expression **cptr; const char *file; int line;{ struct expression *rval; if (free_expressions) { rval = free_expressions; free_expressions = rval -> data.not; dmalloc_reuse (rval, file, line, 1); } else { rval = dmalloc (sizeof (struct expression), file, line); if (!rval) return 0; } memset (rval, 0, sizeof *rval); return expression_reference (cptr, rval, file, line);}int expression_reference (ptr, src, file, line) struct expression **ptr; struct expression *src; const char *file; int line;{ if (!ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (*ptr) { log_error ("%s(%d): non-null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else *ptr = (struct expression *)0;#endif } *ptr = src; src -> refcnt++; rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC); return 1;}void free_expression (expr, file, line) struct expression *expr; const char *file; int line;{ expr -> data.not = free_expressions; free_expressions = expr; dmalloc_reuse (free_expressions, (char *)0, 0, 0);}#if defined (DEBUG_MEMORY_LEAKAGE) || \ defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)void relinquish_free_expressions (){ struct expression *e, *n; for (e = free_expressions; e; e = n) { n = e -> data.not; dfree (e, MDL); } free_expressions = (struct expression *)0;}#endifstruct binding_value *free_binding_values; int binding_value_allocate (cptr, file, line) struct binding_value **cptr; const char *file; int line;{ struct binding_value *rval; if (free_binding_values) { rval = free_binding_values; free_binding_values = rval -> value.bv; dmalloc_reuse (rval, file, line, 1); } else { rval = dmalloc (sizeof (struct binding_value), file, line); if (!rval) return 0; } memset (rval, 0, sizeof *rval); return binding_value_reference (cptr, rval, file, line);}int binding_value_reference (ptr, src, file, line) struct binding_value **ptr; struct binding_value *src; const char *file; int line;{ if (!ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (*ptr) { log_error ("%s(%d): non-null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else *ptr = (struct binding_value *)0;#endif } *ptr = src; src -> refcnt++; rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC); return 1;}void free_binding_value (bv, file, line) struct binding_value *bv; const char *file; int line;{ bv -> value.bv = free_binding_values; free_binding_values = bv; dmalloc_reuse (free_binding_values, (char *)0, 0, 0);}#if defined (DEBUG_MEMORY_LEAKAGE) || \ defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)void relinquish_free_binding_values (){ struct binding_value *b, *n; for (b = free_binding_values; b; b = n) { n = b -> value.bv; dfree (b, MDL); } free_binding_values = (struct binding_value *)0;}#endifint fundef_allocate (cptr, file, line) struct fundef **cptr; const char *file; int line;{ struct fundef *rval; rval = dmalloc (sizeof (struct fundef), file, line); if (!rval) return 0; memset (rval, 0, sizeof *rval); return fundef_reference (cptr, rval, file, line);}int fundef_reference (ptr, src, file, line) struct fundef **ptr; struct fundef *src; const char *file; int line;{ if (!ptr) { log_error ("%s(%d): null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else return 0;#endif } if (*ptr) { log_error ("%s(%d): non-null pointer", file, line);#if defined (POINTER_DEBUG) abort ();#else *ptr = (struct fundef *)0;#endif } *ptr = src; src -> refcnt++; rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC); return 1;}struct option_cache *free_option_caches;#if defined (DEBUG_MEMORY_LEAKAGE) || \ defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)void relinquish_free_option_caches (){ struct option_cache *o, *n; for (o = free_option_caches; o; o = n) { n = (struct option_cache *)(o -> expression); dfree (o, MDL); } free_option_caches = (struct option_cache *)0;}#endifint option_cache_allocate (cptr, file, line) struct option_cache **cptr; const char *file; int line;{ struct option_cache *rval; if (free_option_caches) { rval = free_option_caches; free_option_caches =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -