1 /******************************************************************************
2  *
3  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
4  * Use is subject to license terms.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation;
9  * version 2.1 of the License.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "xc_private.h"
21 
22 /* Optionally flush file to disk and discard page cache */
discard_file_cache(xc_interface * xch,int fd,int flush)23 void discard_file_cache(xc_interface *xch, int fd, int flush)
24 {
25     off_t cur = 0;
26     int saved_errno = errno;
27 
28     if ( flush && (fsync(fd) < 0) )
29         goto out;
30 
31     /*
32      * Calculate last page boundary of amount written so far
33      * unless we are flushing in which case entire cache
34      * is discarded.
35      */
36     if ( !flush )
37     {
38         if ( (cur = lseek(fd, 0, SEEK_CUR)) == (off_t)-1 )
39             cur = 0;
40         cur &= ~(XC_PAGE_SIZE-1);
41     }
42 
43     /* Discard from the buffer cache. */
44     if ( posix_fadvise(fd, 0, cur, POSIX_FADV_DONTNEED) < 0 )
45         goto out;
46 
47  out:
48     errno = saved_errno;
49 }
50 
xc_memalign(xc_interface * xch,size_t alignment,size_t size)51 void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
52 {
53     int ret;
54     void *ptr;
55 
56     ret = posix_memalign(&ptr, alignment, size);
57     if ( ret != 0 || !ptr )
58         return NULL;
59 
60     return ptr;
61 }
62 
63 /*
64  * Local variables:
65  * mode: C
66  * c-file-style: "BSD"
67  * c-basic-offset: 4
68  * tab-width: 4
69  * indent-tabs-mode: nil
70  * End:
71  */
72