#include "base/cs_defs.h"
Go to the source code of this file.
Typedefs | |
typedef struct _cs_file_t | cs_file_t |
typedef long | cs_file_off_t |
Functions | |
cs_file_t * | cs_file_open (const char *name, cs_file_mode_t mode, cs_file_access_t method) |
Create a file descriptor and open the associated file. | |
cs_file_t * | cs_file_open_default (const char *name, cs_file_mode_t mode) |
Create a file descriptor and open the associated file, using the default file communicator and access method. | |
cs_file_t * | cs_file_open_serial (const char *name, cs_file_mode_t mode) |
Create a file descriptor and open the associated file, using the serial IO on the root rank. | |
cs_file_t * | cs_file_free (cs_file_t *f) |
Destroy a file descriptor and close the associated file. | |
void | cs_file_in_memory_transfer_data (cs_file_t *f, size_t nb, void *data) |
Transfer a block of data to file in memory. | |
const char * | cs_file_get_name (const cs_file_t *f) |
Return a file's name. | |
void * | cs_file_in_memory_get_data (cs_file_t *f) |
Get pointer to data for file in memory. | |
void | cs_file_set_allow_read_global_eof (cs_file_t *f, bool allow_eof) |
void | cs_file_set_big_endian (cs_file_t *f) |
Ensure that data is read or written in big-endian (network standard) format. | |
int | cs_file_get_swap_endian (const cs_file_t *f) |
Return a file's byte-swapping behavior. | |
void | cs_file_set_swap_endian (cs_file_t *f, int swap) |
Set a file's byte-swapping behavior. | |
size_t | cs_file_read_global (cs_file_t *f, void *buf, size_t size, size_t ni) |
Read global data from a file, distributing it to all processes associated with that file. | |
size_t | cs_file_write_global (cs_file_t *f, const void *buf, size_t size, size_t ni) |
Write global data to a file. | |
size_t | cs_file_read_block (cs_file_t *f, void *buf, size_t size, size_t stride, cs_gnum_t global_num_start, cs_gnum_t global_num_end) |
Read data to a buffer, distributing a contiguous part of it to each process associated with a file. | |
size_t | cs_file_write_block (cs_file_t *f, const void *buf, size_t size, size_t stride, cs_gnum_t global_num_start, cs_gnum_t global_num_end) |
Write data to a file, each associated process providing a contiguous part of this data. | |
size_t | cs_file_write_block_buffer (cs_file_t *f, void *buf, size_t size, size_t stride, cs_gnum_t global_num_start, cs_gnum_t global_num_end) |
Write data to a file, each associated process providing a contiguous part of this data. | |
int | cs_file_seek (cs_file_t *f, cs_file_off_t offset, cs_file_seek_t whence) |
Update the file pointer according to whence. | |
cs_file_off_t | cs_file_tell (cs_file_t *f) |
Return the position of the file pointer. | |
char * | cs_file_gets (char *s, const int size, const cs_file_t *f, int *line) |
Formatted input from a text file (as fgets()). | |
char * | cs_file_gets_try (char *s, const int size, const cs_file_t *f, int *line) |
Formatted input from a text file if possible (as fgets()). | |
void | cs_file_dump (const cs_file_t *f) |
Dump the metadata of a file structure in human readable form. | |
void | cs_file_free_defaults (void) |
Free the default options for file access. | |
void | cs_file_get_default_access (cs_file_mode_t mode, cs_file_access_t *method) |
Get the default options for file access. | |
void | cs_file_set_default_access (cs_file_mode_t mode, cs_file_access_t method) |
Set the default options for file access. | |
cs_file_mpi_positioning_t | cs_file_get_mpi_io_positioning (void) |
Get the positioning method for MPI-IO. | |
void | cs_file_set_mpi_io_positioning (cs_file_mpi_positioning_t positioning) |
Set the positioning method for MPI-IO. | |
void | cs_file_defaults_info (void) |
Print information on default options for file access. | |
int | cs_file_mkdir_default (const char *path) |
Create a new directory using default permissions. | |
int | cs_file_isreg (const char *path) |
Check if a file exists and is a regular file. | |
int | cs_file_isdir (const char *path) |
Check if a directory exists. | |
char ** | cs_file_listdir (const char *path) |
List files inside a directory. | |
cs_file_off_t | cs_file_size (const char *path) |
Return the size of a file. | |
int | cs_file_remove (const char *path) |
Remove a file if it exists and is a regular file or an empty directory. | |
int | cs_file_endswith (const char *path, const char *end) |
Check if file name/path ends with a specific string. |
Variables | |
const char * | cs_file_access_name [] |
const char * | cs_file_mpi_positioning_name [] |
typedef long cs_file_off_t |
Offset for file position indicator
typedef struct _cs_file_t cs_file_t |
File descriptor (opaque object)
enum cs_file_access_t |
enum cs_file_mode_t |
enum cs_file_seek_t |
void cs_file_defaults_info | ( | void | ) |
Print information on default options for file access.
void cs_file_dump | ( | const cs_file_t * | f | ) |
Dump the metadata of a file structure in human readable form.
[in] | f | cs_file_t descriptor |
int cs_file_endswith | ( | const char * | path, |
const char * | end ) |
Check if file name/path ends with a specific string.
The function returns an int: 1 if the file name ends with the given string, 0 otherwise.
[in] | path | name of file |
[in] | end | end string to test |
Destroy a file descriptor and close the associated file.
[in,out] | f | file descriptor to destroy |
void cs_file_free_defaults | ( | void | ) |
Free the default options for file access.
void cs_file_get_default_access | ( | cs_file_mode_t | mode, |
cs_file_access_t * | method ) |
Get the default options for file access.
[in] | mode | file mode for which the default is queried (write and append use the same method, and are interchangeable here) |
[out] | method | default file access method, or nullptr |
cs_file_mpi_positioning_t cs_file_get_mpi_io_positioning | ( | void | ) |
Get the positioning method for MPI-IO.
For details, see cs_file_set_mpi_io_positioning.
const char * cs_file_get_name | ( | const cs_file_t * | f | ) |
int cs_file_get_swap_endian | ( | const cs_file_t * | f | ) |
Return a file's byte-swapping behavior.
[in] | f | cs_file_t descriptor |
char * cs_file_gets | ( | char * | s, |
const int | size, | ||
const cs_file_t * | f, | ||
int * | line ) |
Formatted input from a text file (as fgets()).
[out] | s | buffer to which string is to be read. |
[in] | size | maximum number of characters to be read plus one. |
[in] | f | ecs_file_t descriptor. |
[in,out] | line | file line number if available, or null. |
[out] | s | buffer to which string is to be read. |
[in] | size | maximum number of characters to be read plus one. |
[in] | f | ecs_file_t descriptor. |
[in,out] | line | file line number if available, or nullptr. |
char * cs_file_gets_try | ( | char * | s, |
const int | size, | ||
const cs_file_t * | f, | ||
int * | line ) |
Formatted input from a text file if possible (as fgets()).
This function is similar to cs_file_gets(), but failure to read a line due to an end-of-file condition is not considered an error with this variant, which may be used to read text files or sections thereof of unknown length.
[out] | s | buffer to which string is to be read. |
[in] | size | maximum number of characters to be read plus one. |
[in] | f | cs_file_t descriptor. |
[in,out] | line | file line number if available, or null. |
This function is similar to cs_file_gets(), but failure to read a line due to an end-of-file condition is not considered an error with this variant, which may be used to read text files or sections thereof of unknown length.
[out] | s | buffer to which string is to be read. |
[in] | size | maximum number of characters to be read plus one. |
[in] | f | cs_file_t descriptor. |
[in,out] | line | file line number if available, or nullptr. |
void * cs_file_in_memory_get_data | ( | cs_file_t * | f | ) |
Get pointer to data for file in memory.
[in] | f | cs_file_t descriptor |
void cs_file_in_memory_transfer_data | ( | cs_file_t * | f, |
size_t | nb, | ||
void * | data ) |
Transfer a block of data to file in memory.
Only for files opened using CS_FILE_IN_MEMORY_SERIAL.
[in] | f | cs_file_t descriptor |
[in] | nb | number of matching bytes for data |
[in] | data | data buffer (ownership is relinquished by caller) |
int cs_file_isdir | ( | const char * | path | ) |
Check if a directory exists.
[in] | path | directory path. |
int cs_file_isreg | ( | const char * | path | ) |
Check if a file exists and is a regular file.
[in] | path | file path. |
char ** cs_file_listdir | ( | const char * | path | ) |
List files inside a directory.
The array returned must be freed by the caller using CS_FREE, as well as the individual entries in the array.
[in] | path | name of directory. |
int cs_file_mkdir_default | ( | const char * | path | ) |
Create a new directory using default permissions.
This function is similar to the POSIX function mkdir(), except that it has no "mode" argument: by default, on a POSIX type system, permissions include read, write, and execute access for the user, group and others, modified by the users umask value (so with a typical configuration, the user will have read, write, and execute pemission, the group and others will only have read and execute permission, but this behavior may be modified).
Also, contrary to the usual mkdir(), if the directory already exists (and is truly a directory), this is considered a success and not a failure, and 0 is returned: the aim of this function is to make a directory available, so if it already exists, this is considered acceptable.
[in] | path | name of new directory. |
cs_file_t * cs_file_open | ( | const char * | name, |
cs_file_mode_t | mode, | ||
cs_file_access_t | method ) |
Create a file descriptor and open the associated file.
By default, data is written or read as native data. This behavior may be modified by cs_file_set_swap_endian().
[in] | name | file name |
[in] | mode | file access mode: read, write, or append |
[in] | method | file access method (currently only C standard-IO when built without MPI) |
[in] | hints | associated hints for MPI-IO, or MPI_INFO_NULL |
[in] | block_comm | handle to MPI communicator used for distributed file block access (may be a subset of comm if some ranks do not directly access distributed data blocks) |
[in] | comm | handle to main MPI communicator |
cs_file_t * cs_file_open_default | ( | const char * | name, |
cs_file_mode_t | mode ) |
Create a file descriptor and open the associated file, using the default file communicator and access method.
By default, data is written or read as native data. This behavior may be modified by cs_file_set_swap_endian().
[in] | name | file name |
[in] | mode | file access mode: read, write, or append |
cs_file_t * cs_file_open_serial | ( | const char * | name, |
cs_file_mode_t | mode ) |
Create a file descriptor and open the associated file, using the serial IO on the root rank.
By default, data is written or read as native data. This behavior may be modified by cs_file_set_swap_endian().
[in] | name | file name |
[in] | mode | file access mode: read, write, or append |
By default, data is written or read as native data. This behavior may be modified by cs_file_set_swap_endian().
[in] | name | file name |
[in] | mode | file access mode: read, write, or append |
size_t cs_file_read_block | ( | cs_file_t * | f, |
void * | buf, | ||
size_t | size, | ||
size_t | stride, | ||
cs_gnum_t | global_num_start, | ||
cs_gnum_t | global_num_end ) |
Read data to a buffer, distributing a contiguous part of it to each process associated with a file.
Each process should receive a (possibly empty) block of the data, and we should have: global_num_start at rank 0 = 1 global_num_start at rank i+1 = global_num_end at rank i. Otherwise, behavior (especially positioning for future reads) is undefined.
[in] | f | cs_file_t descriptor |
[out] | buf | pointer to location receiving data |
[in] | size | size of each item of data in bytes |
[in] | stride | number of (interlaced) values per block item |
[in] | global_num_start | global number of first block item (1 to n numbering) |
[in] | global_num_end | global number of past-the end block item (1 to n numbering) |
size_t cs_file_read_global | ( | cs_file_t * | f, |
void * | buf, | ||
size_t | size, | ||
size_t | ni ) |
Read global data from a file, distributing it to all processes associated with that file.
[in] | f | cs_file_t descriptor |
[out] | buf | pointer to location receiving data |
[in] | size | size of each item of data in bytes |
[in] | ni | number of items to read |
int cs_file_remove | ( | const char * | path | ) |
Remove a file if it exists and is a regular file or an empty directory.
[in] | path | file path. |
int cs_file_seek | ( | cs_file_t * | f, |
cs_file_off_t | offset, | ||
cs_file_seek_t | whence ) |
Update the file pointer according to whence.
[in,out] | f | cs_file_t descriptor |
[in] | offset | add to position specified to whence to obtain new position, measured in characters from the beginning of the file |
[in] | whence | beginning if CS_FILE_SEEK_SET, current if CS_FILE_SEEK_CUR, or end-of-file if CS_FILE_SEEK_END |
void cs_file_set_big_endian | ( | cs_file_t * | f | ) |
Ensure that data is read or written in big-endian (network standard) format.
[in,out] | f | cs_file_t descriptor |
void cs_file_set_default_access | ( | cs_file_mode_t | mode, |
cs_file_access_t | method ) |
Set the default options for file access.
If the method given contains incompatible values, such as when setting MPI-IO methods when MPI-IO is not available, a "reasonable" default is used instead.
[in] | mode | file mode for which the default is being set (write and append use the same method, and are interchangeable here) |
[in] | method | default access method to set |
void cs_file_set_mpi_io_positioning | ( | cs_file_mpi_positioning_t | positioning | ) |
Set the positioning method for MPI-IO.
It is not always known whether a performance or robustness difference is to be expected using explicit file offsets or individual file pointers. Perusal of a sampling of ROMIO code would seem to indicate that no difference is to be expected, but this might change with MPI IO variants or file systems, so this advanced setting is made possible.
This setting is not available on a per-file basis, though this could be done in the future in the unexpected case of performance results showing this would be useful.
[in] | positioning | chosen positioning method for MPI-IO |
void cs_file_set_swap_endian | ( | cs_file_t * | f, |
int | swap ) |
Set a file's byte-swapping behavior.
[in,out] | f | cs_file_t descriptor |
[in] | swap | 1 if bytes must be swapped, 0 otherwise |
cs_file_off_t cs_file_size | ( | const char * | path | ) |
Return the size of a file.
If the file does not exist, 0 is returned.
Note also that for some special files, such as files in the Linux /proc directory, this may return 0.
[in] | path | file path. |
cs_file_off_t cs_file_tell | ( | cs_file_t * | f | ) |
Return the position of the file pointer.
In parallel, we consider the file pointer to be equal to the highest value of the individual file pointers.
[in] | f | cs_file_t descriptor |
size_t cs_file_write_block | ( | cs_file_t * | f, |
const void * | buf, | ||
size_t | size, | ||
size_t | stride, | ||
cs_gnum_t | global_num_start, | ||
cs_gnum_t | global_num_end ) |
Write data to a file, each associated process providing a contiguous part of this data.
Each process should provide a (possibly empty) block of the data, and we should have: global_num_start at rank 0 = 1 global_num_start at rank i+1 = global_num_end at rank i. Otherwise, behavior (especially positioning for future reads) is undefined.
This function may require an internal copy of the data to ensure that the buffer contents are not modified, so if the buffer contents are temporary values, to be deleted after writing, using cs_file_write_block_buffer() instead may be used to avoid an unneeded memory allocation and copy.
[in] | f | cs_file_t descriptor |
[in] | buf | pointer to location containing data |
[in] | size | size of each item of data in bytes |
[in] | stride | number of (interlaced) values per block item |
[in] | global_num_start | global number of first block item (1 to n numbering) |
[in] | global_num_end | global number of past-the end block item (1 to n numbering) |
size_t cs_file_write_block_buffer | ( | cs_file_t * | f, |
void * | buf, | ||
size_t | size, | ||
size_t | stride, | ||
cs_gnum_t | global_num_start, | ||
cs_gnum_t | global_num_end ) |
Write data to a file, each associated process providing a contiguous part of this data.
Each process should provide a (possibly empty) block of the data, and we should have: global_num_start at rank 0 = 1 global_num_start at rank i+1 = global_num_end at rank i. Otherwise, behavior (especially positioning for future reads) is undefined.
This function is intended to be used mainly data that is already a copy of original data (such as data that has been redistributed across processors just for the sake of output), or that is to be deleted after writing, so it may modify the values in its input buffer (notably to convert from little-endian to big-endian of vice-versa if necessary).
[in] | f | cs_file_t descriptor |
[in,out] | buf | pointer to location containing data |
[in] | size | size of each item of data in bytes |
[in] | stride | number of (interlaced) values per block item |
[in] | global_num_start | global number of first block item (1 to n numbering) |
[in] | global_num_end | global number of past-the end block item (1 to n numbering) |
size_t cs_file_write_global | ( | cs_file_t * | f, |
const void * | buf, | ||
size_t | size, | ||
size_t | ni ) |
Write global data to a file.
Under MPI, data is only written by the associated communicator's root rank. The buffers on other ranks are ignored, though the file offset is updated (i.e. the call to this function is collective).
[in] | f | cs_file_t descriptor |
[in] | buf | pointer to location containing data |
[in] | size | size of each item of data in bytes |
[in] | ni | number of items to write |
|
extern |
|
extern |