http://code.google.com/p/canopy-httpd/source/detail?r=1123
Modified:
/trunk/src/lib/canopy/conf.y
/trunk/src/lib/canopy/htab.c
/trunk/src/lib/canopy/htab.h
/trunk/src/lib/http/media.c
/trunk/src/lib/http/session.c
/trunk/src/sbin/httpd/host.c
=======================================
--- /trunk/src/lib/canopy/conf.y Sun Dec 12 13:05:32 2010
+++ /trunk/src/lib/canopy/conf.y Wed Dec 15 20:03:27 2010
@@ -278,8 +278,8 @@
TAILQ_INIT(&(conf->cf_dirs));
- conf->cf_vars = cnp_htab_alloc(8, CNP_HTAB_COPYKEY, NULL, NULL);
- if (conf->cf_vars == NULL) {
+ if ((conf->cf_vars = cnp_htab_alloc(8, CNP_HTAB_COPYKEY, NULL,
+ NULL, cnp_free)) == NULL) {
cnp_conf_free(conf);
return (NULL);
}
=======================================
--- /trunk/src/lib/canopy/htab.c Tue Dec 14 20:34:09 2010
+++ /trunk/src/lib/canopy/htab.c Wed Dec 15 20:03:27 2010
@@ -65,6 +65,7 @@
int (*ht_keycmp)(const void *, size_t, const void *, size_t);
unsigned int (*ht_keyhash)(const void *, size_t);
+ void (*ht_datafree)(void *);
struct cnp_hash_bucket *ht_buckets;
cnp_rwlock_t ht_rwlock;
@@ -87,7 +88,7 @@
cnp_htab_t*
cnp_htab_alloc(int size, int flags,
int (*keycmp)(const void *, size_t, const void *, size_t),
- unsigned int (*keyhash)(const void *, size_t))
+ unsigned int (*keyhash)(const void *, size_t), void (*datafree)(void
*))
{
unsigned int i;
cnp_htab_t *htab;
@@ -102,6 +103,7 @@
htab->ht_flags = flags;
htab->ht_size = size;
htab->ht_bktcnt = 1 << size;
+ htab->ht_datafree = datafree;
if (keycmp != NULL)
htab->ht_keycmp = keycmp;
@@ -229,7 +231,11 @@
return (-1);
}
- if ((ent = cnp_htab_getent(htab, key, klen)) == NULL) {
+ if ((ent = cnp_htab_getent(htab, key, klen)) != NULL) {
+ if ((htab->ht_datafree != NULL) && (ent->he_data != NULL))
+ (*htab->ht_datafree)(ent->he_data);
+ }
+ else {
/* no previous entry with the same key, allocate a new entry */
if ((ent = cnp_malloc(sizeof(*ent))) == NULL) {
=======================================
--- /trunk/src/lib/canopy/htab.h Mon Aug 31 19:45:42 2009
+++ /trunk/src/lib/canopy/htab.h Wed Dec 15 20:03:27 2010
@@ -51,7 +51,8 @@
/* logging facility */
cnp_htab_t* cnp_htab_alloc (int, int, int (*)(const void *, size_t,
const void *, size_t),
- unsigned int (*)(const void *, size_t));
+ unsigned int (*)(const void *, size_t),
+ void (*)(void *));
cnp_htab_t* cnp_htab_ref (cnp_htab_t *);
void cnp_htab_free (cnp_htab_t *);
int cnp_htab_insert (cnp_htab_t *, const void *, size_t, void *);
=======================================
--- /trunk/src/lib/http/media.c Tue Apr 20 20:51:21 2010
+++ /trunk/src/lib/http/media.c Wed Dec 15 20:03:27 2010
@@ -93,14 +93,14 @@
int
http_media_init(void)
{
- http_media_htab = cnp_htab_alloc(8, 0, NULL, NULL);
+ http_media_htab = cnp_htab_alloc(8, 0, NULL, NULL, NULL);
if (http_media_htab == NULL) {
http_log_err("failed to allocate media type "
"hash table");
return (-1);
}
- http_media_exthtab = cnp_htab_alloc(8, 0, NULL, NULL);
+ http_media_exthtab = cnp_htab_alloc(8, 0, NULL, NULL, NULL);
if (http_media_exthtab == NULL) {
http_log_err("failed to allocate media type "
"hash table");
=======================================
--- /trunk/src/lib/http/session.c Thu Apr 22 22:58:05 2010
+++ /trunk/src/lib/http/session.c Wed Dec 15 20:03:27 2010
@@ -70,7 +70,7 @@
return (NULL);
}
- sess->hs_attr = cnp_htab_alloc(8, CNP_HTAB_COPYKEY, NULL, NULL);
+ sess->hs_attr = cnp_htab_alloc(8, CNP_HTAB_COPYKEY, NULL, NULL, NULL);
if (sess->hs_attr == NULL) {
http_session_free(sess);
return (NULL);
=======================================
--- /trunk/src/sbin/httpd/host.c Fri Apr 23 14:05:38 2010
+++ /trunk/src/sbin/httpd/host.c Wed Dec 15 20:03:27 2010
@@ -97,7 +97,7 @@
return (-1);
}
- httpd_host_addrtab = cnp_htab_alloc(8, 0, NULL, NULL);
+ httpd_host_addrtab = cnp_htab_alloc(8, 0, NULL, NULL, NULL);
if (httpd_host_addrtab == NULL) {
httpd_log_err("failed to allocate host hash table");
return (-1);