/*
- * $Id: comm.cc,v 1.298 1999/01/12 23:22:28 wessels Exp $
+ * $Id: comm.cc,v 1.299 1999/01/18 22:23:32 wessels Exp $
*
* DEBUG: section 5 Socket Functions
* AUTHOR: Harvest Derived
#if USE_ASYNC_IO
int doaioclose = 1;
#endif
- extern int current_hdl_fd;
debug(5, 5) ("comm_close: FD %d\n", fd);
assert(fd >= 0);
assert(fd < Squid_MaxFD);
return;
if (shutting_down && (!F->flags.open || F->type == FD_FILE))
return;
- if (fd == current_hdl_fd) {
- F->flags.delayed_comm_close = 1;
- return;
- }
assert(F->flags.open);
assert(F->type != FD_FILE);
#ifdef USE_ASYNC_IO
/*
- * $Id: comm_select.cc,v 1.28 1999/01/13 23:24:10 wessels Exp $
+ * $Id: comm_select.cc,v 1.29 1999/01/18 22:23:33 wessels Exp $
*
* DEBUG: section 5 Socket Functions
*
#define FD_MASK_BYTES sizeof(fd_mask)
#define FD_MASK_BITS (FD_MASK_BYTES*NBBY)
-/* GLOBAL */
-int current_hdl_fd = -1;
-
/* STATIC */
#if !HAVE_POLL
static int examine_select(fd_set *, fd_set *);
debug(5, 6) ("comm_poll: FD %d ready for reading\n", fd);
if ((hdl = F->read_handler)) {
F->read_handler = NULL;
- hdl(current_hdl_fd = fd, F->read_data);
- current_hdl_fd = -1;
+ hdl(fd, F->read_data);
Counter.select_fds++;
}
- if (F->flags.delayed_comm_close)
- comm_close(fd);
if (commCheckICPIncoming)
comm_poll_icp_incoming();
if (commCheckHTTPIncoming)
debug(5, 5) ("comm_poll: FD %d ready for writing\n", fd);
if ((hdl = F->write_handler)) {
F->write_handler = NULL;
- hdl(current_hdl_fd = fd, F->write_data);
- current_hdl_fd = -1;
+ hdl(fd, F->write_data);
Counter.select_fds++;
}
- if (F->flags.delayed_comm_close)
- comm_close(fd);
if (commCheckICPIncoming)
comm_poll_icp_incoming();
if (commCheckHTTPIncoming)
hdl = F->read_handler;
F->read_handler = NULL;
commUpdateReadBits(fd, NULL);
- hdl(current_hdl_fd = fd, F->read_data);
- current_hdl_fd = -1;
+ hdl(fd, F->read_data);
Counter.select_fds++;
}
- if (F->flags.delayed_comm_close)
- comm_close(fd);
if (commCheckICPIncoming)
comm_select_icp_incoming();
if (commCheckHTTPIncoming)
hdl = F->write_handler;
F->write_handler = NULL;
commUpdateWriteBits(fd, NULL);
- hdl(current_hdl_fd = fd, F->write_data);
- current_hdl_fd = -1;
+ hdl(fd, F->write_data);
Counter.select_fds++;
}
- if (F->flags.delayed_comm_close)
- comm_close(fd);
if (commCheckICPIncoming)
comm_select_icp_incoming();
if (commCheckHTTPIncoming)
/*
- * $Id: fd.cc,v 1.30 1999/01/12 23:37:41 wessels Exp $
+ * $Id: fd.cc,v 1.31 1999/01/18 22:23:34 wessels Exp $
*
* DEBUG: section 51 Filedescriptor Functions
* AUTHOR: Duane Wessels
RESERVED_FD, new);
RESERVED_FD = new;
}
+
+void
+fdTouchFL(int fd, const char *file, int line)
+{
+ fde *F;
+ if (fd < 0)
+ return;
+ F = &fd_table[fd];
+ assert(F->flags.open);
+ F->last.file = file;
+ F->last.line = line;
+}
/*
- * $Id: ftp.cc,v 1.265 1999/01/15 00:16:19 wessels Exp $
+ * $Id: ftp.cc,v 1.266 1999/01/18 22:23:35 wessels Exp $
*
* DEBUG: section 9 File Transfer Protocol (FTP)
* AUTHOR: Harvest Derived
delay_id delay_id = delayMostBytesAllowed(mem);
#endif
assert(fd == ftpState->data.fd);
+ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) {
+ comm_close(fd);
+ return;
+ }
errno = 0;
read_sz = ftpState->data.size - ftpState->data.offset;
#if DELAY_POOLS
/*
- * $Id: gopher.cc,v 1.145 1999/01/15 06:11:43 wessels Exp $
+ * $Id: gopher.cc,v 1.146 1999/01/18 22:23:36 wessels Exp $
*
* DEBUG: section 10 Gopher
* AUTHOR: Harvest Derived
#if DELAY_POOLS
delay_id delay_id = delayMostBytesAllowed(entry->mem_obj);
#endif
+ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) {
+ comm_close(fd);
+ return;
+ }
errno = 0;
buf = memAllocate(MEM_4K_BUF);
read_sz = 4096 - 1; /* leave room for termination */
/*
- * $Id: http.cc,v 1.340 1999/01/15 06:11:44 wessels Exp $
+ * $Id: http.cc,v 1.341 1999/01/18 22:23:37 wessels Exp $
*
* DEBUG: section 11 Hypertext Transfer Protocol (HTTP)
* AUTHOR: Harvest Derived
#if DELAY_POOLS
delay_id delay_id = delayMostBytesAllowed(entry->mem_obj);
#endif
+ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) {
+ comm_close(fd);
+ return;
+ }
/* check if we want to defer reading */
errno = 0;
read_sz = SQUID_TCP_SO_RCVBUF;
/*
- * $Id: protos.h,v 1.303 1999/01/15 06:11:45 wessels Exp $
+ * $Id: protos.h,v 1.304 1999/01/18 22:23:38 wessels Exp $
*
*
* SQUID Internet Object Cache http://squid.nlanr.net/Squid/
extern void fdDumpOpen(void);
extern int fdNFree(void);
extern void fdAdjustReserved(void);
+extern void fdTouchFL(int, const char *, int);
extern fileMap *file_map_create(int);
extern int file_map_allocate(fileMap *, int);
/*
- * $Id: squid.h,v 1.183 1999/01/11 21:55:41 wessels Exp $
+ * $Id: squid.h,v 1.184 1999/01/18 22:23:39 wessels Exp $
*
* AUTHOR: Duane Wessels
*
#define leakFree(p) p
#endif
+#define fdTouch(f) fdTouchFL(f,__FILE__,__LINE__)
+
#if defined(_SQUID_NEXT_) && !defined(S_ISDIR)
#define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR))
#endif
/*
- * $Id: stat.cc,v 1.307 1999/01/12 16:42:19 wessels Exp $
+ * $Id: stat.cc,v 1.308 1999/01/18 22:23:40 wessels Exp $
*
* DEBUG: section 18 Cache Manager Statistics
* AUTHOR: Harvest Derived
f = &fd_table[i];
if (!f->flags.open)
continue;
- storeAppendPrintf(sentry, "%4d %-6.6s %4d %7d %7d %-21s %s\n",
+ storeAppendPrintf(sentry, "%4d %-6.6s %4d %7d %7d %-21s %20s:%-5d %s\n",
i,
fdTypeStr[f->type],
f->timeout_handler ? (int) (f->timeout - squid_curtime) / 60 : 0,
f->bytes_read,
f->bytes_written,
fdRemoteAddr(f),
+ f->last.line ? f->last.file : null_string,
+ f->last.line,
f->desc);
}
}
/*
- * $Id: store.cc,v 1.482 1999/01/15 06:30:10 wessels Exp $
+ * $Id: store.cc,v 1.483 1999/01/18 22:23:42 wessels Exp $
*
* DEBUG: section 20 Storage Manager
* AUTHOR: Harvest Derived
storeAbort(StoreEntry * e)
{
MemObject *mem = e->mem_obj;
- STABH *callback;
- void *data;
assert(e->store_status == STORE_PENDING);
assert(mem != NULL);
debug(20, 6) ("storeAbort: %s\n", storeKeyText(e->key));
mem->object_sz = mem->inmem_hi;
/* Notify the server side */
if (mem->abort.callback) {
- callback = mem->abort.callback;
- data = mem->abort.data;
+ eventAdd("mem->abort.callback",
+ mem->abort.callback,
+ mem->abort.data,
+ 0.0,
+ 0);
mem->abort.callback = NULL;
mem->abort.data = NULL;
- callback(data);
}
/* Notify the client side */
InvokeHandlers(e);
/*
- * $Id: store_client.cc,v 1.54 1999/01/13 05:56:08 wessels Exp $
+ * $Id: store_client.cc,v 1.55 1999/01/18 22:23:44 wessels Exp $
*
* DEBUG: section 20 Storage Manager Client-Side Interface
* AUTHOR: Duane Wessels
callback(sc->callback_data, sc->copy_buf, -1);
return;
}
+ fdTouch(fd);
sc->swapin_fd = fd;
storeClientFileRead(sc);
}
#ifdef OPTIMISTIC_IO
sc->flags.disk_io_pending = 1;
#endif
+ fdTouch(sc->swapin_fd);
if (mem->swap_hdr_sz == 0) {
file_read(sc->swapin_fd,
sc->copy_buf,
store_client *sc = data;
MemObject *mem = sc->entry->mem_obj;
STCB *callback = sc->callback;
+ fdTouch(fd);
assert(sc->flags.disk_io_pending);
sc->flags.disk_io_pending = 0;
assert(sc->callback != NULL);
size_t body_sz;
size_t copy_sz;
tlv *tlv_list;
+ fdTouch(fd);
assert(sc->flags.disk_io_pending);
sc->flags.disk_io_pending = 0;
assert(sc->callback != NULL);
callback(sc->callback_data, sc->copy_buf, len);
return;
}
+ fdTouch(fd);
tlv_list = storeSwapMetaUnpack(buf, &swap_hdr_sz);
if (tlv_list == NULL) {
debug(20, 1) ("storeClientReadHeader: failed to unpack meta data\n");
callback(sc->callback_data, sc->copy_buf, -1);
return;
}
+ fdTouch(fd);
/*
* XXX Here we should check the meta data and make sure we got
* the right object.
callback(sc->callback_data, sc->copy_buf, copy_sz);
return;
}
+ fdTouch(fd);
/*
* we don't have what the client wants, but at least we now
* know the swap header size.
*S = sc->next;
mem->nclients--;
sc->flags.disk_io_pending = 0;
+ fdTouch(sc->swapin_fd);
if (e->store_status == STORE_OK && e->swap_status != SWAPOUT_DONE)
storeCheckSwapOut(e);
if (sc->swapin_fd > -1) {
/*
- * $Id: store_swapin.cc,v 1.14 1998/09/19 17:06:16 wessels Exp $
+ * $Id: store_swapin.cc,v 1.15 1999/01/18 22:23:44 wessels Exp $
*
* DEBUG: section 20 Storage Manager Swapin Functions
* AUTHOR: Duane Wessels
xfree(ctrlp);
return;
}
+ fdTouch(fd);
assert(mem != NULL);
assert(e->mem_status == NOT_IN_MEMORY);
assert(e->swap_status == SWAPOUT_WRITING || e->swap_status == SWAPOUT_DONE);
/*
- * $Id: store_swapout.cc,v 1.42 1999/01/12 23:37:51 wessels Exp $
+ * $Id: store_swapout.cc,v 1.43 1999/01/18 22:23:45 wessels Exp $
*
* DEBUG: section 20 Storage Manager Swapout Functions
* AUTHOR: Duane Wessels
StoreEntry *e = ctrlp->e;
MemObject *mem = e->mem_obj;
debug(20, 3) ("storeSwapOutHandle: '%s', len=%d\n", storeKeyText(e->key), (int) len);
+ fdTouch(fdnotused);
if (flag < 0) {
debug(20, 1) ("storeSwapOutHandle: SwapOut failure (err code = %d).\n",
flag);
storeSwapOutFileClose(e);
return;
}
+ fdTouch(fdnotused);
#if USE_ASYNC_IO
if (mem == NULL) {
debug(20, 1) ("storeSwapOutHandle: mem == NULL : Cancelling swapout\n");
storeCheckSwapOut(e);
return;
}
+ fdTouch(fdnotused);
/* swapping complete */
debug(20, 5) ("storeSwapOutHandle: SwapOut complete: '%s' to %s.\n",
storeUrl(e), storeSwapFullPath(e->swap_file_number, NULL));
storeLog(STORE_LOG_SWAPOUT, e);
storeDirSwapLog(e, SWAP_LOG_ADD);
}
+ fdTouch(fdnotused);
/* Note, we don't otherwise call storeReleaseRequest() here because
* storeCheckCachable() does it for is if necessary */
storeSwapOutFileClose(e);
debug(20, 3) ("storeCheckSwapOut: swapping out %d bytes from %d\n",
swap_buf_len, (int) mem->swapout.queue_offset);
mem->swapout.queue_offset += swap_buf_len - hdr_len;
+ fdTouch(mem->swapout.fd);
file_write(mem->swapout.fd,
-1,
swap_buf,
int swap_hdr_sz = 0;
tlv *tlv_list;
char *buf;
+ fdTouch(fd);
if (fd == -2 && errcode == -2) { /* Cancelled - Clean up */
xfree(ctrlp->swapfilename);
cbdataFree(ctrlp);
/*
- * $Id: structs.h,v 1.260 1999/01/15 06:11:46 wessels Exp $
+ * $Id: structs.h,v 1.261 1999/01/18 22:23:46 wessels Exp $
*
*
* SQUID Internet Object Cache http://squid.nlanr.net/Squid/
#ifdef OPTIMISTIC_IO
unsigned int calling_io_handler:1;
#endif
- unsigned int delayed_comm_close:1;
} flags;
int bytes_read;
int bytes_written;
DEFER *defer_check; /* check if we should defer read */
void *defer_data;
CommWriteStateData *rwstate; /* State data for comm_write */
+ struct {
+ const char *file;
+ int line;
+ } last;
};
struct _fileMap {
/*
- * $Id: wais.cc,v 1.127 1999/01/15 06:11:47 wessels Exp $
+ * $Id: wais.cc,v 1.128 1999/01/18 22:23:48 wessels Exp $
*
* DEBUG: section 24 WAIS Relay
* AUTHOR: Harvest Derived
#if DELAY_POOLS
delay_id delay_id = delayMostBytesAllowed(entry->mem_obj);
#endif
+ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) {
+ comm_close(fd);
+ return;
+ }
errno = 0;
read_sz = 4096;
#if DELAY_POOLS