netcdf-c/libdap4/ncd4dispatch.h
Dennis Heimbigner ccc70d640b re: esupport MQO-415619
and https://github.com/Unidata/netcdf-c/issues/708

Expand the NC_INMEMORY capabilities to support writing and accessing
the final modified memory.

Three new functions have been added:
nc_open_memio, nc_create_mem, and nc_close_memio.

The following new capabilities were added.
1. nc_open_memio() allows the NC_WRITE mode flag
   so a chunk of memory can be passed in and be modified
2. nc_create_mem() allows the NC_INMEMORY flag to be set
   to cause the created file to be kept in memory.
3. nc_close_mem() allows the final in-memory contents to be
   retrieved at the time the file is closed.
4. A special flag, NC_MEMIO_LOCK, is provided to ensure that
   the provided memory will not be freed or reallocated.

Note the following.
1. If nc_open_memio() is called with NC_WRITE, and NC_MEMIO_LOCK is not set,
   then the netcdf-c library will take control of the incoming memory.
   This means that the original memory block should not be freed
   but the block returned by nc_close_mem() must be freed.
2. If nc_open_memio() is called with NC_WRITE, and NC_MEMIO_LOCK is set,
   then modifications to the original memory may fail if the space available
   is insufficient.

Documentation is provided in the file docs/inmemory.md.
A test case is provided: nc_test/tst_inmemory.c driven by
nc_test/run_inmemory.sh

WARNING: changes were made to the dispatch table for
the close entry. From int (*close)(int) to int (*close)(int,void*).
2018-02-25 21:45:31 -07:00

51 lines
1.1 KiB
C

/*********************************************************************
* Copyright 2016, UCAR/Unidata
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
*********************************************************************/
#ifndef _NCD4DISPATCH_H
#define _NCD4DISPATCH_H
#include <stddef.h> /* size_t, ptrdiff_t */
#include "netcdf.h"
#include "ncdispatch.h"
#if defined(__cplusplus)
extern "C" {
#endif
extern int
NCD4_open(const char *path, int mode,
int basepe, size_t *chunksizehintp,
int use_parallel, void* mpidata,
struct NC_Dispatch* dispatch, NC* ncp);
extern int
NCD4_close(int ncid,void*);
extern int
NCD4_abort(int ncid);
extern int
NCD4_inq_dim(int ncid, int dimid, char* name, size_t* lenp);
extern int
NCD4_get_vara(int ncid, int varid,
const size_t *start, const size_t *edges,
void *value,
nc_type memtype);
extern int
NCD4_get_vars(int ncid, int varid,
const size_t *start, const size_t *edges, const ptrdiff_t* strides,
void *value,
nc_type memtype);
extern int NCD4_initialize(void);
#if defined(__cplusplus)
}
#endif
#endif /*_NCD4DISPATCH_H*/