dlink_node node;
};
+void squidaio_init(void);
+void squidaio_shutdown(void);
int squidaio_cancel(squidaio_result_t *);
int squidaio_open(const char *, int, mode_t, squidaio_result_t *);
int squidaio_read(int, char *, int, off_t, int, squidaio_result_t *);
/*
- * $Id: DiskThreadsDiskFile.cc,v 1.4 2005/03/27 21:47:38 serassio Exp $
+ * $Id: DiskThreadsDiskFile.cc,v 1.5 2005/04/01 21:11:28 serassio Exp $
*
* DEBUG: section 79 Disk IO Routines
* AUTHOR: Robert Collins
{
CBDATA_INIT_TYPE(DiskThreadsDiskFile);
DiskThreadsDiskFile *result = cbdataAlloc(DiskThreadsDiskFile);
+ squidaio_init();
+
return result;
}
{
if (fd > -1) {
statCounter.syscalls.disk.closes++;
+#if ASYNC_CLOSE
+
aioClose(fd);
fd_close(fd);
+#else
+
+ aioCancel(fd);
+ file_close(fd);
+#endif
+
store_open_disk_fd--;
fd = -1;
}
/*
- * $Id: DiskThreadsIOStrategy.cc,v 1.1 2004/12/20 16:30:38 robertc Exp $
+ * $Id: DiskThreadsIOStrategy.cc,v 1.2 2005/04/01 21:11:28 serassio Exp $
*
* DEBUG: section 79 Squid-side Disk I/O functions.
* AUTHOR: Robert Collins
if (!initialised)
return;
+ squidaio_shutdown();
+
delete squidaio_ctrl_pool;
squidaio_ctrl_pool = NULL;
if (ctrlp->operation == _AIO_READ)
squidaio_xfree(ctrlp->bufp, ctrlp->len);
- if (ctrlp->operation == _AIO_CLOSE)
- aioFDWasClosed(ctrlp->fd);
-
squidaio_ctrl_pool->free(ctrlp);
}
storeAppendPrintf(sentry, "queue\t%d\t-\n", squidaio_get_queue_len());
}
-void
-DiskThreadsIOStrategy::aioFDWasClosed(int fd)
-{
- if (fd_table[fd].flags.closing)
- fd_close(fd);
-}
-
DiskThreadsIOStrategy DiskThreadsIOStrategy::Instance;
bool
DiskThreadsIOStrategy::shedLoad()
/*
- * $Id: DiskThreadsIOStrategy.h,v 1.1 2004/12/20 16:30:38 robertc Exp $
+ * $Id: DiskThreadsIOStrategy.h,v 1.2 2005/04/01 21:11:28 serassio Exp $
*
* DEBUG: section 79 Squid-side Disk I/O functions.
* AUTHOR: Robert Collins
private:
static void aioStats(StoreEntry * sentry);
- void aioFDWasClosed(int fd);
};
#endif
/*
- * $Id: aiops.cc,v 1.1 2004/12/20 16:30:38 robertc Exp $
+ * $Id: aiops.cc,v 1.2 2005/04/01 21:11:28 serassio Exp $
*
* DEBUG: section 43 AIOPS
* AUTHOR: Stewart Forster <slf@connect.com.au>
mode_t mode;
int fd;
char *bufferp;
- char *tmpbufp;
int buflen;
off_t offset;
int whence;
unsigned long requests;
};
-static void squidaio_init(void);
static void squidaio_queue_request(squidaio_request_t *);
static void squidaio_cleanup_request(squidaio_request_t *);
static void *squidaio_thread_loop(void *);
xfree(str);
}
-static void
+void
squidaio_init(void)
{
int i;
squidaio_initialised = 1;
}
+void
+squidaio_shutdown(void)
+{
+ if (!squidaio_initialised)
+ return;
+
+ /* This is the same as in squidaio_sync */
+ do {
+ squidaio_poll_queues();
+ } while (request_queue_len > 0);
+
+ CommIO::NotifyIOClose();
+
+ squidaio_initialised = 0;
+}
static void *
squidaio_thread_loop(void *ptr)
break;
case _AIO_OP_WRITE:
- squidaio_xfree(requestp->tmpbufp, requestp->buflen);
-
break;
default:
{
squidaio_request_t *requestp;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = (squidaio_request_t *)squidaio_request_pool->alloc();
requestp->path = (char *) squidaio_xstrdup(path);
{
squidaio_request_t *requestp;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = (squidaio_request_t *)squidaio_request_pool->alloc();
requestp->fd = fd;
{
squidaio_request_t *requestp;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = (squidaio_request_t *)squidaio_request_pool->alloc();
requestp->fd = fd;
- requestp->tmpbufp = (char *) squidaio_xmalloc(bufs);
-
- xmemcpy(requestp->tmpbufp, bufp, bufs);
+ requestp->bufferp = bufp;
requestp->buflen = bufs;
static void
squidaio_do_write(squidaio_request_t * requestp)
{
- requestp->ret = write(requestp->fd, requestp->tmpbufp, requestp->buflen);
+ requestp->ret = write(requestp->fd, requestp->bufferp, requestp->buflen);
requestp->err = errno;
}
{
squidaio_request_t *requestp;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = (squidaio_request_t *)squidaio_request_pool->alloc();
requestp->fd = fd;
{
squidaio_request_t *requestp;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = (squidaio_request_t *)squidaio_request_pool->alloc();
requestp->path = (char *) squidaio_xstrdup(path);
{
squidaio_request_t *requestp;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = (squidaio_request_t *)squidaio_request_pool->alloc();
requestp->path = squidaio_xstrdup(path);
{
squidaio_request_t *requestp;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = (squidaio_request_t *)squidaio_request_pool->alloc();
requestp->path = (char *) squidaio_xstrdup(path);
squidaio_request_t *requestp;
int len;
- if (!squidaio_initialised)
- squidaio_init();
-
requestp = squidaio_request_pool->alloc();
resultp->result_type = _AIO_OP_OPENDIR;
/*
- * $Id: comm.cc,v 1.401 2005/03/10 21:49:19 serassio Exp $
+ * $Id: comm.cc,v 1.402 2005/04/01 21:11:28 serassio Exp $
*
* DEBUG: section 5 Socket Functions
* AUTHOR: Harvest Derived
pipe(DonePipe);
DoneFD = DonePipe[1];
DoneReadFD = DonePipe[0];
- fd_open(DonePipe[0], FD_PIPE, "async-io completetion event: main");
- fd_open(DonePipe[1], FD_PIPE, "async-io completetion event: threads");
- commSetNonBlocking(DonePipe[0]);
- commSetNonBlocking(DonePipe[1]);
- commSetSelect(DonePipe[0], COMM_SELECT_READ, NULLFDHandler, NULL, 0);
+ fd_open(DoneReadFD, FD_PIPE, "async-io completetion event: main");
+ fd_open(DoneFD, FD_PIPE, "async-io completetion event: threads");
+ commSetNonBlocking(DoneReadFD);
+ commSetNonBlocking(DoneFD);
+ commSetSelect(DoneReadFD, COMM_SELECT_READ, NULLFDHandler, NULL, 0);
Initialised = true;
}
+void CommIO::NotifyIOClose() {
+ /* Close done pipe signal */
+ FlushPipe();
+ close(DoneFD);
+ close(DoneReadFD);
+ fd_close(DoneFD);
+ fd_close(DoneReadFD);
+ Initialised = false;
+}
+
bool CommIO::Initialised = false;
bool CommIO::DoneSignalled = false;
int CommIO::DoneFD = -1;
static inline void NotifyIOCompleted();
static void ResetNotifications();
static void Initialise();
+ static void NotifyIOClose();
private:
static void NULLFDHandler(int, void *);
/*
- * $Id: mem_node.h,v 1.7 2004/08/30 05:12:31 robertc Exp $
+ * $Id: mem_node.h,v 1.8 2005/04/01 21:11:28 serassio Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
StoreIOBuffer nodeBuffer;
/* Private */
char data[SM_PAGE_SIZE];
+ int uses;
};
MEMPROXY_CLASS_INLINE(mem_node)
/*
- * $Id: stmem.cc,v 1.87 2003/10/23 19:59:32 robertc Exp $
+ * $Id: stmem.cc,v 1.88 2005/04/01 21:11:28 serassio Exp $
*
* DEBUG: section 19 Store Memory Primitives
* AUTHOR: Harvest Derived
#include "MemObject.h"
#include "Generic.h"
+char *
+mem_hdr::NodeGet(mem_node * aNode)
+{
+ aNode->uses++;
+ return aNode->data;
+}
+
int
mem_hdr::lowestOffset () const
{
mem_hdr::unlink(mem_node *aNode)
{
nodes.remove (aNode, NodeCompare);
- delete aNode;
+
+ if (!aNode->uses)
+ delete aNode;
+ else
+ aNode->uses--;
+
}
int
/*
- * $Id: stmem.h,v 1.7 2003/10/20 11:23:38 robertc Exp $
+ * $Id: stmem.h,v 1.8 2005/04/01 21:11:28 serassio Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
* as a contianer ourselves
*/
const Splay<mem_node *> &getNodes() const;
+ char * NodeGet(mem_node * aNode);
/* Only for use of MemObject */
void internalAppend(const char *data, int len);
/*
- * $Id: store_swapout.cc,v 1.99 2005/01/03 16:08:26 robertc Exp $
+ * $Id: store_swapout.cc,v 1.100 2005/04/01 21:11:28 serassio Exp $
*
* DEBUG: section 20 Storage Manager Swapout Functions
* AUTHOR: Duane Wessels
mem->swapout.queue_offset += swap_buf_len;
- storeIOWrite(mem->swapout.sio, mem->swapout.memnode->data, swap_buf_len, -1, NULL);
+ storeIOWrite(mem->swapout.sio, mem->data_hdr.NodeGet(mem->swapout.memnode), swap_buf_len, -1, NULL);
/* the storeWrite() call might generate an error */
if (anEntry->swap_status != SWAPOUT_WRITING)