mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-12-27 08:49:16 +08:00
114 lines
3.0 KiB
C
114 lines
3.0 KiB
C
/* Copyright 2018, University Corporation for Atmospheric
|
|
* Research. See COPYRIGHT file for copying and redistribution
|
|
* conditions. */
|
|
/**
|
|
* @file @internal The netCDF-4 functions which control HDF5
|
|
* caching. These caching controls allow the user to change the cache
|
|
* sizes of HDF5 before opening files.
|
|
*
|
|
* @author Ed Hartnett
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "hdf5internal.h"
|
|
|
|
/* These are the default chunk cache sizes for HDF5 files created or
|
|
* opened with netCDF-4. */
|
|
extern size_t nc4_chunk_cache_size;
|
|
extern size_t nc4_chunk_cache_nelems;
|
|
extern float nc4_chunk_cache_preemption;
|
|
|
|
/**
|
|
* Set chunk cache size. Only affects files opened/created *after* it
|
|
* is called.
|
|
*
|
|
* @param size Size in bytes to set cache.
|
|
* @param nelems Number of elements to hold in cache.
|
|
* @param preemption Premption stragety (between 0 and 1).
|
|
*
|
|
* @return ::NC_NOERR No error.
|
|
* @return ::NC_EINVAL Bad preemption.
|
|
* @author Ed Hartnett
|
|
*/
|
|
int
|
|
nc_set_chunk_cache(size_t size, size_t nelems, float preemption)
|
|
{
|
|
if (preemption < 0 || preemption > 1)
|
|
return NC_EINVAL;
|
|
nc4_chunk_cache_size = size;
|
|
nc4_chunk_cache_nelems = nelems;
|
|
nc4_chunk_cache_preemption = preemption;
|
|
return NC_NOERR;
|
|
}
|
|
|
|
/**
|
|
* Get chunk cache size. Only affects files opened/created *after* it
|
|
* is called.
|
|
*
|
|
* @param sizep Pointer that gets size in bytes to set cache.
|
|
* @param nelemsp Pointer that gets number of elements to hold in cache.
|
|
* @param preemptionp Pointer that gets premption stragety (between 0 and 1).
|
|
*
|
|
* @return ::NC_NOERR No error.
|
|
* @author Ed Hartnett
|
|
*/
|
|
int
|
|
nc_get_chunk_cache(size_t *sizep, size_t *nelemsp, float *preemptionp)
|
|
{
|
|
if (sizep)
|
|
*sizep = nc4_chunk_cache_size;
|
|
|
|
if (nelemsp)
|
|
*nelemsp = nc4_chunk_cache_nelems;
|
|
|
|
if (preemptionp)
|
|
*preemptionp = nc4_chunk_cache_preemption;
|
|
return NC_NOERR;
|
|
}
|
|
|
|
/**
|
|
* @internal Set the chunk cache. Required for fortran to avoid size_t
|
|
* issues.
|
|
*
|
|
* @param size Cache size.
|
|
* @param nelems Number of elements.
|
|
* @param preemption Preemption * 100.
|
|
*
|
|
* @return NC_NOERR No error.
|
|
* @author Ed Hartnett
|
|
*/
|
|
int
|
|
nc_set_chunk_cache_ints(int size, int nelems, int preemption)
|
|
{
|
|
if (size <= 0 || nelems <= 0 || preemption < 0 || preemption > 100)
|
|
return NC_EINVAL;
|
|
nc4_chunk_cache_size = size;
|
|
nc4_chunk_cache_nelems = nelems;
|
|
nc4_chunk_cache_preemption = (float)preemption / 100;
|
|
return NC_NOERR;
|
|
}
|
|
|
|
/**
|
|
* @internal Get the chunk cache settings. Required for fortran to
|
|
* avoid size_t issues.
|
|
*
|
|
* @param sizep Pointer that gets cache size.
|
|
* @param nelemsp Pointer that gets number of elements.
|
|
* @param preemptionp Pointer that gets preemption * 100.
|
|
*
|
|
* @return NC_NOERR No error.
|
|
* @author Ed Hartnett
|
|
*/
|
|
int
|
|
nc_get_chunk_cache_ints(int *sizep, int *nelemsp, int *preemptionp)
|
|
{
|
|
if (sizep)
|
|
*sizep = (int)nc4_chunk_cache_size;
|
|
if (nelemsp)
|
|
*nelemsp = (int)nc4_chunk_cache_nelems;
|
|
if (preemptionp)
|
|
*preemptionp = (int)(nc4_chunk_cache_preemption * 100);
|
|
|
|
return NC_NOERR;
|
|
}
|