SIONlib  1.7.1
Scalable I/O library for parallel access to task-local files
sion_buffer.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <time.h>
13 #include <assert.h>
14 
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <fcntl.h>
18 #include <unistd.h>
19 
20 
21 #include "sion.h"
22 #include "sion_debug.h"
23 #include "sion_error_handler.h"
24 #include "sion_internal.h"
25 #include "sion_buffer.h"
26 
27 
28 #if defined(_SION_LINUX)
29 #elif defined(_SION_AIX)
30 #elif defined(_SION_BGL)
31 #elif defined(_SION_BGP)
32 #elif defined(_SION_XT)
33 #endif
34 
35 
50 #define DFUNCTION "_sion_buffer_check_env"
51 
58  const char *t;
59  int rc = SION_SUCCESS;
60  t = _sion_getenv("SION_BUFFERSIZE");
61  if(t) {
62  sion_filedesc->buffer_size=atoi(t);
63  if(sion_filedesc->buffer_size == -1) sion_filedesc->buffer_size=sion_filedesc->fsblksize;
64  }
65  DPRINTFP((2, DFUNCTION, -1, "buffersize=%d\n", sion_filedesc->buffer_size));
66  _sion_buffer_init(sion_filedesc);
67  return (rc);
68 }
69 #undef DFUNCTION
70 
71 #define DFUNCTION "_sion_buffer_init"
72 
78 int _sion_buffer_init(_sion_filedesc *sion_filedesc) {
79  int rc = SION_SUCCESS;
80 
81  /* allocation */
82  if(sion_filedesc->buffer_size>0) {
83  sion_filedesc->buffer = (char *) malloc(sion_filedesc->buffer_size);
84  if (sion_filedesc->buffer == NULL) {
85  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_buffer_init: cannot allocate internal buffer of size %lu , aborting ...\n", (unsigned long) sion_filedesc->buffer_size));
86  }
87  sion_filedesc->usebuffer=1;
88  DPRINTFP((2, DFUNCTION, -1, "buffer with size=%d allocated\n", sion_filedesc->buffer_size));
89  }
90  return (rc);
91 }
92 #undef DFUNCTION
93 
94 #define DFUNCTION "_sion_buffer_push"
95 
103 sion_int64 _sion_buffer_push(_sion_filedesc *sion_filedesc,
104  const void *data, sion_int64 bytes) {
105  sion_int64 bytes_free;
106  sion_int64 bytes_stored;
107  ONLY_DEBUG(sion_int64 bytes_not_stored;)
108  /* allocation */
109  bytes_free=sion_filedesc->buffer_size-sion_filedesc->buffer_ptr;
110  if(bytes<bytes_free) { /* data fits in buffer */
111  bytes_stored=bytes;
112  ONLY_DEBUG(bytes_not_stored=0;)
113  } else {
114  bytes_stored=bytes_free;
115  ONLY_DEBUG(bytes_not_stored=bytes-bytes_stored;)
116  }
117  if(bytes_stored>0) {
118  memcpy(sion_filedesc->buffer+sion_filedesc->buffer_ptr,data,bytes_stored);
119  sion_filedesc->buffer_ptr+=bytes_stored;
120  }
121 
122  DPRINTFP((2, DFUNCTION, -1, "pushed %d of %d bytes into buffer -> ptr=%d ret=%d\n",
123  (int) bytes_stored,(int) bytes,
124  (int) sion_filedesc->buffer_ptr, (int) bytes_not_stored));
125  return (bytes_stored);
126 }
127 #undef DFUNCTION
128 
129 #define DFUNCTION "_sion_buffer_get_data_ptr"
130 
140  void **data, sion_int64 *bytes) {
141  int flag = 0;
142 
143  /* pointer to and size of actual buffer contents */
144  *data=sion_filedesc->buffer;
145  *bytes=sion_filedesc->buffer_ptr;
146  flag=(*bytes>0);
147 
148  /* empty buffer */
149  sion_filedesc->buffer_ptr=0;
150  DPRINTFP((2, DFUNCTION, -1, "returns data ptr to %d bytes, flag=%d\n",
151  (int) *bytes, flag));
152 
153  return (flag);
154 }
155 #undef DFUNCTION
156 
157 #define DFUNCTION "_sion_buffer_flush"
158 
164 int _sion_buffer_flush(_sion_filedesc *sion_filedesc) {
165  sion_int64 bbytes, frc, byteswritten;
166  void *bdata;
167 
168 
169  DPRINTFP((1, DFUNCTION, -1, "enter\n"));
170 
171  _sion_flush_block(sion_filedesc);
172 
173  byteswritten = sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
174 
175  _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
176 
177  if ((byteswritten + bbytes) > sion_filedesc->chunksize) {
178  /* not enough space for writing next data */
179  _sion_create_new_block(sion_filedesc);
180  }
181 
182  frc = _sion_file_write(bdata, bbytes, sion_filedesc->fileptr);
183  if(frc != bbytes) {
184  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
185  "could not write data (%d bytes) to file (sid=%d) ...", (int) bbytes, sion_filedesc->sid));
186  }
187  sion_filedesc->currentpos+=bbytes;
188 
189  DPRINTFP((2, DFUNCTION, -1, "leave\n"));
190 
191  return (SION_SUCCESS);
192 }
193 #undef DFUNCTION
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
Definition: sion_file.c:148
int _sion_buffer_flush(_sion_filedesc *sion_filedesc)
Flush buffer.
Definition: sion_buffer.c:164
int _sion_flush_block(_sion_filedesc *sion_filedesc)
Update the internal data structure.
int _sion_buffer_get_data_ptr(_sion_filedesc *sion_filedesc, void **data, sion_int64 *bytes)
Pop all data from buffer.
Definition: sion_buffer.c:139
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
int _sion_buffer_init(_sion_filedesc *sion_filedesc)
Allocate and initalize the buffer.
Definition: sion_buffer.c:78
sion_int64 _sion_buffer_push(_sion_filedesc *sion_filedesc, const void *data, sion_int64 bytes)
Push data to buffer.
Definition: sion_buffer.c:103
char * _sion_getenv(const char *name)
int _sion_buffer_check_env(_sion_filedesc *sion_filedesc)
Checks if environment variables are set to use buffer.
Definition: sion_buffer.c:57
sion_int64 * blocksizes
Definition: sion_filedesc.h:98
sion_int32 currentblocknr
Definition: sion_filedesc.h:95
int _sion_create_new_block(_sion_filedesc *sion_filedesc)
Create a new block for the internal data structure.
_sion_fileptr * fileptr
Definition: sion_filedesc.h:80