static inline void fd_stop_recv(int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
static inline void fd_stop_send(int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_W)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
static inline void fd_stop_both(int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_RW)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
static inline void fd_cant_recv(const int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
/* Report that FD <fd> can receive anymore without polling. */
static inline void fd_may_recv(const int fd)
{
+ unsigned long locked;
+
/* marking ready never changes polled status */
HA_ATOMIC_OR(&fdtab[fd].state, FD_EV_READY_R);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
static inline void fd_done_recv(const int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
static inline void fd_cant_send(const int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_W)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
/* Report that FD <fd> can send anymore without polling (EAGAIN detected). */
static inline void fd_may_send(const int fd)
{
+ unsigned long locked;
+
/* marking ready never changes polled status */
HA_ATOMIC_OR(&fdtab[fd].state, FD_EV_READY_W);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
static inline void fd_want_recv(int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
static inline void fd_want_send(int fd)
{
unsigned char old, new;
+ unsigned long locked;
old = fdtab[fd].state;
do {
if ((old ^ new) & FD_EV_POLLED_W)
updt_fd_polling(fd);
- if (atleast2(fdtab[fd].thread_mask))
+ locked = atleast2(fdtab[fd].thread_mask);
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
* by the poller to set FD_POLL_* flags. */
static inline void fd_update_events(int fd, int evts)
{
- if (atleast2(fdtab[fd].thread_mask))
+ unsigned long locked = atleast2(fdtab[fd].thread_mask);
+
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fdtab[fd].ev &= FD_POLL_STICKY;
fdtab[fd].ev |= evts;
- if (atleast2(fdtab[fd].thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
if (fdtab[fd].ev & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR))
/* Prepares <fd> for being polled */
static inline void fd_insert(int fd, void *owner, void (*iocb)(int fd), unsigned long thread_mask)
{
- if (atleast2(thread_mask))
+ unsigned long locked = atleast2(thread_mask);
+
+ if (locked)
HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fdtab[fd].owner = owner;
fdtab[fd].iocb = iocb;
/* note: do not reset polled_mask here as it indicates which poller
* still knows this FD from a possible previous round.
*/
- if (atleast2(thread_mask))
+ if (locked)
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}