2
* * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>,
3
* * Anders Kvist <akv@lnxbx.dk> and Klaus Post <klauspost@gmail.com>
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
/* readahead() on Linux */
23
#endif /* __gnu_linux__ */
26
#include <sys/types.h>
30
#include "rs-io-job-prefetch.h"
34
gboolean dispose_has_run;
39
G_DEFINE_TYPE(RSIoJobPrefetch, rs_io_job_prefetch, RS_TYPE_IO_JOB)
46
RSIoJobPrefetch *prefetch = RS_IO_JOB_PREFETCH(job);
48
stat(prefetch->path, &st);
51
fd = open(prefetch->path, O_RDONLY);
56
while(bytes_read < st.st_size)
59
gint length = MIN(st.st_size-bytes_read, 1024*1024);
60
readahead(fd, bytes_read, length);
65
gchar *tmp = g_new(gchar, st.st_size);
67
while(bytes_read < st.st_size)
70
bytes_read += read(fd, tmp+bytes_read, MIN(st.st_size-bytes_read, 1024*1024));
75
#endif /* __gnu_linux__ */
82
rs_io_job_prefetch_dispose(GObject *object)
84
RSIoJobPrefetch *prefetch = RS_IO_JOB_PREFETCH(object);
85
if (!prefetch->dispose_has_run)
87
prefetch->dispose_has_run = TRUE;
89
g_free(prefetch->path);
91
G_OBJECT_CLASS(rs_io_job_prefetch_parent_class)->dispose(object);
95
rs_io_job_prefetch_class_init(RSIoJobPrefetchClass *klass)
97
GObjectClass *object_class = G_OBJECT_CLASS(klass);
98
RSIoJobClass *job_class = RS_IO_JOB_CLASS(klass);
100
object_class->dispose = rs_io_job_prefetch_dispose;
101
job_class->execute = execute;
105
rs_io_job_prefetch_init(RSIoJobPrefetch *prefetch)
110
rs_io_job_prefetch_new(const gchar *path)
112
RSIoJobPrefetch *prefetch = g_object_new(RS_TYPE_IO_JOB_PREFETCH, NULL);
114
prefetch->path = g_strdup(path);
116
return RS_IO_JOB(prefetch);