00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00030 #include <stdlib.h>
00031 #include <string.h>
00032
00033 #include "dbprim.h"
00034 #include "dbprim_int.h"
00035
00036 RCSTAG("@(#)$Id: smat_freelist.c,v 1.5 2006/07/13 20:27:36 klmitch Exp $");
00037
00045 static link_head_t _smat_freelist = LINK_HEAD_INIT(0);
00046
00047 smat_entry_t *
00048 _smat_alloc(void)
00049 {
00050 link_elem_t *le;
00051 smat_entry_t *se;
00052
00053 if (!ll_count(&_smat_freelist) || !(le = ll_first(&_smat_freelist)) ||
00054 ll_remove(&_smat_freelist, le)) {
00055
00056 if (!(se = (smat_entry_t *)malloc(sizeof(smat_entry_t))))
00057 return 0;
00058 } else
00059 se = le_object(le);
00060
00061
00062 if (he_init(&se->se_hash, se) || le_init(&se->se_link[SMAT_LOC_FIRST], se) ||
00063 le_init(&se->se_link[SMAT_LOC_SECOND], se)) {
00064 free(se);
00065 return 0;
00066 }
00067
00068 se->se_table = 0;
00069 memset(se->se_object, 0, sizeof(se->se_object));
00070
00071 se->se_magic = SMAT_ENTRY_MAGIC;
00072
00073 return se;
00074 }
00075
00076 void
00077 _smat_free(smat_entry_t *entry)
00078 {
00079 entry->se_magic = 0;
00080
00081
00082 le_object(_se_link(entry)) = entry;
00083
00084
00085 if (ll_add(&_smat_freelist, _se_link(entry), LINK_LOC_HEAD, 0))
00086 free(entry);
00087 }
00088
00089 unsigned long
00090 smat_cleanup(void)
00091 {
00092 link_elem_t *entry;
00093
00094 initialize_dbpr_error_table();
00095
00096
00097 while ((entry = ll_first(&_smat_freelist))) {
00098 ll_remove(&_smat_freelist, entry);
00099 free(le_object(entry));
00100 }
00101
00102 return 0;
00103 }
00104
00105 unsigned long
00106 smat_freemem(void)
00107 {
00108 initialize_dbpr_error_table();
00109
00110
00111 return ll_count(&_smat_freelist) * sizeof(smat_entry_t);
00112 }