1/*
2  Copyright 2008, UCAR/Unidata
3  See COPYRIGHT file for copying and redistribution conditions.
4
5  This program tests the large file bug in netCDF 3.6.2,
6  creating byte and short variables larger than 4 GiB.
7
8  $Id: tst_big_var.c,v 1.9 2010/05/15 00:50:10 russ Exp $
9*/
10
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <netcdf.h>
14#include <stdio.h>
15#include <string.h>
16#include <stdlib.h>
17
18#undef XFAIL
19
20#define FILE_NAME "tst_diskless4.nc"
21#define CHUNKSIZE 4096
22#define DATASIZE (CHUNKSIZE/sizeof(int))
23#define DIMMAX 1000000000
24
25typedef enum Tag {Create,CreateDiskless,Open,OpenDisklessTag;
26
27#define REPORT err_report(status,__FILE__,__LINE__)
28
29static void
30err_report(int status, char* file, int line)
31{
32    printf("***FAIL: %s: line=%d status=%d %s\n",file,line,status,nc_strerror(status));
33#ifdef XFAIL
34    exit(0);
35#else
36    exit(1);
37#endif
38}
39
40int
41main(int argc, char **argv)
42{
43    int status = NC_NOERR;
44    int i,j,iv;
45    unsigned int data[DATASIZE];
46    size_t start[1];
47    size_t count[1];
48    Tag tag = Create;
49    int cmode = 0;
50    int ncid;
51    int dimids[1];
52    void* memory;
53    int nvars;
54    int varids[4096];
55    size_t varsize;
56    size_t filesize;
57
58    /* Get the specified var/file size */
59    if(argc > 1) {
60 filesize = atol(argv[1]);
61    } else {
62 if(sizeof(size_t) == 4)
63     filesize = 1000000000L;
64 else if(sizeof(size_t) == 8)
65     filesize = 3000000000L;
66 else {
67     fprintf(stderr,"Cannot compute filesize\n");
68     exit(1);
69 }
70    }
71
72    /* Test that we can malloc that much space */
73    memory = malloc(filesize);
74    if(memory == NULL) {
75        fprintf(stderr,"Cannot malloc %lu bytes\n",(unsigned long)filesize);
76 fprintf(stderr,"This may mean your machine does not have enough RAM. If this is the case, it is safe to ignore this error.\n");
77 exit(1);
78    }
79    free(memory);
80
81    if(argc > 2) {
82        if(strcmp(argv[2],"create")==0) tag = Create;
83        else if(strcmp(argv[2],"creatediskless")==0) tag = CreateDiskless;
84        else if(strcmp(argv[2],"open")==0) tag = Open;
85        else if(strcmp(argv[2],"opendiskless")==0) tag = OpenDiskless;
86 else {
87     fprintf(stderr,"illegal tag: %s",argv[2]);
88     exit(1);
89 }
90    } else
91 tag = Create; /* default */
92
93    switch (tag) {
94    case Create: printf("\n*** Create file\n"); break;
95    case CreateDiskless: printf("\n*** Create file diskless\n"); break;
96    case Open: printf("\n*** Open file\n"); break;
97    case OpenDiskless: printf("\n*** Open file diskless\n"); break;
98    }
99
100    switch (tag) {
101    case Create:   cmode = NC_CLOBBER; break;
102    case CreateDiskless:  cmode = NC_CLOBBER|NC_DISKLESS|NC_WRITE; break;
103    case Open:   cmode = 0; break;
104    case OpenDiskless:   cmode = NC_DISKLESS; break;
105    }
106
107    switch (tag) {
108    case Create:
109    case CreateDiskless:
110 /* Try to alloc as much as possible initially */
111        if((status=nc__create(FILE_NAMEcmodefilesizeNULL, &ncid)))
112     REPORT;
113        if((status=nc_set_fill(ncidNC_NOFILLNULL)))
114     REPORT;
115 /* Only need 1 dimension */
116        if((status=nc_def_dim(ncid, "dim", DIMMAX, &dimids[0])))
117     REPORT;
118 break;
119    case Open:
120    case OpenDiskless:
121        if((status=nc_open(FILE_NAMEcmode, &ncid)))
122     REPORT;
123        if((status=nc_inq_dimid(ncid, "dim", &dimids[0])))
124     REPORT;
125 break;
126    }
127
128    varsize = DIMMAX;
129    nvars = filesize / varsize;
130        assert((filesize % DIMMAX) == 0);
131        assert(nvars < 4096);
132
133    for(iv=0;iv<nvars;iv++) {
134 char varname[32];
135        sprintf(varname,"var%d",iv);
136 switch (tag) {
137        case Create:
138        case CreateDiskless:
139            if((status=nc_def_var(ncidvarnameNC_BYTE, 1, &dimids[0], &varids[iv])))
140         REPORT;
141 break;
142        case Open:
143        case OpenDiskless:
144            if((status=nc_inq_varid(ncidvarname, &varids[iv])))
145         REPORT;
146     break;
147 }
148    }
149
150    if(tag == Create || tag == CreateDiskless) {
151        if((status=nc_enddef(ncid)))
152     REPORT;
153    }
154
155    for(iv=0;iv<nvars;iv++) {
156        size_t pieces = varsize/CHUNKSIZE;
157        switch (tag) {
158        case Create:
159        case CreateDiskless:
160     /* Fill and put as integers */
161     for(i=0;i<pieces;i++) {
162 start[0] = i*CHUNKSIZE;
163 count[0] = CHUNKSIZE;
164 for(j=0;j<DATASIZE;j++) data[j] = iv*((i*CHUNKSIZE)+j);
165 if((status=nc_put_vara(ncid,varids[iv],start,count,(void*)data)))
166     REPORT;
167     }
168     break;
169        case Open:
170        case OpenDiskless:
171     /* Read the var contents and validate */
172     for(i=0;i<pieces;i++) {
173 start[0] = i*CHUNKSIZE;
174 count[0] = CHUNKSIZE;
175 if((status=nc_get_vara(ncid,varids[iv],start,count,(void*)data)))
176     REPORT;
177 for(j=0;j<DATASIZE;j++) {
178     unsigned int expected = iv*((i*CHUNKSIZE)+j);
179         if(data[j] != expected) {
180         printf("mismatch: iv=%d i=%u j=%u data=%u; should be %u\n",
181 ivi,j,data[j],expected);
182         err++;
183     }
184 }
185     }
186     break;
187 }
188    }
189
190    if((status=nc_close(ncid)))
191 REPORT;
192
193    SUMMARIZE_ERR;
194    exit(0);
195    return 0;
196}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed