*/
static inline void updt_fd_polling(const int fd)
{
- if (fdtab[fd].update_mask & tid_bit)
- /* already scheduled for update */
+ unsigned int oldupdt;
+
+ /* note: we don't have a test-and-set yet in hathreads */
+
+ if (HA_ATOMIC_BTS(&fdtab[fd].update_mask, tid))
return;
- fdtab[fd].update_mask |= tid_bit;
- fd_updt[fd_nbupdt++] = fd;
+
+ oldupdt = HA_ATOMIC_ADD(&fd_nbupdt, 1) - 1;
+ fd_updt[oldupdt] = fd;
}
static inline void fd_add_to_fd_list(volatile struct fdlist *list, int fd)
new &= ~FD_EV_POLLED_R;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
new &= ~FD_EV_POLLED_W;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_W)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
new &= ~FD_EV_POLLED_RW;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_RW)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
new |= FD_EV_POLLED_R;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
new |= FD_EV_POLLED_R;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
new |= FD_EV_POLLED_W;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_W)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
new |= FD_EV_POLLED_R;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_R)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}
new |= FD_EV_POLLED_W;
} while (unlikely(!HA_ATOMIC_CAS(&fdtab[fd].state, &old, new)));
- HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
if ((old ^ new) & FD_EV_POLLED_W)
updt_fd_polling(fd);
+ HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock);
fd_update_cache(fd); /* need an update entry to change the state */
HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock);
}