SIONlib  1.7.0
Scalable I/O library for parallel access to task-local files
sion_cache.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_cache.h"
26 
27 
28 #if defined(_SION_LINUX)
29 #include <sys/mman.h>
30 #elif defined(_SION_AIX)
31 #elif defined(_SION_BGL)
32 #elif defined(_SION_BGP)
33 #elif defined(_SION_XT)
34 #include <sys/types.h>
35 #include <sys/mman.h>
36 #include <fcntl.h> /* For O_* constants */
37 #endif
38 
39 
61  const char *t;
62  int rc = SION_SUCCESS;
63 
64  t = _sion_getenv("SION_CACHESIZE");
65  if(t) {
66  sion_filedesc->usecache=1;
67  sion_filedesc->cachesize=atoi(t);
68  sion_filedesc->flag1 |= _SION_FLAG1_USECACHE;
69  }
70  DPRINTFP((2, "_sion_cache_check_env", -1, "usecache=%d cachesize=%d flag1=%d\n", sion_filedesc->usecache, sion_filedesc->cachesize, sion_filedesc->flag1));
71 
72  return (rc);
73 }
74 
75 
82 int _sion_cache_init(_sion_filedesc *sion_filedesc) {
83  int rc = SION_SUCCESS;
84 
85  /* allocation */
86  if(sion_filedesc->usecache) {
87  if(sion_filedesc->mode == SION_FILEMODE_WRITE) {
88 #if defined(_SION_LINUX)
89  rc=_sion_cache_create_linux(sion_filedesc);
90 #elif defined(_SION_AIX)
91 #elif defined(_SION_BGL)
92 #elif defined(_SION_BGP)
93 #elif defined(_SION_XT)
94 #endif
95  } else if(sion_filedesc->mode == SION_FILEMODE_READ) {
96 #if defined(_SION_LINUX)
97  rc=_sion_cache_load_linux(sion_filedesc);
98 #elif defined(_SION_AIX)
99 #elif defined(_SION_BGL)
100 #elif defined(_SION_BGP)
101 #elif defined(_SION_XT)
102 #endif
103  } else {
104  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_cache_init: unknown SION mode\n");
105  }
106  }
107 
108  return (rc);
109 }
110 
111 
118 int _sion_cache_destroy(_sion_filedesc *sion_filedesc) {
119  int rc = SION_SUCCESS;
120 
121  /* deallocation */
122  if(sion_filedesc->usecache) {
123 #if defined(_SION_LINUX)
124  rc=_sion_cache_destroy_linux(sion_filedesc);
125 #elif defined(_SION_AIX)
126 #elif defined(_SION_BGL)
127 #elif defined(_SION_BGP)
128 #elif defined(_SION_XT)
129 #endif
130  }
131 
132  return (rc);
133 }
134 
142  int rc = SION_SUCCESS;
143 
144  /* #NODIST# */
145 #ifdef _SION_CACHE
146 
147 #if defined(_SION_LINUX) && (!defined(_SION_XT))
148  int shmfd;
149  char* shmptr;
150 
151  if(sion_filedesc->rank>0) sprintf(sion_filedesc->cachefn,"sion_%07d",sion_filedesc->rank);
152  else sprintf(sion_filedesc->cachefn,"sion_%07d",0);
153 
154  /* creating the shared memory object -- shm_open() */
155  shmfd = shm_open(sion_filedesc->cachefn, O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG);
156  if (shmfd < 0) {
157  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_cache_create_linux: could not create segment\n");
158  }
159  DPRINTFP((2, "_sion_cache_create_linux", -1, "after shm_open %s shmfd=%d\n", sion_filedesc->cachefn, shmfd));
160 
161  /* adjusting mapped file size (make room for the whole segment to map) -- ftruncate() */
162  ftruncate(shmfd, sion_filedesc->cachesize);
163 
164  /* requesting the shared segment -- mmap() */
165  shmptr = (char *)mmap(NULL, sion_filedesc->cachesize, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
166  if (shmptr == NULL) {
167  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_cache_create_linux: could not mmap segment\n");
168  }
169  DPRINTFP((2, "_sion_cache_create_linux", -1, "after mmap %d bytes\n", sion_filedesc->cachesize));
170 
171  sion_filedesc->cacheid=shmfd;
172  sion_filedesc->cacheptr=shmptr;
173 #endif
174 
175 #endif
176  /* #NODIST# */
177  return(rc);
178 }
179 
187  int rc = SION_SUCCESS;
188  /* #NODIST# */
189 #ifdef _SION_CACHE
190 
191 #if defined(_SION_LINUX) && (!defined(_SION_XT))
192  int shmfd;
193  char* shmptr;
194 
195  if(sion_filedesc->rank>0) sprintf(sion_filedesc->cachefn,"sion_%07d",sion_filedesc->rank);
196  else sprintf(sion_filedesc->cachefn,"sion_%07d",0);
197 
198  /* creating the shared memory object -- shm_open() */
199  shmfd = shm_open(sion_filedesc->cachefn, O_RDWR, S_IRWXU | S_IRWXG);
200  if (shmfd < 0) {
201  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_cache_losd_linux: could not load segment\n");
202  }
203  DPRINTFP((2, "_sion_cache_create_linux", -1, "after shm_open %s shmfd=%d\n", sion_filedesc->cachefn, shmfd));
204 
205  /* adjusting mapped file size (make room for the whole segment to map) -- ftruncate() */
206  ftruncate(shmfd, sion_filedesc->cachesize);
207 
208  /* requesting the shared segment -- mmap() */
209  shmptr = (char *)mmap(NULL, sion_filedesc->cachesize, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
210  if (shmptr == NULL) {
211  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_cache_create_linux: could not mmap segment\n");
212  }
213  DPRINTFP((2, "_sion_cache_create_linux", -1, "after mmap %d bytes\n", sion_filedesc->cachesize));
214 
215  sion_filedesc->cacheid=shmfd;
216  sion_filedesc->cacheptr=shmptr;
217 #endif
218 
219 #endif
220  /* #NODIST# */
221 
222  return(rc);
223 }
224 
225 
233  int rc = SION_SUCCESS;
234 
235  /* #NODIST# */
236 #ifdef _SION_CACHE
237 
238 #if defined(_SION_LINUX) && (!defined(_SION_XT))
239  /* destroy shared memory object -- shm_unlink() */
240  if (shm_unlink(sion_filedesc->cachefn) != 0) {
241  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_cache_destroy_linux: could not destroy segment\n");
242  }
243 
244  sion_filedesc->cacheid=-1;
245  sion_filedesc->cacheptr=NULL;
246 #endif
247 
248 #endif
249  /* #NODIST# */
250 
251  return(rc);
252 }
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
char * _sion_getenv(const char *name)
#define SION_FILEMODE_READ
Definition: sion_filedesc.h:33
char cachefn[SION_CACHE_FNLEN]
int _sion_cache_check_env(_sion_filedesc *sion_filedesc)
Check if environment variables are set to use cache.
Definition: sion_cache.c:60
#define SION_FILEMODE_WRITE
Definition: sion_filedesc.h:34
#define _SION_FLAG1_USECACHE
Definition: sion_filedesc.h:20
int _sion_cache_destroy_linux(_sion_filedesc *sion_filedesc)
Deallocate cache for linux.
Definition: sion_cache.c:232
int _sion_cache_create_linux(_sion_filedesc *sion_filedesc)
Allocate cache for linux.
Definition: sion_cache.c:141
int _sion_cache_load_linux(_sion_filedesc *sion_filedesc)
Load an already allocated cache for linux.
Definition: sion_cache.c:186
int _sion_cache_destroy(_sion_filedesc *sion_filedesc)
Deallocate the cache.
Definition: sion_cache.c:118
int _sion_cache_init(_sion_filedesc *sion_filedesc)
Allocate and initalize the cache.
Definition: sion_cache.c:82