void process_list(size_t number) { char *list1 = (char*) malloc(number); char *list2; list2 = (char*) malloc(number); if (list2 == NULL) { /* Handle Allocation Error */ } if (verify_size(list2, number) == -1) { /* Handle Error */ } /* Continue Processing list */ free(list1); free(list2); }
FC_FUNC( mpi_init_fort , MPI_INIT_FORT) (int *f_MPI_COMM_WORLD, int *f_MPI_ANY_SOURCE, int *f_MPI_ANY_TAG, int *f_MPI_PROC_NULL, int *f_MPI_ROOT, int *f_MPI_COMM_NULL, int *f_MPI_REQUEST_NULL, int *f_MPI_GROUP_NULL, int *f_MPI_GROUP_EMPTY, int *f_MPI_UNDEFINED, int *f_MPI_MAX_ERROR_STRING, int *f_MPI_MAX_PROCESSOR_NAME, int *f_MPI_STATUS_SIZE, int *f_MPI_SOURCE, int *f_MPI_TAG, int *f_MPI_ERROR, int *f_status, int *fsource, int *ftag, int *ferror, int *f_MPI_INTEGER, void *fint1, void *fint2, int *f_MPI_LOGICAL, void *flog1, void *flog2, int *f_MPI_REAL, void *freal1, void *freal2, int *f_MPI_DOUBLE_PRECISION, void *fdub1, void *fdub2, int *f_MPI_COMPLEX, void *fcomp1, void *fcomp2, int *ierror) { int err; int size; int offset; *ierror=MPI_Init(NULL,NULL); err=0; /* * These 3 macros compare things from mpif.h (as passed in by the f_ * arguments) to the values in C (from #including mpi.h). * * Unfortunately, this kind of thing is done most easily in a nasty * looking macto. * */ /* * verify_eq * compare value of constants in C and fortran * i.e. compare *f_<name> to <name> */ #define verify_eq(name) \ if (*f_##name != name) \ { fprintf(stderr,"mpi-serial: mpi_init_fort: %s not consistant " \ "between mpif.h (%d) and mpi.h (%d)\n",\ #name,*f_##name,name); \ err=1; } #define verify_eq_warn(name) \ if (*f_##name != name) \ { fprintf(stderr,"mpi-serial: mpi_init_fort: warning: %s not consistant " \ "between mpif.h (%d) and mpi.h (%d)\n",\ #name,*f_##name,name); \ } /* * verify_size * verify that the type name in fortran has the correct * value (i.e. the size of that data type). * Determine size by subtracting the pointer values of two * consecutive array locations. */ #define verify_size(name,p1,p2) \ if ( (size=((char *)(p2) - (char *)(p1))) != *f_##name ) \ { fprintf(stderr,"mpi-serial: mpi_init_fort: mpif.h %s (%d) " \ "does not match actual fortran size (%d)\n", \ #name,*f_##name,size); \ err=1; } /* * verify_field * check the struct member offsets for MPI_Status vs. the * fortan integer array offsets. E.g. the location of * status->MPI_SOURCE should be the same as STATUS(MPI_SOURCE) */ #define verify_field(name) \ { offset= (char *)&((MPI_Status *)f_status)->name - (char *)f_status; \ if ( offset != (*f_##name-1)*sizeof(int) ) \ { fprintf(stderr,"mpi-serial: mpi_init_fort: mpif.h %s (%d) (%d bytes) " \ "is inconsistant w/offset in MPI_Status (%d bytes)\n", \ #name,*f_##name,(*f_##name-1)*sizeof(int),offset); \ err=1; }} verify_eq(MPI_COMM_WORLD); verify_eq(MPI_ANY_SOURCE); verify_eq(MPI_ANY_TAG); verify_eq(MPI_PROC_NULL); verify_eq(MPI_ROOT); verify_eq(MPI_COMM_NULL); verify_eq(MPI_REQUEST_NULL); verify_eq(MPI_GROUP_NULL); verify_eq(MPI_GROUP_EMPTY); verify_eq(MPI_UNDEFINED); verify_eq(MPI_MAX_ERROR_STRING); verify_eq(MPI_MAX_PROCESSOR_NAME); verify_eq(MPI_STATUS_SIZE); verify_field(MPI_SOURCE); verify_field(MPI_TAG); verify_field(MPI_ERROR); verify_eq(MPI_INTEGER); verify_size(MPI_INTEGER,fint1,fint2); verify_size(MPI_LOGICAL,flog1,flog2); verify_eq_warn(MPI_REAL); verify_size(MPI_REAL,freal1,freal2); verify_eq(MPI_DOUBLE_PRECISION); verify_size(MPI_DOUBLE_PRECISION,fdub1,fdub2); verify_size(MPI_COMPLEX,fcomp1,fcomp2); if (err) abort(); }
int main( int argc, char *argv[]) { int c; int error; dm_off_t size; char *fsname; dm_sessid_t sid; void *fs_hanp; size_t fs_hlen; char *sizep = "0"; Progname = argv[0]; size = 0; while ((c = getopt(argc, argv, "s:")) != EOF) { switch (c) { case 's': sizep = optarg; break; case '?': default: usage(Progname); exit(1); } } if (optind >= argc) { usage(Progname); exit(1); } /* * Verify the input size string is legit */ error = verify_size(sizep, &size); if (error) exit(1); fsname = argv[optind]; /* * Now we have our filesystem name and possibly a size threshold * to look for. Init the dmapi, and get a filesystem handle so * we can scan the filesystem */ error = setup_dmapi(&sid); if (error) exit(1); if (dm_path_to_fshandle(fsname, &fs_hanp, &fs_hlen) == -1) { errno_msg("Can't get filesystem handle"); exit(1); } /* * Get the attributes of all files in the filesystem */ error = scan_fs(sid, fs_hanp, fs_hlen, size); if (error) exit(1); /* * We're done, so we can shut down our session. */ if (dm_destroy_session(sid) == -1) { errno_msg("Can't close session"); exit(1); } return(0); }