1 /* $Id$ */
2 /* routine drop i/o caches */
3 #define _FILE_OFFSET_BITS 64
4 #include "typesf2c.h"
5 #ifdef __linux__
6 #define _XOPEN_SOURCE 600
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <unistd.h>
10 #include <fcntl.h>
11 #endif
12 #if  defined(POSIX_FADV_DONTNEED)
13 #include "ga.h"
14 #include "macdecls.h"
15 
16 Integer fortchar_to_string(const char *, Integer, char *, const Integer);
17 void FATR util_fadvise(const char *, int);
18 
util_fadvise_dontneed_(const char * fort_fname,int flen)19 void FATR util_fadvise_dontneed_(const char *fort_fname,  int flen){
20     char buf[1024];
21     if (!fortchar_to_string(fort_fname, flen, buf, sizeof(buf)))
22       GA_Error("util_fadvise: fortchar_to_string failed for fname",0);
23 
24   (void) FATR util_fadvise(buf, POSIX_FADV_DONTNEED);
25 }
26 
util_fadvise_noreuse_(const char * fort_fname,int flen)27 void FATR util_fadvise_noreuse_(const char *fort_fname,  int flen){
28     char buf[1024];
29     if (!fortchar_to_string(fort_fname, flen, buf, sizeof(buf)))
30       GA_Error("util_fadvise: fortchar_to_string failed for fname",0);
31 
32   (void) FATR util_fadvise(buf, POSIX_FADV_NOREUSE);
33 }
34 
35 
36 
util_fadvise(const char * buf,int mode)37 void FATR util_fadvise(const char *buf, int mode){
38 
39     int fd = open(buf, O_RDWR);
40 
41     //    printf(" fadvise fd %d fname %s\n", fd, fort_fname);
42     struct stat fd_stat ;
43 
44     if ( fstat( fd, &fd_stat ) < 0 ) {
45         perror( "Could not stat file: " );
46         return;
47     }
48     off_t offset = 0;
49     off_t length = fd_stat.st_size;
50 
51 
52     /*    (void) fdatasync(fd);*/
53     if(posix_fadvise( fd,  offset, length, mode)!=0) perror("fadvise");
54     close(fd);
55 
56 }
57 #else
58 /* stubs */
util_fadvise_dontneed_(const char * fort_fname,int flen)59 void FATR util_fadvise_dontneed_(const char *fort_fname,  int flen){
60 }
util_fadvise_noreuse_(const char * fort_fname,int flen)61 void FATR util_fadvise_noreuse_(const char *fort_fname,  int flen){
62 }
63 #endif
64