struct memcache_talloc_value {
void *ptr;
+ size_t len;
};
struct memcache_element {
memcache_element_parse(e, &cache_key, &cache_value);
SMB_ASSERT(cache_value.length == sizeof(mtv));
memcpy(&mtv, cache_value.data, sizeof(mtv));
+ cache->size -= mtv.len;
TALLOC_FREE(mtv.ptr);
}
SMB_ASSERT(cache_value.length == sizeof(mtv));
memcpy(&mtv, cache_value.data, sizeof(mtv));
+ cache->size -= mtv.len;
TALLOC_FREE(mtv.ptr);
}
/*
*/
memcpy(cache_value.data, value.data, value.length);
e->valuelength = value.length;
+
+ if (memcache_is_talloc(e->n)) {
+ struct memcache_talloc_value mtv;
+
+ SMB_ASSERT(cache_value.length == sizeof(mtv));
+ memcpy(&mtv, cache_value.data, sizeof(mtv));
+ cache->size += mtv.len;
+ }
return;
}
DLIST_ADD(cache->mru, e);
cache->size += element_size;
+ if (memcache_is_talloc(e->n)) {
+ struct memcache_talloc_value mtv;
+
+ SMB_ASSERT(cache_value.length == sizeof(mtv));
+ memcpy(&mtv, cache_value.data, sizeof(mtv));
+ cache->size += mtv.len;
+ }
memcache_trim(cache);
}
return;
}
+ mtv.len = talloc_total_size(*ptr);
mtv.ptr = talloc_move(cache, ptr);
memcache_add(cache, n, key, data_blob_const(&mtv, sizeof(mtv)));
}