]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/DiskIO/Blocking/BlockingFile.cc
4 * DEBUG: section 47 Store Directory Routines
5 * AUTHOR: Robert Collins
7 * SQUID Web Proxy Cache http://www.squid-cache.org/
8 * ----------------------------------------------------------
10 * Squid is the result of efforts by numerous individuals from
11 * the Internet community; see the CONTRIBUTORS file for full
12 * details. Many organizations have provided support for Squid's
13 * development; see the SPONSORS file for full details. Squid is
14 * Copyrighted (C) 2001 by the Regents of the University of
15 * California; see the COPYRIGHT file for full details. Squid
16 * incorporates software developed and/or copyrighted by other
17 * sources; see the CREDITS file for full details.
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation; either version 2 of the License, or
22 * (at your option) any later version.
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with this program; if not, write to the Free Software
31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
33 * Copyright (c) 2003, Robert Collins <robertc@squid-cache.org>
36 #include "BlockingFile.h"
38 #include "DiskIO/IORequestor.h"
39 #include "DiskIO/ReadRequest.h"
40 #include "DiskIO/WriteRequest.h"
46 CBDATA_CLASS_INIT(BlockingFile
);
49 BlockingFile::operator new(size_t sz
)
51 CBDATA_INIT_TYPE(BlockingFile
);
52 BlockingFile
*result
= cbdataAlloc(BlockingFile
);
53 /* Mark result as being owned - we want the refcounter to do the delete
59 BlockingFile::operator delete(void *address
)
61 BlockingFile
*t
= static_cast<BlockingFile
*>(address
);
65 BlockingFile::BlockingFile(char const *aPath
) : fd (-1), closed (true), error_(false)
68 debugs(79, 3, "BlockingFile::BlockingFile: " << aPath
);
69 path_
= xstrdup (aPath
);
72 BlockingFile::~BlockingFile()
79 BlockingFile::open(int flags
, mode_t mode
, RefCount
<IORequestor
> callback
)
81 /* Simulate async calls */
82 fd
= file_open(path_
, flags
);
83 ioRequestor
= callback
;
86 debugs(79, 3, "BlockingFile::open: got failure (" << errno
<< ")");
91 debugs(79, 3, "BlockingFile::open: opened FD " << fd
);
94 callback
->ioCompletedNotification();
98 * Alias for BlockingFile::open(...)
99 \copydoc BlockingFile::open(int flags, mode_t mode, RefCount<IORequestor> callback)
102 BlockingFile::create(int flags
, mode_t mode
, RefCount
<IORequestor
> callback
)
104 /* We use the same logic path for open */
105 open(flags
, mode
, callback
);
108 void BlockingFile::doClose()
113 --store_open_disk_fd
;
119 BlockingFile::close()
121 debugs(79, 3, "BlockingFile::close: " << this << " closing for " << ioRequestor
.getRaw());
123 assert (ioRequestor
.getRaw());
124 ioRequestor
->closeCompleted();
128 BlockingFile::canRead() const
134 BlockingFile::error() const
136 if ((fd
< 0 && !closed
) || error_
)
142 void BlockingFile::error(bool const &aBool
)
148 BlockingFile::read(ReadRequest
*aRequest
)
151 assert (ioRequestor
.getRaw());
152 readRequest
= aRequest
;
153 debugs(79, 3, HERE
<< aRequest
->len
<< " for FD " << fd
<< " at " << aRequest
->offset
);
154 file_read(fd
, aRequest
->buf
, aRequest
->len
, aRequest
->offset
, ReadDone
, this);
158 BlockingFile::ReadDone(int fd
, const char *buf
, int len
, int errflag
, void *my_data
)
160 BlockingFile
*myFile
= static_cast<BlockingFile
*>(my_data
);
162 myFile
->readDone (fd
, buf
, len
, errflag
);
166 BlockingFile::write(WriteRequest
*aRequest
)
168 debugs(79, 3, HERE
<< aRequest
->len
<< " for FD " << fd
<< " at " << aRequest
->offset
);
169 writeRequest
= aRequest
;
172 (char *)aRequest
->buf
,
176 aRequest
->free_func
);
180 BlockingFile::ioInProgress() const
182 /** \retval false IO is never pending with UFS */
186 /* === STATIC =========================================================== */
189 BlockingFile::readDone(int rvfd
, const char *buf
, int len
, int errflag
)
191 debugs(79, 3, "BlockingFile::readDone: FD " << rvfd
);
197 debugs(79, 3, "BlockingFile::readDone: got failure (" << errflag
<< ")");
200 rlen
= (ssize_t
) len
;
203 if (errflag
== DISK_EOF
)
204 errflag
= DISK_OK
; /* EOF is signalled by len == 0, not errors... */
206 ReadRequest::Pointer result
= readRequest
;
210 ioRequestor
->readCompleted(buf
, rlen
, errflag
, result
);
214 BlockingFile::WriteDone (int fd
, int errflag
, size_t len
, void *me
)
216 BlockingFile
*aFile
= static_cast<BlockingFile
*>(me
);
217 aFile
->writeDone (fd
, errflag
, len
);
221 BlockingFile::writeDone(int rvfd
, int errflag
, size_t len
)
224 debugs(79, 3, HERE
<< "FD " << fd
<< ", len " << len
);
226 WriteRequest::Pointer result
= writeRequest
;
230 debugs(79, DBG_CRITICAL
, "storeUfsWriteDone: got failure (" << errflag
<< ")");
232 ioRequestor
->writeCompleted (DISK_ERROR
,0, result
);
236 ioRequestor
->writeCompleted(DISK_OK
, len
, result
);