void *owner; /* the connection or listener associated with this fd, NULL if closed */
unsigned int state; /* FD state for read and write directions (FD_EV_*) + FD_POLL_* */
unsigned int refc_tgid; /* refcounted tgid, updated atomically */
+ /* the info below are mainly used for epoll debugging/strengthening.
+ * they're filling the rest of the cache line but may easily be dropped
+ * if the room is needed for more important stuff.
+ */
+ unsigned int nb_takeover; /* number of times this FD was taken over since inserted (used for debugging) */
#ifdef DEBUG_FD
unsigned int event_count; /* number of events reported */
#endif
fdtab[fd].iocb = iocb;
fdtab[fd].state = newstate;
fdtab[fd].thread_mask = thread_mask;
+
+ /* just for debugging: how many times taken over since last fd_insert() */
+ fdtab[fd].nb_takeover = 0;
+
fd_drop_tgid(fd);
#ifdef DEBUG_FD
suspicious = 1;
chunk_printf(&trash,
- " %5d : st=0x%06x(%c%c %c%c%c%c%c W:%c%c%c R:%c%c%c) ref=%#x gid=%d tmask=0x%lx umask=0x%lx prmsk=0x%lx pwmsk=0x%lx owner=%p iocb=%p(",
+ " %5d : st=0x%06x(%c%c %c%c%c%c%c W:%c%c%c R:%c%c%c) ref=%#x gid=%d tmask=0x%lx umask=0x%lx prmsk=0x%lx pwmsk=0x%lx owner=%p tkov=%u iocb=%p(",
fd,
fdt.state,
(fdt.state & FD_CLONED) ? 'C' : 'c',
polled_mask[fd].poll_recv,
polled_mask[fd].poll_send,
fdt.owner,
+ fdt.nb_takeover,
fdt.iocb);
resolve_sym_name(&trash, NULL, fdt.iocb);
*/
fd_stop_recv(fd);
+ /* essentially for debugging */
+ fdtab[fd].nb_takeover++;
+
/* we're done with it */
HA_ATOMIC_AND(&fdtab[fd].running_mask, ~ti->ltid_bit);