~ubuntu-branches/ubuntu/precise/graphviz/precise-updates

« back to all changes in this revision

Viewing changes to lib/sfio/Sfio_dc/sfdcdio.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2008-02-08 02:06:56 UTC
  • mfrom: (1.2.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20080208020656-a3cbewe5ly6dpj0s
Tags: 2.16-3ubuntu1
* Merge with Debian; remaining changes:
  - Drop libttf-dev (libttf-dev is in universe) (LP: #174749).
  - Replace gs-common with ghostscript.
  - Build-depend on python-dev instead of python2.4-dev.
  - Build-depend on liblua50-dev instead of liblua5.1-0-dev.
  - Mention the correct python version for the python bindings in the
    package description.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: sfdcdio.c,v 1.1.1.1 2004/12/23 04:04:17 ellson Exp $ $Revision: 1.1.1.1 $ */
2
 
/* vim:set shiftwidth=4 ts=8: */
3
 
 
4
 
/**********************************************************
5
 
*      This software is part of the graphviz package      *
6
 
*                http://www.graphviz.org/                 *
7
 
*                                                         *
8
 
*            Copyright (c) 1994-2004 AT&T Corp.           *
9
 
*                and is licensed under the                *
10
 
*            Common Public License, Version 1.0           *
11
 
*                      by AT&T Corp.                      *
12
 
*                                                         *
13
 
*        Information and Software Systems Research        *
14
 
*              AT&T Research, Florham Park NJ             *
15
 
**********************************************************/
16
 
 
17
 
#include        "sfdchdr.h"
18
 
 
19
 
/*      Discipline to turn on direct IO capability.
20
 
**      This currently only works for XFS on SGI's.
21
 
**
22
 
**      Written by Kiem-Phong Vo, kpv@research.att.com, 03/18/1998.
23
 
*/
24
 
 
25
 
typedef struct _direct_s {
26
 
    Sfdisc_t disc;              /* Sfio discipline      */
27
 
    int cntl;                   /* file control flags   */
28
 
#ifdef HAVE_STRUCT_DIOATTR
29
 
    struct dioattr dio;         /* direct IO params     */
30
 
#endif
31
 
} Direct_t;
32
 
 
33
 
/* convert a pointer to an int */
34
 
#define P2I(p)  (Sfulong_t)((char*)(p) - (char*)0)
35
 
 
36
 
#ifdef HAVE_STRUCT_DIOATTR
37
 
#if __STD_C
38
 
static ssize_t diordwr(Sfio_t * f, Void_t * buf, size_t n, Direct_t * di,
39
 
                       int type)
40
 
#else
41
 
static ssize_t diordwr(f, buf, n, di, type)
42
 
Sfio_t *f;
43
 
Void_t *buf;
44
 
size_t n;
45
 
Direct_t *di;
46
 
int type;
47
 
#endif
48
 
{
49
 
    size_t rw, done;
50
 
    ssize_t rv = 0;
51
 
 
52
 
    done = 0;                   /* amount processed by direct IO */
53
 
 
54
 
    if ((P2I(buf) % di->dio.d_mem) == 0 && (f->here % di->dio.d_miniosz) == 0 && n >= di->dio.d_miniosz) {      /* direct IO ok, make sure we're in the right mode */
55
 
        if (!(di->cntl & FDIRECT)) {
56
 
            di->cntl |= FDIRECT;
57
 
            (void) fcntl(f->file, F_SETFL, di->cntl);
58
 
        }
59
 
 
60
 
        for (rw = (n / di->dio.d_miniosz) * di->dio.d_miniosz;;) {
61
 
            size_t io;
62
 
 
63
 
            if ((io = rw) > di->dio.d_maxiosz)
64
 
                io = di->dio.d_maxiosz;
65
 
            if (type == SF_READ)
66
 
                rv = read(f->file, buf, io);
67
 
            else
68
 
                rv = write(f->file, buf, io);
69
 
 
70
 
            if (rv > 0) {
71
 
                rw -= rv;
72
 
                done += rv;
73
 
                buf = (Void_t *) ((char *) buf + rv);
74
 
            }
75
 
 
76
 
            if (rv < io || rw < di->dio.d_miniosz)
77
 
                break;
78
 
        }
79
 
    }
80
 
 
81
 
    if (done < n && (di->cntl & FDIRECT)) {     /* turn off directIO for remaining IO operation */
82
 
        di->cntl &= ~FDIRECT;
83
 
        (void) fcntl(f->file, F_SETFL, di->cntl);
84
 
    }
85
 
 
86
 
    if ((rw = n - done) > 0 &&
87
 
        (rv =
88
 
         type == SF_READ ? read(f->file, buf, rw) : write(f->file, buf,
89
 
                                                          rw)) > 0)
90
 
        done += rv;
91
 
 
92
 
    return done ? done : rv;
93
 
}
94
 
 
95
 
#if __STD_C
96
 
static ssize_t dioread(Sfio_t * f, Void_t * buf, size_t n, Sfdisc_t * disc)
97
 
#else
98
 
static ssize_t dioread(f, buf, n, disc)
99
 
Sfio_t *f;
100
 
Void_t *buf;
101
 
size_t n;
102
 
Sfdisc_t *disc;
103
 
#endif
104
 
{
105
 
    return diordwr(f, buf, n, (Direct_t *) disc, SF_READ);
106
 
}
107
 
 
108
 
#if __STD_C
109
 
static ssize_t diowrite(Sfio_t * f, const Void_t * buf, size_t n,
110
 
                        Sfdisc_t * disc)
111
 
#else
112
 
static ssize_t diowrite(f, buf, n, disc)
113
 
Sfio_t *f;
114
 
Void_t *buf;
115
 
size_t n;
116
 
Sfdisc_t *disc;
117
 
#endif
118
 
{
119
 
    return diordwr(f, (Void_t *) buf, n, (Direct_t *) disc, SF_WRITE);
120
 
}
121
 
 
122
 
#if __STD_C
123
 
static int dioexcept(Sfio_t * f, int type, Void_t * data, Sfdisc_t * disc)
124
 
#else
125
 
static int dioexcept(f, type, data, disc)
126
 
Sfio_t *f;
127
 
int type;
128
 
Void_t *data;
129
 
Sfdisc_t *disc;
130
 
#endif
131
 
{
132
 
    Direct_t *di = (Direct_t *) disc;
133
 
 
134
 
    if (type == SF_FINAL || type == SF_DPOP) {
135
 
        if (di->cntl & FDIRECT) {
136
 
            di->cntl &= ~FDIRECT;
137
 
            (void) fcntl(f->file, F_SETFL, di->cntl);
138
 
        }
139
 
        free(disc);
140
 
    }
141
 
 
142
 
    return 0;
143
 
}
144
 
#endif                          /*HAVE_STRUCT_DIOATTR */
145
 
 
146
 
#if __STD_C
147
 
int sfdcdio(Sfio_t * f, size_t bufsize)
148
 
#else
149
 
int sfdcdio(f, bufsize)
150
 
Sfio_t *f;
151
 
size_t bufsize;
152
 
#endif
153
 
{
154
 
#ifndef HAVE_STRUCT_DIOATTR
155
 
    return -1;
156
 
#else
157
 
    int cntl;
158
 
    struct dioattr dio;
159
 
    Void_t *buf;
160
 
    Direct_t *di;
161
 
 
162
 
    if (f->extent < 0 || (f->flags & SF_STRING))
163
 
        return -1;
164
 
 
165
 
    if ((cntl = fcntl(f->file, F_GETFL, 0)) < 0)
166
 
        return -1;
167
 
 
168
 
    if (!(cntl & FDIRECT)) {
169
 
        cntl |= FDIRECT;
170
 
        if (fcntl(f->file, F_SETFL, cntl) < 0)
171
 
            return -1;
172
 
    }
173
 
 
174
 
    if (fcntl(f->file, F_DIOINFO, &dio) < 0)
175
 
        goto no_direct;
176
 
 
177
 
    if (bufsize > 0)
178
 
        bufsize = (bufsize / dio.d_miniosz) * dio.d_miniosz;
179
 
    if (bufsize <= 0)
180
 
        bufsize = dio.d_miniosz * 64;
181
 
    if (bufsize > dio.d_maxiosz)
182
 
        bufsize = dio.d_maxiosz;
183
 
 
184
 
    if (!(di = (Direct_t *) malloc(sizeof(Direct_t))))
185
 
        goto no_direct;
186
 
 
187
 
    if (!(buf = (Void_t *) memalign(dio.d_mem, bufsize))) {
188
 
        free(di);
189
 
        goto no_direct;
190
 
    }
191
 
 
192
 
    sfsetbuf(f, buf, bufsize);
193
 
    if (sfsetbuf(f, buf, 0) == buf)
194
 
        sfset(f, SF_MALLOC, 1);
195
 
    else {
196
 
        free(buf);
197
 
        free(di);
198
 
        goto no_direct;
199
 
    }
200
 
 
201
 
    di->disc.readf = dioread;
202
 
    di->disc.writef = diowrite;
203
 
    di->disc.seekf = NIL(Sfseek_f);
204
 
    di->disc.exceptf = dioexcept;
205
 
    di->cntl = cntl;
206
 
    di->dio = dio;
207
 
 
208
 
    if (sfdisc(f, (Sfdisc_t *) di) != (Sfdisc_t *) di) {
209
 
        free(di);
210
 
      no_direct:
211
 
        cntl &= ~FDIRECT;
212
 
        (void) fcntl(f->file, F_SETFL, cntl);
213
 
        return -1;
214
 
    }
215
 
 
216
 
    return 0;
217
 
 
218
 
#endif /*FDIRECT*/
219
 
}