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