netcdf-c/include/ncxcache.h
Dennis Heimbigner eb3d9eb0c9 Provide a Number of fixes/improvements to NCZarr
Primary changes:
* Add an improved cache system to speed up performance.
* Fix NCZarr to properly handle scalar variables.

Misc. Related Changes:
* Added unit tests for extendible hash and for the generic cache.
* Add config parameter to set size of the NCZarr cache.
* Add initial performance tests but leave them unused.
* Add CRC64 support.
* Move location of ncdumpchunks utility from /ncgen to /ncdump.
* Refactor auth support.

Misc. Unrelated Changes:
* More cleanup of the S3 support
* Add support for S3 authentication in .rc files: HTTP.S3.ACCESSID and HTTP.S3.SECRETKEY.
* Remove the hashkey from the struct OBJHDR since it is never used.
2020-11-19 17:01:04 -07:00

69 lines
1.9 KiB
C

/*
Copyright (c) 1998-2018 University Corporation for Atmospheric Research/Unidata
See COPYRIGHT for license information.
*/
#ifndef NCXCACHE_H
#define NCXCACHE_H
#include "nclist.h"
#include "ncexhash.h" /* Also includes name map and id map */
/* Define the implementation.
if defined, then the user's object
is assumed to hold the double linked list node,
otherwise, it is created here.
*/
#define NCXUSER
/*
This cache data structure is an ordered list of objects. It is
used to create an LRU cache of arbitrary objects.
*/
/* Doubly linked list element */
typedef struct NCxnode {
struct NCxnode* next;
struct NCxnode* prev;
void* content; /* associated data of some kind may be unused*/
} NCxnode;
typedef struct NCxcache {
NCxnode lru;
NCexhashmap* map;
} NCxcache;
/* Locate object by hashkey */
EXTERNL int ncxcachelookup(NCxcache* cache, ncexhashkey_t hkey, void** objp);
/* Insert object into the cache >*/
EXTERNL int ncxcacheinsert(NCxcache* cache, ncexhashkey_t hkey, void* obj);
/* Bring to front of the LRU queue */
EXTERNL int ncxcachetouch(NCxcache* cache, ncexhashkey_t hkey);
/* "Remove" object from the cache; return object */
EXTERNL int ncxcacheremove(NCxcache* cache, ncexhashkey_t hkey, void** obj);
/* Free cache. */
EXTERNL void ncxcachefree(NCxcache* cache);
/* Create a cache: size == 0 => use defaults */
EXTERNL int ncxcachenew(size_t initsize, NCxcache**) ;
/* Macro function */
/* Get the number of entries in an NCxcache */
#define ncxcachecount(cache) (cache == NULL ? 0 : ncexhashcount((cache)->map))
EXTERNL void* ncxcachefirst(NCxcache* cache);
EXTERNL void* ncxcachelast(NCxcache* cache);
/* Return the hash key for specified key; takes key+size; an alias for the one in ncexhash */
EXTERNL ncexhashkey_t ncxcachekey(const void* key, size_t size);
/* Debugging */
EXTERNL void ncxcacheprint(NCxcache* cache);
#endif /*NCXCACHE_H*/