THREAD_SYNC_LOCK = 0,
FDCACHE_LOCK,
FD_LOCK,
- POLL_LOCK,
TASK_RQ_LOCK,
TASK_WQ_LOCK,
POOL_LOCK,
extern THREAD_LOCAL int fd_nbupdt; // number of updates in the list
__decl_hathreads(extern HA_RWLOCK_T __attribute__((aligned(64))) fdcache_lock); /* global lock to protect fd_cache array */
-__decl_hathreads(extern HA_SPINLOCK_T __attribute__((aligned(64))) poll_lock); /* global lock to protect poll info */
/* Deletes an FD from the fdsets.
* The file descriptor is also closed.
/* These are replacements for FD_SET, FD_CLR, FD_ISSET, working on uints */
static inline void hap_fd_set(int fd, unsigned int *evts)
{
- evts[fd / (8*sizeof(*evts))] |= 1U << (fd & (8*sizeof(*evts) - 1));
+ HA_ATOMIC_OR(&evts[fd / (8*sizeof(*evts))], 1U << (fd & (8*sizeof(*evts) - 1)));
}
static inline void hap_fd_clr(int fd, unsigned int *evts)
{
- evts[fd / (8*sizeof(*evts))] &= ~(1U << (fd & (8*sizeof(*evts) - 1)));
+ HA_ATOMIC_AND(&evts[fd / (8*sizeof(*evts))], ~(1U << (fd & (8*sizeof(*evts) - 1))));
}
static inline unsigned int hap_fd_isset(int fd, unsigned int *evts)
REGPRM1 static void __fd_clo(int fd)
{
- HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
hap_fd_clr(fd, fd_evts[DIR_RD]);
hap_fd_clr(fd, fd_evts[DIR_WR]);
- HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
}
/*
if ((eo ^ en) & FD_EV_POLLED_RW) {
/* poll status changed, update the lists */
- HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
if ((eo & ~en) & FD_EV_POLLED_R)
hap_fd_clr(fd, fd_evts[DIR_RD]);
else if ((en & ~eo) & FD_EV_POLLED_R) {
if (fd > max_add_fd)
max_add_fd = fd;
}
-
- HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
}
}
/* Immediately remove the entry upon close() */
REGPRM1 static void __fd_clo(int fd)
{
- HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
hap_fd_clr(fd, fd_evts[DIR_RD]);
hap_fd_clr(fd, fd_evts[DIR_WR]);
- HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
}
/*
if ((eo ^ en) & FD_EV_POLLED_RW) {
/* poll status changed, update the lists */
- HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
if ((eo & ~en) & FD_EV_POLLED_R)
hap_fd_clr(fd, fd_evts[DIR_RD]);
else if ((en & ~eo) & FD_EV_POLLED_R) {
if (fd > max_add_fd)
max_add_fd = fd;
}
- HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
}
}
THREAD_LOCAL int fd_nbupdt = 0; // number of updates in the list
__decl_hathreads(HA_RWLOCK_T fdcache_lock); /* global lock to protect fd_cache array */
-__decl_hathreads(HA_SPINLOCK_T poll_lock); /* global lock to protect poll info */
/* Deletes an FD from the fdsets.
* The file descriptor is also closed.
HA_SPIN_INIT(&fdtab[p].lock);
HA_RWLOCK_INIT(&fdcache_lock);
- HA_SPIN_INIT(&poll_lock);
do {
bp = NULL;
for (p = 0; p < nbpollers; p++)
free(fdtab); fdtab = NULL;
HA_RWLOCK_DESTROY(&fdcache_lock);
- HA_SPIN_DESTROY(&poll_lock);
}
/*