2010-06-03 21:24:43 +08:00
|
|
|
/*
|
|
|
|
* Copyright 1996, University Corporation for Atmospheric Research
|
|
|
|
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
|
|
|
|
*/
|
|
|
|
/* $Id: ncio.h,v 1.27 2006/01/03 04:56:28 russ Exp $ */
|
|
|
|
|
|
|
|
#ifndef _NCIO_H_
|
|
|
|
#define _NCIO_H_
|
|
|
|
|
|
|
|
#include <stddef.h> /* size_t */
|
|
|
|
#include <sys/types.h> /* off_t */
|
|
|
|
#include "netcdf.h"
|
|
|
|
|
|
|
|
typedef struct ncio ncio; /* forward reference */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* A value which is an invalid off_t
|
|
|
|
*/
|
|
|
|
#define OFF_NONE ((off_t)(-1))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flags used by the region layer,
|
|
|
|
* 'rflags' argument to ncio.rel() and ncio.get().
|
|
|
|
*/
|
|
|
|
#define RGN_NOLOCK 0x1 /* Don't lock region.
|
|
|
|
* Used when contention control handled
|
|
|
|
* elsewhere.
|
|
|
|
*/
|
|
|
|
#define RGN_NOWAIT 0x2 /* return immediate if can't lock, else wait */
|
|
|
|
|
|
|
|
#define RGN_WRITE 0x4 /* we intend to modify, else read only */
|
|
|
|
|
|
|
|
#define RGN_MODIFIED 0x8 /* we did modify, else, discard */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The next four typedefs define the signatures
|
|
|
|
* of function pointers in struct ncio below.
|
|
|
|
* They are not used outside of this file and ncio.h,
|
|
|
|
* They just make some casts in the ncio.c more readable.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* Indicate that you are done with the region which begins
|
|
|
|
* at offset. Only reasonable flag value is RGN_MODIFIED.
|
|
|
|
*/
|
|
|
|
typedef int ncio_relfunc(ncio *const nciop,
|
|
|
|
off_t offset, int rflags);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Request that the region (offset, extent)
|
|
|
|
* be made available through *vpp.
|
|
|
|
*/
|
|
|
|
typedef int ncio_getfunc(ncio *const nciop,
|
|
|
|
off_t offset, size_t extent,
|
|
|
|
int rflags,
|
|
|
|
void **const vpp);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Like memmove(), safely move possibly overlapping data.
|
|
|
|
* Only reasonable flag value is RGN_NOLOCK.
|
|
|
|
*/
|
|
|
|
typedef int ncio_movefunc(ncio *const nciop, off_t to, off_t from,
|
|
|
|
size_t nbytes, int rflags);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write out any dirty buffers to disk and
|
|
|
|
* ensure that next read will get data from disk.
|
|
|
|
*/
|
|
|
|
typedef int ncio_syncfunc(ncio *const nciop);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Don't call this.
|
|
|
|
* Internal function called at close to
|
|
|
|
* free up anything hanging off pvt;
|
|
|
|
*/
|
|
|
|
typedef void ncio_freefunc(void *const pvt);
|
|
|
|
|
|
|
|
/* Get around cplusplus "const xxx in class ncio without constructor" error */
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
#define NCIO_CONST
|
|
|
|
#else
|
|
|
|
#define NCIO_CONST const
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* netcdf i/o abstraction
|
|
|
|
*/
|
|
|
|
struct ncio {
|
|
|
|
/*
|
|
|
|
* A copy of the ioflags argument passed in to ncio_open()
|
|
|
|
* or ncio_create().
|
|
|
|
*/
|
|
|
|
int ioflags;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The file descriptor of the netcdf file.
|
|
|
|
* This gets handed to the user as the netcdf id.
|
|
|
|
*/
|
|
|
|
NCIO_CONST int fd;
|
|
|
|
|
|
|
|
/* member functions do the work */
|
|
|
|
|
|
|
|
ncio_relfunc *NCIO_CONST rel;
|
|
|
|
|
|
|
|
ncio_getfunc *NCIO_CONST get;
|
|
|
|
|
|
|
|
ncio_movefunc *NCIO_CONST move;
|
|
|
|
|
|
|
|
ncio_syncfunc *NCIO_CONST sync;
|
|
|
|
|
|
|
|
ncio_freefunc *NCIO_CONST free; /* Implementation private */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* A copy of the 'path' argument passed in to ncio_open()
|
|
|
|
* or ncio_create(). Used by ncabort() to remove (unlink)
|
|
|
|
* the file and by error messages.
|
|
|
|
*/
|
|
|
|
const char *path;
|
|
|
|
|
|
|
|
/* implementation private stuff */
|
2012-01-16 10:41:07 +08:00
|
|
|
void *pvt;
|
2010-06-03 21:24:43 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#undef NCIO_CONST
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ncio_create(const char *path, int ioflags,
|
|
|
|
size_t initialsz,
|
|
|
|
off_t igeto, size_t igetsz, size_t *sizehintp,
|
|
|
|
ncio **nciopp, void **const igetvpp);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ncio_open(const char *path,
|
|
|
|
int ioflags,
|
|
|
|
off_t igeto, size_t igetsz, size_t *sizehintp,
|
|
|
|
ncio **nciopp, void **const igetvpp);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ncio_close(ncio *nciop, int doUnlink);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ncio_filesize(ncio *nciop, off_t *filesizep);
|
|
|
|
|
|
|
|
extern int
|
|
|
|
ncio_pad_length(ncio *nciop, off_t length);
|
|
|
|
|
|
|
|
#endif /* _NCIO_H_ */
|