~ubuntu-branches/ubuntu/vivid/rawstudio/vivid

« back to all changes in this revision

Viewing changes to librawstudio/rs-io-job-prefetch.c

  • Committer: Bazaar Package Importer
  • Author(s): Bernd Zeimetz
  • Date: 2011-07-28 17:36:32 UTC
  • mfrom: (2.1.11 upstream)
  • Revision ID: james.westby@ubuntu.com-20110728173632-5czluz9ye3c83zc5
Tags: 2.0-1
* [3750b2cf] Merge commit 'upstream/2.0'
* [63637468] Removing Patch, not necessary anymore.
* [2fb580dc] Add new build-dependencies.
* [c57d953b] Run dh_autoreconf due to patches in configure.in
* [13febe39] Add patch to remove the libssl requirement.
* [5ae773fe] Replace libjpeg62-dev by libjpeg8-dev :)
* [1969d755] Don't build static libraries.
* [7cfe0a2e] Add a patch to fix the plugin directory path.
  As plugins are shared libraries, they need to go into /usr/lib,
  not into /usr/share.
  Thanks to Andrew McMillan
* [c1d0d9dd] Don't install .la files for all plugins and libraries.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>, 
 
3
 * * Anders Kvist <akv@lnxbx.dk> and Klaus Post <klauspost@gmail.com>
 
4
 *
 
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.
 
9
 *
 
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.
 
14
 *
 
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.
 
18
 */
 
19
 
 
20
/* readahead() on Linux */
 
21
#if __gnu_linux__
 
22
#define _GNU_SOURCE
 
23
#endif /* __gnu_linux__ */
 
24
 
 
25
#include <fcntl.h>
 
26
#include <sys/types.h>
 
27
#include <sys/stat.h>
 
28
#include <unistd.h>
 
29
#include "rs-io.h"
 
30
#include "rs-io-job-prefetch.h"
 
31
 
 
32
typedef struct {
 
33
        RSIoJob parent;
 
34
        gboolean dispose_has_run;
 
35
 
 
36
        gchar *path;
 
37
} RSIoJobPrefetch;
 
38
 
 
39
G_DEFINE_TYPE(RSIoJobPrefetch, rs_io_job_prefetch, RS_TYPE_IO_JOB)
 
40
 
 
41
static void
 
42
execute(RSIoJob *job)
 
43
{
 
44
        gint fd;
 
45
        struct stat st;
 
46
        RSIoJobPrefetch *prefetch = RS_IO_JOB_PREFETCH(job);
 
47
 
 
48
        stat(prefetch->path, &st);
 
49
        if (st.st_size > 0)
 
50
        {
 
51
                fd = open(prefetch->path, O_RDONLY);
 
52
                if (fd > 0)
 
53
                {
 
54
                        gint bytes_read = 0;
 
55
#if __gnu_linux__
 
56
                        while(bytes_read < st.st_size)
 
57
                        {
 
58
                                rs_io_lock();
 
59
                                gint length = MIN(st.st_size-bytes_read, 1024*1024);
 
60
                                readahead(fd, bytes_read, length);
 
61
                                bytes_read += length;
 
62
                                rs_io_unlock();
 
63
                        }
 
64
#else
 
65
                        gchar *tmp = g_new(gchar, st.st_size);
 
66
 
 
67
                        while(bytes_read < st.st_size)
 
68
                        {
 
69
                                rs_io_lock();
 
70
                                bytes_read += read(fd, tmp+bytes_read, MIN(st.st_size-bytes_read, 1024*1024));
 
71
                                rs_io_unlock();
 
72
                        }
 
73
 
 
74
                        g_free(tmp);
 
75
#endif /* __gnu_linux__ */
 
76
                        }
 
77
                        close(fd);
 
78
                }
 
79
}
 
80
 
 
81
static void
 
82
rs_io_job_prefetch_dispose(GObject *object)
 
83
{
 
84
        RSIoJobPrefetch *prefetch = RS_IO_JOB_PREFETCH(object);
 
85
        if (!prefetch->dispose_has_run)
 
86
        {
 
87
                prefetch->dispose_has_run = TRUE;
 
88
 
 
89
                g_free(prefetch->path);
 
90
        }
 
91
        G_OBJECT_CLASS(rs_io_job_prefetch_parent_class)->dispose(object);
 
92
}
 
93
 
 
94
static void
 
95
rs_io_job_prefetch_class_init(RSIoJobPrefetchClass *klass)
 
96
{
 
97
        GObjectClass *object_class = G_OBJECT_CLASS(klass);
 
98
        RSIoJobClass *job_class = RS_IO_JOB_CLASS(klass);
 
99
 
 
100
        object_class->dispose = rs_io_job_prefetch_dispose;
 
101
        job_class->execute = execute;
 
102
}
 
103
 
 
104
static void
 
105
rs_io_job_prefetch_init(RSIoJobPrefetch *prefetch)
 
106
{
 
107
}
 
108
 
 
109
RSIoJob *
 
110
rs_io_job_prefetch_new(const gchar *path)
 
111
{
 
112
        RSIoJobPrefetch *prefetch = g_object_new(RS_TYPE_IO_JOB_PREFETCH, NULL);
 
113
 
 
114
        prefetch->path = g_strdup(path);
 
115
 
 
116
        return RS_IO_JOB(prefetch);
 
117
}