Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

posixio.c File Reference

#include "ncconfig.h"
#include <assert.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include "ncio.h"
#include "fbits.h"
#include "rnd.h"

Go to the source code of this file.


Data Structures

struct  ncio_px
struct  ncio_spx

Defines

#define ENOERR   0
#define SEEK_SET   0
#define SEEK_CUR   1
#define SEEK_END   2
#define MIN(mm, nn)   (((mm) < (nn)) ? (mm) : (nn))
#define X_INT_MAX   2147483647
#define POSIXIO_DEFAULT_PAGESIZE   4096
#define NCIO_MINBLOCKSIZE   256
#define NCIO_MAXBLOCKSIZE   268435456
#define NC_DEFAULT_CREAT_MODE   0666

Typedefs

typedef ncio_px ncio_px
typedef ncio_spx ncio_spx

Functions

int ncio_px_sync (ncio *const nciop)
size_t pagesize (void)
size_t blksize (int fd)
int fgrow (const int fd, const off_t len)
int px_pgout (ncio *const nciop, off_t const offset, const size_t extent, void *const vp, off_t *posp)
int px_pgin (ncio *const nciop, off_t const offset, const size_t extent, void *const vp, size_t *nreadp, off_t *posp)
int px_rel (ncio_px *const pxp, off_t offset, int rflags)
int ncio_px_rel (ncio *const nciop, off_t offset, int rflags)
int px_get (ncio *const nciop, ncio_px *const pxp, off_t offset, size_t extent, int rflags, void **const vpp)
int ncio_px_get (ncio *const nciop, off_t offset, size_t extent, int rflags, void **const vpp)
int px_double_buffer (ncio *const nciop, off_t to, off_t from, size_t nbytes, int rflags)
int ncio_px_move (ncio *const nciop, off_t to, off_t from, size_t nbytes, int rflags)
void ncio_px_free (void *const pvt)
int ncio_px_init2 (ncio *const nciop, size_t *sizehintp, int isNew)
void ncio_px_init (ncio *const nciop)
int ncio_spx_rel (ncio *const nciop, off_t offset, int rflags)
int ncio_spx_get (ncio *const nciop, off_t offset, size_t extent, int rflags, void **const vpp)
int ncio_spx_move (ncio *const nciop, off_t to, off_t from, size_t nbytes, int rflags)
int ncio_spx_sync (ncio *const nciop)
void ncio_spx_free (void *const pvt)
int ncio_spx_init2 (ncio *const nciop, const size_t *const sizehintp)
void ncio_spx_init (ncio *const nciop)
void ncio_free (ncio *nciop)
ncioncio_new (const char *path, int ioflags)
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)
int ncio_open (const char *path, int ioflags, off_t igeto, size_t igetsz, size_t *sizehintp, ncio **nciopp, void **const igetvpp)
int ncio_close (ncio *nciop, int doUnlink)

Define Documentation

#define ENOERR   0
 

Definition at line 11 of file posixio.c.

Referenced by fgrow(), ncio_close(), ncio_create(), ncio_open(), ncio_px_init2(), ncio_px_move(), ncio_px_sync(), ncio_spx_get(), ncio_spx_init2(), ncio_spx_move(), ncio_spx_rel(), ncio_spx_sync(), px_double_buffer(), px_get(), px_pgin(), px_pgout(), and px_rel().

#define MIN mm,
nn       (((mm) < (nn)) ? (mm) : (nn))
 

Definition at line 41 of file posixio.c.

#define NC_DEFAULT_CREAT_MODE   0666
 

Definition at line 1147 of file posixio.c.

Referenced by ncio_create().

#define NCIO_MAXBLOCKSIZE   268435456
 

Definition at line 1140 of file posixio.c.

Referenced by ncio_create(), and ncio_open().

#define NCIO_MINBLOCKSIZE   256
 

Definition at line 1139 of file posixio.c.

#define POSIXIO_DEFAULT_PAGESIZE   4096
 

Definition at line 63 of file posixio.c.

Referenced by pagesize().

#define SEEK_CUR   1
 

Definition at line 25 of file posixio.c.

Referenced by fgrow(), px_pgin(), and px_pgout().

#define SEEK_END   2
 

Definition at line 26 of file posixio.c.

#define SEEK_SET   0
 

Definition at line 24 of file posixio.c.

Referenced by fgrow(), px_pgin(), and px_pgout().

#define X_INT_MAX   2147483647
 

Definition at line 44 of file posixio.c.

Referenced by ncio_spx_get(), and px_get().


Typedef Documentation

typedef struct ncio_px ncio_px
 

typedef struct ncio_spx ncio_spx
 


Function Documentation

size_t blksize int    fd [static]
 

Definition at line 93 of file posixio.c.

References fd, pagesize(), and sb.

Referenced by ncio_create(), and ncio_open().

00094 {
00095 #if defined(HAVE_ST_BLKSIZE)
00096         struct stat sb;
00097         if (fstat(fd, &sb) > -1)
00098         {
00099                 if(sb.st_blksize >= 8192)
00100                         return (size_t) sb.st_blksize;
00101                 return 8192;
00102         }
00103         /* else, silent in the face of error */
00104 #endif
00105         return (size_t) 2 * pagesize();
00106 }

int fgrow const int    fd,
const off_t    len
[static]
 

Definition at line 114 of file posixio.c.

References ENOERR, fd, sb, SEEK_CUR, SEEK_SET, and write().

Referenced by ncio_create().

00115 {
00116         struct stat sb;
00117         if (fstat(fd, &sb) < 0)
00118                 return errno;
00119         if (len < sb.st_size)
00120                 return ENOERR;
00121 #if defined(HAVE_FTRUNCATE)
00122         if (ftruncate(fd, len) < 0)
00123                 return errno;
00124 #else
00125         {
00126                 const long dumb = 0;
00127                         /* cache current position */
00128                 const off_t pos = lseek(fd, 0, SEEK_CUR);
00129                 if(pos < 0)
00130                         return errno;
00131                 if (lseek(fd, len-sizeof(dumb), SEEK_SET) < 0)
00132                         return errno;
00133                 if(write(fd, &dumb, sizeof(dumb)) < 0)
00134                         return errno;
00135                 if (lseek(fd, pos, SEEK_SET) < 0)
00136                         return errno;
00137         }
00138 #endif /* HAVE_FTRUNCATE */
00139         /* else */
00140         return ENOERR;
00141 }

int ncio_close ncio   nciop,
int    doUnlink
 

Definition at line 1319 of file posixio.c.

References close(), ENOERR, ncio::fd, ncio_free(), ncio::path, ncio::sync, and unlink.

Referenced by main(), nc__create_mp(), nc__open_mp(), nc_abort(), nc_close(), and nc_delete_mp().

01320 {
01321         int status = ENOERR;
01322 
01323         if(nciop == NULL)
01324                 return EINVAL;
01325 
01326         status = nciop->sync(nciop);
01327 
01328         (void) close(nciop->fd);
01329         
01330         if(doUnlink)
01331                 (void) unlink(nciop->path);
01332 
01333         ncio_free(nciop);
01334 
01335         return status;
01336 }

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
 

Definition at line 1151 of file posixio.c.

References blksize(), close(), ENOERR, ncio::fd, fd, fgrow(), fIsSet, fSet, ncio::get, ncio::ioflags, M_RNDUP, NC_DEFAULT_CREAT_MODE, ncio_free(), NCIO_MAXBLOCKSIZE, ncio_new(), ncio_px_init2(), ncio_spx_init2(), O_BINARY, and RGN_WRITE.

Referenced by main(), and nc__create_mp().

01155 {
01156         ncio *nciop;
01157         int oflags = (O_RDWR|O_CREAT);
01158         int fd;
01159         int status;
01160 
01161         if(initialsz < (size_t)igeto + igetsz)
01162                 initialsz = (size_t)igeto + igetsz;
01163 
01164         fSet(ioflags, NC_WRITE);
01165 
01166         if(path == NULL || *path == 0)
01167                 return EINVAL;
01168 
01169         nciop = ncio_new(path, ioflags);
01170         if(nciop == NULL)
01171                 return ENOMEM;
01172 
01173         if(fIsSet(ioflags, NC_NOCLOBBER))
01174                 fSet(oflags, O_EXCL);
01175         else
01176                 fSet(oflags, O_TRUNC);
01177 #ifdef O_BINARY
01178         fSet(oflags, O_BINARY);
01179 #endif
01180 #ifdef vms
01181         fd = open(path, oflags, NC_DEFAULT_CREAT_MODE, "ctx=stm");
01182 #else
01183         /* Should we mess with the mode based on NC_SHARE ?? */
01184         fd = open(path, oflags, NC_DEFAULT_CREAT_MODE);
01185 #endif
01186 #if 0
01187         (void) fprintf(stderr, "ncio_create(): path=\"%s\"\n", path);
01188         (void) fprintf(stderr, "ncio_create(): oflags=0x%x\n", oflags);
01189 #endif
01190         if(fd < 0)
01191         {
01192                 status = errno;
01193                 goto unwind_new;
01194         }
01195         *((int *)&nciop->fd) = fd; /* cast away const */
01196 
01197         if(*sizehintp < NCIO_MINBLOCKSIZE || *sizehintp > NCIO_MAXBLOCKSIZE)
01198         {
01199                 /* Use default */
01200                 *sizehintp = blksize(fd);
01201         }
01202         else
01203         {
01204                 *sizehintp = M_RNDUP(*sizehintp);
01205         }
01206 
01207         if(fIsSet(nciop->ioflags, NC_SHARE))
01208                 status = ncio_spx_init2(nciop, sizehintp);
01209         else
01210                 status = ncio_px_init2(nciop, sizehintp, 1);
01211 
01212         if(status != ENOERR)
01213                 goto unwind_open;
01214 
01215         if(initialsz != 0)
01216         {
01217                 status = fgrow(fd, (off_t)initialsz);
01218                 if(status != ENOERR)
01219                         goto unwind_open;
01220         }
01221 
01222         if(igetsz != 0)
01223         {
01224                 status = nciop->get(nciop,
01225                                 igeto, igetsz,
01226                                 RGN_WRITE,
01227                                 igetvpp);
01228                 if(status != ENOERR)
01229                         goto unwind_open;
01230         }
01231 
01232         *nciopp = nciop;
01233         return ENOERR;
01234 
01235 unwind_open:
01236         (void) close(fd);
01237         /* ?? unlink */
01238         /*FALLTHRU*/
01239 unwind_new:
01240         ncio_free(nciop);
01241         return status;
01242 }

void ncio_free ncio   nciop [static]
 

Definition at line 1086 of file posixio.c.

References free, ncio::free, and ncio::pvt.

Referenced by ncio_close(), ncio_create(), and ncio_open().

01087 {
01088         if(nciop == NULL)
01089                 return;
01090 
01091         if(nciop->free != NULL)
01092                 nciop->free(nciop->pvt);
01093         
01094         free(nciop);
01095 }

ncio* ncio_new const char *    path,
int    ioflags
[static]
 

Definition at line 1099 of file posixio.c.

References ncio::fd, fIsSet, fSet, ncio::ioflags, M_RNDUP, malloc, ncio_px_init(), ncio_spx_init(), ncio::path, and ncio::pvt.

Referenced by ncio_create(), and ncio_open().

01100 {
01101         size_t sz_ncio = M_RNDUP(sizeof(ncio));
01102         size_t sz_path = M_RNDUP(strlen(path) +1);
01103         size_t sz_ncio_pvt;
01104         ncio *nciop;
01105  
01106 #if ALWAYS_NC_SHARE /* DEBUG */
01107         fSet(ioflags, NC_SHARE);
01108 #endif
01109 
01110         if(fIsSet(ioflags, NC_SHARE))
01111                 sz_ncio_pvt = sizeof(ncio_spx);
01112         else
01113                 sz_ncio_pvt = sizeof(ncio_px);
01114 
01115         nciop = (ncio *) malloc(sz_ncio + sz_path + sz_ncio_pvt);
01116         if(nciop == NULL)
01117                 return NULL;
01118         
01119         nciop->ioflags = ioflags;
01120         *((int *)&nciop->fd) = -1; /* cast away const */
01121 
01122         nciop->path = (char *) ((char *)nciop + sz_ncio);
01123         (void) strcpy((char *)nciop->path, path); /* cast away const */
01124 
01125                                 /* cast away const */
01126         *((void **)&nciop->pvt) = (void *)(nciop->path + sz_path);
01127 
01128         if(fIsSet(ioflags, NC_SHARE))
01129                 ncio_spx_init(nciop);
01130         else
01131                 ncio_px_init(nciop);
01132 
01133         return nciop;
01134 }

int ncio_open const char *    path,
int    ioflags,
off_t    igeto,
size_t    igetsz,
size_t *    sizehintp,
ncio **    nciopp,
void **const    igetvpp
 

Definition at line 1246 of file posixio.c.

References blksize(), close(), ENOERR, ncio::fd, fd, fIsSet, fSet, ncio::get, ncio::ioflags, M_RNDUP, ncio_free(), NCIO_MAXBLOCKSIZE, ncio_new(), ncio_px_init2(), ncio_spx_init2(), and O_BINARY.

Referenced by main(), nc__open_mp(), and nc_delete_mp().

01250 {
01251         ncio *nciop;
01252         int oflags = fIsSet(ioflags, NC_WRITE) ? O_RDWR : O_RDONLY;
01253         int fd;
01254         int status;
01255 
01256         if(path == NULL || *path == 0)
01257                 return EINVAL;
01258 
01259         nciop = ncio_new(path, ioflags);
01260         if(nciop == NULL)
01261                 return ENOMEM;
01262 
01263 #ifdef O_BINARY
01264         fSet(oflags, O_BINARY);
01265 #endif
01266 #ifdef vms
01267         fd = open(path, oflags, 0, "ctx=stm");
01268 #else
01269         fd = open(path, oflags, 0);
01270 #endif
01271         if(fd < 0)
01272         {
01273                 status = errno;
01274                 goto unwind_new;
01275         }
01276         *((int *)&nciop->fd) = fd; /* cast away const */
01277 
01278         if(*sizehintp < NCIO_MINBLOCKSIZE || *sizehintp > NCIO_MAXBLOCKSIZE)
01279         {
01280                 /* Use default */
01281                 *sizehintp = blksize(fd);
01282         }
01283         else
01284         {
01285                 *sizehintp = M_RNDUP(*sizehintp);
01286         }
01287 
01288         if(fIsSet(nciop->ioflags, NC_SHARE))
01289                 status = ncio_spx_init2(nciop, sizehintp);
01290         else
01291                 status = ncio_px_init2(nciop, sizehintp, 0);
01292 
01293         if(status != ENOERR)
01294                 goto unwind_open;
01295 
01296         if(igetsz != 0)
01297         {
01298                 status = nciop->get(nciop,
01299                                 igeto, igetsz,
01300                                 0,
01301                                 igetvpp);
01302                 if(status != ENOERR)
01303                         goto unwind_open;
01304         }
01305 
01306         *nciopp = nciop;
01307         return ENOERR;
01308 
01309 unwind_open:
01310         (void) close(fd);
01311         /*FALLTHRU*/
01312 unwind_new:
01313         ncio_free(nciop);
01314         return status;
01315 }

void ncio_px_free void *const    pvt [static]
 

Definition at line 691 of file posixio.c.

References ncio_px::bf_base, ncio_px::bf_extent, ncio_px::bf_offset, free, OFF_NONE, and ncio_px::slave.

Referenced by ncio_px_init().

00692 {
00693         ncio_px *const pxp = (ncio_px *)pvt;
00694         if(pxp == NULL)
00695                 return;
00696 
00697         if(pxp->slave != NULL)
00698         {
00699                 if(pxp->slave->bf_base != NULL)
00700                 {
00701                         free(pxp->slave->bf_base);
00702                         pxp->slave->bf_base = NULL;
00703                         pxp->slave->bf_extent = 0;
00704                         pxp->slave->bf_offset = OFF_NONE;
00705                 }
00706                 free(pxp->slave);
00707                 pxp->slave = NULL;
00708         }
00709                 
00710         if(pxp->bf_base != NULL)
00711         {
00712                 free(pxp->bf_base);
00713                 pxp->bf_base = NULL;
00714                 pxp->bf_extent = 0;
00715                 pxp->bf_offset = OFF_NONE;
00716         }
00717 }

int ncio_px_get ncio *const    nciop,
off_t    offset,
size_t    extent,
int    rflags,
void **const    vpp
[static]
 

Definition at line 470 of file posixio.c.

References ncio_px::bf_base, ncio_px::bf_cnt, ncio_px::bf_extent, ncio_px::bf_offset, fIsSet, free, ncio::ioflags, ncio_px_sync(), OFF_NONE, offset, ncio::pvt, px_get(), RGN_WRITE, and ncio_px::slave.

Referenced by ncio_px_init().

00474 {
00475         ncio_px *const pxp = (ncio_px *)nciop->pvt;
00476         
00477         if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE))
00478                 return EPERM; /* attempt to write readonly file */
00479 
00480         /*
00481          * If the base of the stream buffer is NULL, then a read is forced
00482          * for synchronization purposes (see fault_v1hs() in v1hpg.c).  The
00483          * implementation is based on ncio_spx_rel() in this file.
00484          */
00485         if (*vpp == NULL)
00486         {
00487             ncio_px_sync(nciop);
00488             pxp->bf_offset = OFF_NONE;
00489             pxp->bf_cnt = 0;
00490         }
00491 
00492         /* reclaim space used in move */
00493         if(pxp->slave != NULL)
00494         {
00495                 if(pxp->slave->bf_base != NULL)
00496                 {
00497                         free(pxp->slave->bf_base);
00498                         pxp->slave->bf_base = NULL;
00499                         pxp->slave->bf_extent = 0;
00500                         pxp->slave->bf_offset = OFF_NONE;
00501                 }
00502                 free(pxp->slave);
00503                 pxp->slave = NULL;
00504         }
00505         return px_get(nciop, pxp, offset, extent, rflags, vpp);
00506 }

void ncio_px_init ncio *const    nciop [static]
 

Definition at line 751 of file posixio.c.

References ncio_px::bf_base, ncio_px::bf_extent, ncio_px::bf_offset, ncio_px::bf_refcount, ncio_px::bf_rflags, ncio_px::blksz, ncio::free, ncio::get, ncio::move, ncio_freefunc, ncio_getfunc, ncio_movefunc, ncio_px_free(), ncio_px_get(), ncio_px_move(), ncio_px_rel(), ncio_px_sync(), ncio_relfunc, ncio_syncfunc, OFF_NONE, ncio_px::pos, ncio::pvt, ncio::rel, ncio_px::slave, and ncio::sync.

Referenced by ncio_new().

00752 {
00753         ncio_px *const pxp = (ncio_px *)nciop->pvt;
00754 
00755         *((ncio_relfunc **)&nciop->rel) = ncio_px_rel; /* cast away const */
00756         *((ncio_getfunc **)&nciop->get) = ncio_px_get; /* cast away const */
00757         *((ncio_movefunc **)&nciop->move) = ncio_px_move; /* cast away const */
00758         *((ncio_syncfunc **)&nciop->sync) = ncio_px_sync; /* cast away const */
00759         *((ncio_freefunc **)&nciop->free) = ncio_px_free; /* cast away const */
00760 
00761         pxp->blksz = 0;
00762         pxp->pos = -1;
00763         pxp->bf_offset = OFF_NONE;
00764         pxp->bf_extent = 0;
00765         pxp->bf_rflags = 0;
00766         pxp->bf_refcount = 0;
00767         pxp->bf_base = NULL;
00768         pxp->slave = NULL;
00769 
00770 }

int ncio_px_init2 ncio *const    nciop,
size_t *    sizehintp,
int    isNew
[static]
 

Definition at line 721 of file posixio.c.

References ncio_px::bf_base, ncio_px::bf_cnt, ncio_px::bf_extent, ncio_px::bf_offset, ncio_px::blksz, ENOERR, ncio::fd, malloc, ncio_px::pos, and ncio::pvt.

Referenced by ncio_create(), and ncio_open().

00722 {
00723         ncio_px *const pxp = (ncio_px *)nciop->pvt;
00724         const size_t bufsz = 2 * *sizehintp;
00725 
00726         assert(nciop->fd >= 0);
00727 
00728         pxp->blksz = *sizehintp;
00729 
00730         assert(pxp->bf_base == NULL);
00731 
00732         /* this is separate allocation because it may grow */
00733         pxp->bf_base = malloc(bufsz);
00734         if(pxp->bf_base == NULL)
00735                 return ENOMEM;
00736         /* else */
00737         pxp->bf_cnt = 0;
00738         if(isNew)
00739         {
00740                 /* save a read */
00741                 pxp->pos = 0;
00742                 pxp->bf_offset = 0;
00743                 pxp->bf_extent = bufsz;
00744                 (void) memset(pxp->bf_base, 0, pxp->bf_extent);
00745         }
00746         return ENOERR;
00747 }

int ncio_px_move ncio *const    nciop,
off_t    to,
off_t    from,
size_t    nbytes,
int    rflags
[static]
 

Definition at line 569 of file posixio.c.

References base, ncio_px::blksz, ENOERR, fIsSet, ncio::ioflags, MIN, ncio::pvt, px_double_buffer(), px_get(), px_rel(), RGN_MODIFIED, RGN_NOLOCK, and RGN_WRITE.

Referenced by ncio_px_init().

00571 {
00572         ncio_px *const pxp = (ncio_px *)nciop->pvt;
00573         int status = ENOERR;
00574         off_t lower;    
00575         off_t upper;
00576         char *base;
00577         size_t diff;
00578         size_t extent;
00579 
00580         if(to == from)
00581                 return ENOERR; /* NOOP */
00582         
00583         if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE))
00584                 return EPERM; /* attempt to write readonly file */
00585 
00586         rflags &= RGN_NOLOCK; /* filter unwanted flags */
00587 
00588         if(to > from)
00589         {
00590                 /* growing */
00591                 lower = from;   
00592                 upper = to;
00593         }
00594         else
00595         {
00596                 /* shrinking */
00597                 lower = to;
00598                 upper = from;
00599         }
00600         diff = (size_t)(upper - lower);
00601         extent = diff + nbytes;
00602 
00603 #if INSTRUMENT
00604 fprintf(stderr, "ncio_px_move %ld %ld %ld %ld %ld\n",
00605                  (long)to, (long)from, (long)nbytes, (long)lower, (long)extent);
00606 #endif
00607         if(extent > pxp->blksz)
00608         {
00609                 size_t remaining = nbytes;
00610 
00611 if(to > from)
00612 {
00613                 off_t frm = from + nbytes;
00614                 off_t toh = to + nbytes;
00615                 for(;;)
00616                 {
00617                         size_t loopextent = MIN(remaining, pxp->blksz);
00618                         frm -= loopextent;
00619                         toh -= loopextent;
00620 
00621                         status = px_double_buffer(nciop, toh, frm,
00622                                         loopextent, rflags) ;
00623                         if(status != ENOERR)
00624                                 return status;
00625                         remaining -= loopextent;
00626 
00627                         if(remaining == 0)
00628                                 break; /* normal loop exit */
00629                 }
00630 }
00631 else
00632 {
00633                 for(;;)
00634                 {
00635                         size_t loopextent = MIN(remaining, pxp->blksz);
00636 
00637                         status = px_double_buffer(nciop, to, from,
00638                                         loopextent, rflags) ;
00639                         if(status != ENOERR)
00640                                 return status;
00641                         remaining -= loopextent;
00642 
00643                         if(remaining == 0)
00644                                 break; /* normal loop exit */
00645                         to += loopextent;
00646                         from += loopextent;
00647                 }
00648 }
00649                 return ENOERR;
00650         }
00651         
00652 #if INSTRUMENT
00653 fprintf(stderr, "\tncio_px_move small\n");
00654 #endif
00655         status = px_get(nciop, pxp, lower, extent, RGN_WRITE|rflags,
00656                         (void **)&base);
00657 
00658         if(status != ENOERR)
00659                 return status;
00660 
00661         if(to > from)
00662                 (void) memmove(base + diff, base, nbytes); 
00663         else
00664                 (void) memmove(base, base + diff, nbytes); 
00665                 
00666         (void) px_rel(pxp, lower, RGN_MODIFIED);
00667 
00668         return status;
00669 }

int ncio_px_rel ncio *const    nciop,
off_t    offset,
int    rflags
[static]
 

Definition at line 251 of file posixio.c.

References fIsSet, ncio::ioflags, offset, ncio::pvt, px_rel(), and RGN_MODIFIED.

Referenced by ncio_px_init().

00252 {
00253         ncio_px *const pxp = (ncio_px *)nciop->pvt;
00254 
00255         if(fIsSet(rflags, RGN_MODIFIED) && !fIsSet(nciop->ioflags, NC_WRITE))
00256                 return EPERM; /* attempt to write readonly file */
00257 
00258         return px_rel(pxp, offset, rflags);
00259 }

int ncio_px_sync ncio *const    nciop [static]
 

Definition at line 673 of file posixio.c.

References ncio_px::bf_base, ncio_px::bf_cnt, ncio_px::bf_offset, ncio_px::bf_refcount, ncio_px::bf_rflags, ENOERR, fIsSet, ncio_px::pos, ncio::pvt, px_pgout(), and RGN_MODIFIED.

Referenced by ncio_px_get(), and ncio_px_init().

00674 {
00675         ncio_px *const pxp = (ncio_px *)nciop->pvt;
00676         int status = ENOERR;
00677         if(fIsSet(pxp->bf_rflags, RGN_MODIFIED))
00678         {
00679                 assert(pxp->bf_refcount <= 0);
00680                 status = px_pgout(nciop, pxp->bf_offset,
00681                         pxp->bf_cnt,
00682                         pxp->bf_base, &pxp->pos);
00683                 if(status != ENOERR)
00684                         return status;
00685                 pxp->bf_rflags = 0;
00686         }
00687         return status;
00688 }

void ncio_spx_free void *const    pvt [static]
 

Definition at line 1024 of file posixio.c.

References ncio_spx::bf_base, ncio_spx::bf_cnt, ncio_spx::bf_extent, ncio_spx::bf_offset, free, and OFF_NONE.

Referenced by ncio_spx_init().

01025 {
01026         ncio_spx *const pxp = (ncio_spx *)pvt;
01027         if(pxp == NULL)
01028                 return;
01029 
01030         if(pxp->bf_base != NULL)
01031         {
01032                 free(pxp->bf_base);
01033                 pxp->bf_base = NULL;
01034                 pxp->bf_offset = OFF_NONE;
01035                 pxp->bf_extent = 0;
01036                 pxp->bf_cnt = 0;
01037         }
01038 }

int ncio_spx_get ncio *const    nciop,
off_t    offset,
size_t    extent,
int    rflags,
void **const    vpp
[static]
 

Definition at line 816 of file posixio.c.

References ncio_spx::bf_base, ncio_spx::bf_cnt, ncio_spx::bf_extent, ncio_spx::bf_offset, ENOERR, fIsSet, free, ncio::ioflags, malloc, offset, ncio_spx::pos, ncio::pvt, px_pgin(), RGN_WRITE, X_ALIGN, and X_INT_MAX.

Referenced by ncio_spx_init(), and ncio_spx_move().

00820 {
00821         ncio_spx *const pxp = (ncio_spx *)nciop->pvt;
00822         int status = ENOERR;
00823 #ifdef X_ALIGN
00824         size_t rem;
00825 #endif
00826         
00827         if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE))
00828                 return EPERM; /* attempt to write readonly file */
00829 
00830         assert(extent != 0);
00831         assert(extent < X_INT_MAX); /* sanity check */
00832         assert(offset < X_INT_MAX); /* sanity check */
00833 
00834         assert(pxp->bf_cnt == 0);
00835 
00836 #ifdef X_ALIGN
00837         rem = (size_t)(offset % X_ALIGN);
00838         if(rem != 0)
00839         {
00840                 offset -= rem;
00841                 extent += rem;
00842         }
00843 
00844         {
00845                 const size_t rndup = extent % X_ALIGN;
00846                 if(rndup != 0)
00847                         extent += X_ALIGN - rndup;
00848         }
00849 
00850         assert(offset % X_ALIGN == 0);
00851         assert(extent % X_ALIGN == 0);
00852 #endif
00853 
00854         if(pxp->bf_extent < extent)
00855         {
00856                 if(pxp->bf_base != NULL)
00857                 {
00858                         free(pxp->bf_base);
00859                         pxp->bf_base = NULL;
00860                         pxp->bf_extent = 0;
00861                 }
00862                 assert(pxp->bf_extent == 0);
00863                 pxp->bf_base = malloc(extent);
00864                 if(pxp->bf_base == NULL)
00865                         return ENOMEM;
00866                 pxp->bf_extent = extent;
00867         }
00868 
00869         status = px_pgin(nciop, offset,
00870                  extent,
00871                  pxp->bf_base,
00872                  &pxp->bf_cnt, &pxp->pos);
00873         if(status != ENOERR)
00874                 return status;
00875 
00876         pxp->bf_offset = offset;
00877 
00878         if(pxp->bf_cnt < extent)
00879                 pxp->bf_cnt = extent;
00880 
00881 #ifdef X_ALIGN
00882         *vpp = (char *)pxp->bf_base + rem;
00883 #else
00884         *vpp = pxp->bf_base;
00885 #endif
00886         return ENOERR;
00887 }

void ncio_spx_init ncio *const    nciop [static]
 

Definition at line 1065 of file posixio.c.

References ncio_spx::bf_base, ncio_spx::bf_cnt, ncio_spx::bf_extent, ncio_spx::bf_offset, ncio::free, ncio::get, ncio::move, ncio_freefunc, ncio_getfunc, ncio_movefunc, ncio_relfunc, ncio_spx_free(), ncio_spx_get(), ncio_spx_move(), ncio_spx_rel(), ncio_spx_sync(), ncio_syncfunc, OFF_NONE, ncio_spx::pos, ncio::pvt, ncio::rel, and ncio::sync.

Referenced by ncio_new().

01066 {
01067         ncio_spx *const pxp = (ncio_spx *)nciop->pvt;
01068 
01069         *((ncio_relfunc **)&nciop->rel) = ncio_spx_rel; /* cast away const */
01070         *((ncio_getfunc **)&nciop->get) = ncio_spx_get; /* cast away const */
01071         *((ncio_movefunc **)&nciop->move) = ncio_spx_move; /* cast away const */
01072         *((ncio_syncfunc **)&nciop->sync) = ncio_spx_sync; /* cast away const */
01073         *((ncio_freefunc **)&nciop->free) = ncio_spx_free; /* cast away const */
01074 
01075         pxp->pos = -1;
01076         pxp->bf_offset = OFF_NONE;
01077         pxp->bf_extent = 0;
01078         pxp->bf_cnt = 0;
01079         pxp->bf_base = NULL;
01080 }

int ncio_spx_init2 ncio *const    nciop,
const size_t *const    sizehintp
[static]
 

Definition at line 1042 of file posixio.c.

References ncio_spx::bf_base, ncio_spx::bf_extent, ENOERR, ncio::fd, malloc, and ncio::pvt.

Referenced by ncio_create(), and ncio_open().

01043 {
01044         ncio_spx *const pxp = (ncio_spx *)nciop->pvt;
01045 
01046         assert(nciop->fd >= 0);
01047 
01048         pxp->bf_extent = *sizehintp;
01049 
01050         assert(pxp->bf_base == NULL);
01051 
01052         /* this is separate allocation because it may grow */
01053         pxp->bf_base = malloc(pxp->bf_extent);
01054         if(pxp->bf_base == NULL)
01055         {
01056                 pxp->bf_extent = 0;
01057                 return ENOMEM;
01058         }
01059         /* else */
01060         return ENOERR;
01061 }

int ncio_spx_move ncio *const    nciop,
off_t    to,
off_t    from,
size_t    nbytes,
int    rflags
[static]
 

Definition at line 967 of file posixio.c.

References base, ENOERR, ncio_spx_get(), ncio_spx_rel(), RGN_MODIFIED, RGN_NOLOCK, and RGN_WRITE.

Referenced by ncio_spx_init().

00969 {
00970         int status = ENOERR;
00971         off_t lower = from;     
00972         off_t upper = to;
00973         char *base;
00974         size_t diff = (size_t)(upper - lower);
00975         size_t extent = diff + nbytes;
00976 
00977         rflags &= RGN_NOLOCK; /* filter unwanted flags */
00978 
00979         if(to == from)
00980                 return ENOERR; /* NOOP */
00981         
00982         if(to > from)
00983         {
00984                 /* growing */
00985                 lower = from;   
00986                 upper = to;
00987         }
00988         else
00989         {
00990                 /* shrinking */
00991                 lower = to;
00992                 upper = from;
00993         }
00994 
00995         diff = (size_t)(upper - lower);
00996         extent = diff + nbytes;
00997 
00998         status = ncio_spx_get(nciop, lower, extent, RGN_WRITE|rflags,
00999                         (void **)&base);
01000 
01001         if(status != ENOERR)
01002                 return status;
01003 
01004         if(to > from)
01005                 (void) memmove(base + diff, base, nbytes); 
01006         else
01007                 (void) memmove(base, base + diff, nbytes); 
01008                 
01009         (void) ncio_spx_rel(nciop, lower, RGN_MODIFIED);
01010 
01011         return status;
01012 }

int ncio_spx_rel ncio *const    nciop,
off_t    offset,
int    rflags
[static]
 

Definition at line 786 of file posixio.c.

References ncio_spx::bf_base, ncio_spx::bf_cnt, ncio_spx::bf_extent, ncio_spx::bf_offset, ENOERR, fIsSet, ncio::ioflags, OFF_NONE, offset, ncio_spx::pos, ncio::pvt, px_pgout(), RGN_MODIFIED, and X_ALIGN.

Referenced by ncio_spx_init(), and ncio_spx_move().

00787 {
00788         ncio_spx *const pxp = (ncio_spx *)nciop->pvt;
00789         int status = ENOERR;
00790 
00791         assert(pxp->bf_offset <= offset);
00792         assert(pxp->bf_cnt != 0);
00793         assert(pxp->bf_cnt <= pxp->bf_extent);
00794 #ifdef X_ALIGN
00795         assert(offset < pxp->bf_offset + X_ALIGN);
00796         assert(pxp->bf_cnt % X_ALIGN == 0 );
00797 #endif
00798 
00799         if(fIsSet(rflags, RGN_MODIFIED))
00800         {
00801                 if(!fIsSet(nciop->ioflags, NC_WRITE))
00802                         return EPERM; /* attempt to write readonly file */
00803 
00804                 status = px_pgout(nciop, pxp->bf_offset,
00805                         pxp->bf_cnt,
00806                         pxp->bf_base, &pxp->pos);
00807                 /* if error, invalidate buffer anyway */
00808         }
00809         pxp->bf_offset = OFF_NONE;
00810         pxp->bf_cnt = 0;
00811         return status;
00812 }

int ncio_spx_sync ncio *const    nciop [static]
 

Definition at line 1017 of file posixio.c.

References ENOERR.

Referenced by ncio_spx_init().

01018 {
01019         /* NOOP */
01020         return ENOERR;
01021 }

size_t pagesize void    [static]
 

Definition at line 69 of file posixio.c.

References getpagesize(), and POSIXIO_DEFAULT_PAGESIZE.

Referenced by blksize().

00070 {
00071 /* Hmm, aren't standards great? */
00072 #if defined(_SC_PAGE_SIZE) && !defined(_SC_PAGESIZE)
00073 #define _SC_PAGESIZE _SC_PAGE_SIZE
00074 #endif
00075 
00076 #ifdef _SC_PAGESIZE
00077         {
00078                 const long pgsz = sysconf(_SC_PAGESIZE);
00079                 if(pgsz > 0)
00080                         return (size_t) pgsz;
00081                 /* else, silent in the face of error */
00082         }
00083 #elif defined(HAVE_GETPAGESIZE)
00084         return (size_t) getpagesize();
00085 #endif
00086         return (size_t) POSIXIO_DEFAULT_PAGESIZE;
00087 }

int px_double_buffer ncio *const    nciop,
off_t    to,
off_t    from,
size_t    nbytes,
int    rflags
[static]
 

Definition at line 511 of file posixio.c.

References ncio_px::bf_base, ncio_px::bf_cnt, ncio_px::bf_extent, ncio_px::bf_offset, ncio_px::bf_refcount, ncio_px::bf_rflags, ncio_px::blksz, ENOERR, malloc, ncio_px::pos, ncio::pvt, px_get(), px_rel(), RGN_MODIFIED, RGN_WRITE, and ncio_px::slave.

Referenced by ncio_px_move().

00513 {
00514         ncio_px *const pxp = (ncio_px *)nciop->pvt;
00515         int status = ENOERR;
00516         void *src;
00517         void *dest;
00518         
00519 #if INSTRUMENT
00520 fprintf(stderr, "\tdouble_buffr %ld %ld %ld\n",
00521                  (long)to, (long)from, (long)nbytes);
00522 #endif
00523         status = px_get(nciop, pxp, to, nbytes, RGN_WRITE,
00524                         &dest);
00525         if(status != ENOERR)
00526                 return status;
00527 
00528         if(pxp->slave == NULL)
00529         {
00530                 pxp->slave = (ncio_px *) malloc(sizeof(ncio_px));
00531                 if(pxp->slave == NULL)
00532                         return ENOMEM;
00533 
00534                 pxp->slave->blksz = pxp->blksz;
00535                 /* pos done below */
00536                 pxp->slave->bf_offset = pxp->bf_offset; 
00537                 pxp->slave->bf_extent = pxp->bf_extent;
00538                 pxp->slave->bf_cnt = pxp->bf_cnt;
00539                 pxp->slave->bf_base = malloc(2 * pxp->blksz);
00540                 if(pxp->slave->bf_base == NULL)
00541                         return ENOMEM;
00542                 (void) memcpy(pxp->slave->bf_base, pxp->bf_base,
00543                          pxp->bf_extent);
00544                 pxp->slave->bf_rflags = 0;
00545                 pxp->slave->bf_refcount = 0;
00546                 pxp->slave->slave = NULL;
00547         }
00548         
00549         pxp->slave->pos = pxp->pos;
00550         status = px_get(nciop, pxp->slave, from, nbytes, 0,
00551                         &src);
00552         if(status != ENOERR)
00553                 return status;
00554         if(pxp->pos != pxp->slave->pos)
00555         {
00556                 /* position changed, sync */
00557                 pxp->pos = pxp->slave->pos;
00558         }
00559 
00560         (void) memcpy(dest, src, nbytes);
00561 
00562         (void)px_rel(pxp->slave, from, 0);
00563         (void)px_rel(pxp, to, RGN_MODIFIED);
00564         
00565         return status;
00566 }

int px_get ncio *const    nciop,
ncio_px *const    pxp,
off_t    offset,
size_t    extent,
int    rflags,
void **const    vpp
[static]
 

Definition at line 262 of file posixio.c.

References _RNDDOWN, _RNDUP, ncio_px::bf_base, ncio_px::bf_cnt, ncio_px::bf_extent, ncio_px::bf_offset, ncio_px::bf_refcount, ncio_px::bf_rflags, ncio_px::blksz, ENOERR, fIsSet, malloc, OFF_NONE, offset, ncio_px::pos, px_pgin(), px_pgout(), RGN_MODIFIED, and X_INT_MAX.

Referenced by ncio_px_get(), ncio_px_move(), and px_double_buffer().

00266 {
00267         int status = ENOERR;
00268 
00269         const off_t blkoffset = _RNDDOWN(offset, (off_t)pxp->blksz);
00270         size_t diff = (size_t)(offset - blkoffset);
00271         size_t blkextent = _RNDUP(diff + extent, pxp->blksz);
00272         
00273         assert(extent != 0);
00274         assert(extent < X_INT_MAX); /* sanity check */
00275         assert(offset >= 0); /* sanity check */
00276         assert(offset < X_INT_MAX); /* sanity check */
00277 
00278         if(2 * pxp->blksz < blkextent)
00279                 return E2BIG; /* TODO: temporary kludge */
00280         if(pxp->bf_offset == OFF_NONE)
00281         {
00282                 /* Uninitialized */
00283                 if(pxp->bf_base == NULL)
00284                 {
00285                         assert(pxp->bf_extent == 0);
00286                         assert(blkextent <= 2 * pxp->blksz);
00287                         pxp->bf_base = malloc(2 * pxp->blksz);
00288                         if(pxp->bf_base == NULL)
00289                                 return ENOMEM;
00290                 }
00291                 goto pgin;
00292         }
00293         /* else */
00294         assert(blkextent <= 2 * pxp->blksz);
00295 
00296         if(blkoffset == pxp->bf_offset)
00297         {
00298                 /* hit */
00299                 if(blkextent > pxp->bf_extent) 
00300                 {
00301                         /* page in upper */
00302                         void *const middle =
00303                                 (void *)((char *)pxp->bf_base + pxp->blksz);
00304                         assert(pxp->bf_extent == pxp->blksz);
00305                         status = px_pgin(nciop,
00306                                  pxp->bf_offset + (off_t)pxp->blksz,
00307                                  pxp->blksz,
00308                                  middle,
00309                                  &pxp->bf_cnt,
00310                                  &pxp->pos);
00311                         if(status != ENOERR)
00312                                 return status;
00313                         pxp->bf_extent = 2 * pxp->blksz;
00314                         pxp->bf_cnt += pxp->blksz;
00315                 }
00316                 goto done;
00317         }
00318         /* else */
00319 
00320         if(pxp->bf_extent > pxp->blksz
00321                  && blkoffset == pxp->bf_offset + pxp->blksz)
00322         {
00323                 /* hit in upper half */
00324                 if(blkextent == pxp->blksz)
00325                 {
00326                         /* all in upper half, no fault needed */
00327                         diff += pxp->blksz;
00328                         goto done;
00329                 }
00330                 /* else */
00331                 if(pxp->bf_cnt > pxp->blksz)
00332                 {
00333                         /* data in upper half */
00334                         void *const middle =
00335                                 (void *)((char *)pxp->bf_base + pxp->blksz);
00336                         assert(pxp->bf_extent == 2 * pxp->blksz);
00337                         if(fIsSet(pxp->bf_rflags, RGN_MODIFIED))
00338                         {
00339                                 /* page out lower half */
00340                                 assert(pxp->bf_refcount <= 0);
00341                                 status = px_pgout(nciop,
00342                                         pxp->bf_offset,
00343                                         pxp->blksz,
00344                                         pxp->bf_base,
00345                                         &pxp->pos);
00346                                 if(status != ENOERR)
00347                                         return status;
00348                         }
00349                         pxp->bf_cnt -= pxp->blksz;
00350                         /* copy upper half into lower half */
00351                         (void) memcpy(pxp->bf_base, middle, pxp->bf_cnt);
00352                 }
00353                 pxp->bf_offset = blkoffset;
00354                 /* pxp->bf_extent = pxp->blksz; */
00355 
00356                 assert(blkextent == 2 * pxp->blksz);
00357                 {
00358                         /* page in upper */
00359                         void *const middle =
00360                                 (void *)((char *)pxp->bf_base + pxp->blksz);
00361                         status = px_pgin(nciop,
00362                                  pxp->bf_offset + (off_t)pxp->blksz,
00363                                  pxp->blksz,
00364                                  middle,
00365                                  &pxp->bf_cnt,
00366                                  &pxp->pos);
00367                         if(status != ENOERR)
00368                                 return status;
00369                         pxp->bf_extent = 2 * pxp->blksz;
00370                         pxp->bf_cnt += pxp->blksz;
00371                 }
00372                 goto done;
00373         }
00374         /* else */
00375 
00376         if(blkoffset == pxp->bf_offset - pxp->blksz)
00377         {
00378                 /* wants the page below */
00379                 void *const middle =
00380                         (void *)((char *)pxp->bf_base + pxp->blksz);
00381                 size_t upper_cnt = 0;
00382                 if(pxp->bf_cnt > pxp->blksz)
00383                 {
00384                         /* data in upper half */
00385                         assert(pxp->bf_extent == 2 * pxp->blksz);
00386                         if(fIsSet(pxp->bf_rflags, RGN_MODIFIED))
00387                         {
00388                                 /* page out upper half */
00389                                 assert(pxp->bf_refcount <= 0);
00390                                 status = px_pgout(nciop,
00391                                         pxp->bf_offset + (off_t)pxp->blksz,
00392                                         pxp->bf_cnt - pxp->blksz,
00393                                         middle,
00394                                         &pxp->pos);
00395                                 if(status != ENOERR)
00396                                         return status;
00397                         }
00398                         pxp->bf_cnt = pxp->blksz;
00399                         pxp->bf_extent = pxp->blksz;
00400                 }
00401                 if(pxp->bf_cnt > 0)
00402                 {
00403                         /* copy lower half into upper half */
00404                         (void) memcpy(middle, pxp->bf_base, pxp->blksz);
00405                         upper_cnt = pxp->bf_cnt;
00406                 }
00407                 /* read page below into lower half */
00408                 status = px_pgin(nciop,
00409                          blkoffset,
00410                          pxp->blksz,
00411                          pxp->bf_base,
00412                          &pxp->bf_cnt,
00413                          &pxp->pos);
00414                 if(status != ENOERR)
00415                         return status;
00416                 pxp->bf_offset = blkoffset;
00417                 if(upper_cnt != 0)
00418                 {
00419                         pxp->bf_extent = 2 * pxp->blksz;
00420                         pxp->bf_cnt = pxp->blksz + upper_cnt;
00421                 }
00422                 else
00423                 {
00424                         pxp->bf_extent = pxp->blksz;
00425                 }
00426                 goto done;
00427         }
00428         /* else */
00429 
00430         /* no overlap */
00431         if(fIsSet(pxp->bf_rflags, RGN_MODIFIED))
00432         {
00433                 assert(pxp->bf_refcount <= 0);
00434                 status = px_pgout(nciop,
00435                         pxp->bf_offset,
00436                         pxp->bf_cnt,
00437                         pxp->bf_base,
00438                         &pxp->pos);
00439                 if(status != ENOERR)
00440                         return status;
00441                 pxp->bf_rflags = 0;
00442         }
00443 
00444 pgin:
00445         status = px_pgin(nciop,
00446                  blkoffset,
00447                  blkextent,
00448                  pxp->bf_base,
00449                  &pxp->bf_cnt,
00450                  &pxp->pos);
00451         if(status != ENOERR)
00452                 return status;
00453          pxp->bf_offset = blkoffset;
00454          pxp->bf_extent = blkextent;
00455 
00456 done:
00457         extent += diff;
00458         if(pxp->bf_cnt < extent)
00459                 pxp->bf_cnt = extent;
00460         assert(pxp->bf_cnt <= pxp->bf_extent);
00461 
00462         pxp->bf_rflags |= rflags;
00463         pxp->bf_refcount++;
00464 
00465         *vpp = (char *)pxp->bf_base + diff;
00466         return ENOERR;
00467 }

int px_pgin ncio *const    nciop,
off_t const    offset,
const size_t    extent,
void *const    vp,
size_t *    nreadp,
off_t *    posp
[static]
 

Definition at line 176 of file posixio.c.

References ENOERR, ncio::fd, OFF_NONE, offset, read(), SEEK_CUR, SEEK_SET, and X_ALIGN.

Referenced by ncio_spx_get(), and px_get().

00179 {
00180         int status;
00181         ssize_t nread;
00182 
00183 #ifdef X_ALIGN
00184         assert(offset % X_ALIGN == 0);
00185         assert(extent % X_ALIGN == 0);
00186 #endif
00187 
00188         assert(*posp == OFF_NONE || *posp == lseek(nciop->fd, 0, SEEK_CUR));
00189 
00190         if(*posp != offset)
00191         {
00192                 if(lseek(nciop->fd, offset, SEEK_SET) != offset)
00193                 {
00194                         status = errno;
00195                         return status;
00196                 }
00197                 *posp = offset;
00198         }
00199 
00200         errno = 0;
00201         nread = read(nciop->fd, vp, extent);
00202         if(nread != (ssize_t) extent)
00203         {
00204                 status = errno;
00205                 if(nread == -1 || status != ENOERR)
00206                         return status;
00207                 /* else it's okay we read less than asked for */
00208                 (void) memset((char *)vp + nread, 0, (ssize_t)extent - nread);
00209         }
00210         *nreadp = nread;
00211         *posp += nread;
00212 
00213         return ENOERR;
00214 }

int px_pgout ncio *const    nciop,
off_t const    offset,
const size_t    extent,
void *const    vp,
off_t *    posp
[static]
 

Definition at line 147 of file posixio.c.

References ENOERR, ncio::fd, OFF_NONE, offset, SEEK_CUR, SEEK_SET, write(), and X_ALIGN.

Referenced by ncio_px_sync(), ncio_spx_rel(), and px_get().

00150 {
00151 #ifdef X_ALIGN
00152         assert(offset % X_ALIGN == 0);
00153 #endif
00154 
00155         assert(*posp == OFF_NONE || *posp == lseek(nciop->fd, 0, SEEK_CUR));
00156 
00157         if(*posp != offset)
00158         {
00159                 if(lseek(nciop->fd, offset, SEEK_SET) != offset)
00160                 {
00161                         return errno;
00162                 }
00163                 *posp = offset;
00164         }
00165         if(write(nciop->fd, vp, extent) != (ssize_t) extent)
00166         {
00167                 return errno;
00168         }
00169         *posp += extent;
00170 
00171         return ENOERR;
00172 }

int px_rel ncio_px *const    pxp,
off_t    offset,
int    rflags
[static]
 

Definition at line 234 of file posixio.c.

References ncio_px::bf_extent, ncio_px::bf_offset, ncio_px::bf_refcount, ncio_px::bf_rflags, ENOERR, fIsSet, fSet, offset, pIf, RGN_MODIFIED, and RGN_WRITE.

Referenced by ncio_px_move(), ncio_px_rel(), and px_double_buffer().

00235 {
00236         assert(pxp->bf_offset <= offset
00237                  && offset < pxp->bf_offset + (off_t) pxp->bf_extent);
00238         assert(pIf(fIsSet(rflags, RGN_MODIFIED),
00239                 fIsSet(pxp->bf_rflags, RGN_WRITE)));
00240 
00241         if(fIsSet(rflags, RGN_MODIFIED))
00242         {
00243                 fSet(pxp->bf_rflags, RGN_MODIFIED);
00244         }
00245         pxp->bf_refcount--;
00246 
00247         return ENOERR;
00248 }
 

Powered by Plone

This site conforms to the following standards: