MEDIUM: pollers: Use the new _HA_ATOMIC_* macros.

Use the new _HA_ATOMIC_* macros and add barriers where needed.
This commit is contained in:
Olivier Houchard 2019-03-08 18:49:54 +01:00 committed by Olivier Houchard
parent 7059c55463
commit cb6c9274ae
4 changed files with 21 additions and 21 deletions

View File

@ -72,7 +72,7 @@ static void _update_fd(int fd)
if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) { if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) {
/* fd removed from poll list */ /* fd removed from poll list */
opcode = EPOLL_CTL_DEL; opcode = EPOLL_CTL_DEL;
HA_ATOMIC_AND(&polled_mask[fd], ~tid_bit); _HA_ATOMIC_AND(&polled_mask[fd], ~tid_bit);
} }
else { else {
/* fd status changed */ /* fd status changed */
@ -82,7 +82,7 @@ static void _update_fd(int fd)
else if ((fdtab[fd].thread_mask & tid_bit) && (en & FD_EV_POLLED_RW)) { else if ((fdtab[fd].thread_mask & tid_bit) && (en & FD_EV_POLLED_RW)) {
/* new fd in the poll list */ /* new fd in the poll list */
opcode = EPOLL_CTL_ADD; opcode = EPOLL_CTL_ADD;
HA_ATOMIC_OR(&polled_mask[fd], tid_bit); _HA_ATOMIC_OR(&polled_mask[fd], tid_bit);
} }
else { else {
return; return;
@ -116,7 +116,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) { for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
fd = fd_updt[updt_idx]; fd = fd_updt[updt_idx];
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
if (!fdtab[fd].owner) { if (!fdtab[fd].owner) {
activity[tid].poll_drop++; activity[tid].poll_drop++;
continue; continue;
@ -186,7 +186,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
/* FD has been migrated */ /* FD has been migrated */
activity[tid].poll_skip++; activity[tid].poll_skip++;
epoll_ctl(epoll_fd[tid], EPOLL_CTL_DEL, fd, &ev); epoll_ctl(epoll_fd[tid], EPOLL_CTL_DEL, fd, &ev);
HA_ATOMIC_AND(&polled_mask[fd], ~tid_bit); _HA_ATOMIC_AND(&polled_mask[fd], ~tid_bit);
continue; continue;
} }
@ -208,7 +208,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
/* always remap RDHUP to HUP as they're used similarly */ /* always remap RDHUP to HUP as they're used similarly */
if (e & EPOLLRDHUP) { if (e & EPOLLRDHUP) {
HA_ATOMIC_OR(&cur_poller.flags, HAP_POLL_F_RDHUP); _HA_ATOMIC_OR(&cur_poller.flags, HAP_POLL_F_RDHUP);
n |= FD_POLL_HUP; n |= FD_POLL_HUP;
} }
fd_update_events(fd, n); fd_update_events(fd, n);

View File

@ -51,7 +51,7 @@ static int _update_fd(int fd, int start)
/* fd totally removed from poll list */ /* fd totally removed from poll list */
EV_SET(&kev[changes++], fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); EV_SET(&kev[changes++], fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
EV_SET(&kev[changes++], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); EV_SET(&kev[changes++], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
HA_ATOMIC_AND(&polled_mask[fd], ~tid_bit); _HA_ATOMIC_AND(&polled_mask[fd], ~tid_bit);
} }
else { else {
/* OK fd has to be monitored, it was either added or changed */ /* OK fd has to be monitored, it was either added or changed */
@ -66,7 +66,7 @@ static int _update_fd(int fd, int start)
else if (polled_mask[fd] & tid_bit) else if (polled_mask[fd] & tid_bit)
EV_SET(&kev[changes++], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); EV_SET(&kev[changes++], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
HA_ATOMIC_OR(&polled_mask[fd], tid_bit); _HA_ATOMIC_OR(&polled_mask[fd], tid_bit);
} }
return changes; return changes;
} }
@ -89,7 +89,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) { for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
fd = fd_updt[updt_idx]; fd = fd_updt[updt_idx];
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
if (!fdtab[fd].owner) { if (!fdtab[fd].owner) {
activity[tid].poll_drop++; activity[tid].poll_drop++;
continue; continue;

View File

@ -65,7 +65,7 @@ static void _update_fd(int fd, int *max_add_fd)
/* fd totally removed from poll list */ /* fd totally removed from poll list */
hap_fd_clr(fd, fd_evts[DIR_RD]); hap_fd_clr(fd, fd_evts[DIR_RD]);
hap_fd_clr(fd, fd_evts[DIR_WR]); hap_fd_clr(fd, fd_evts[DIR_WR]);
HA_ATOMIC_AND(&polled_mask[fd], 0); _HA_ATOMIC_AND(&polled_mask[fd], 0);
} }
else { else {
/* OK fd has to be monitored, it was either added or changed */ /* OK fd has to be monitored, it was either added or changed */
@ -79,7 +79,7 @@ static void _update_fd(int fd, int *max_add_fd)
else else
hap_fd_set(fd, fd_evts[DIR_WR]); hap_fd_set(fd, fd_evts[DIR_WR]);
HA_ATOMIC_OR(&polled_mask[fd], tid_bit); _HA_ATOMIC_OR(&polled_mask[fd], tid_bit);
if (fd > *max_add_fd) if (fd > *max_add_fd)
*max_add_fd = fd; *max_add_fd = fd;
} }
@ -106,7 +106,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) { for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
fd = fd_updt[updt_idx]; fd = fd_updt[updt_idx];
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
if (!fdtab[fd].owner) { if (!fdtab[fd].owner) {
activity[tid].poll_drop++; activity[tid].poll_drop++;
continue; continue;
@ -129,7 +129,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
* we don't need every thread ot take care of the * we don't need every thread ot take care of the
* update. * update.
*/ */
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~all_threads_mask); _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~all_threads_mask);
done_update_polling(fd); done_update_polling(fd);
} else } else
continue; continue;
@ -140,7 +140,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
/* maybe we added at least one fd larger than maxfd */ /* maybe we added at least one fd larger than maxfd */
for (old_maxfd = maxfd; old_maxfd <= max_add_fd; ) { for (old_maxfd = maxfd; old_maxfd <= max_add_fd; ) {
if (HA_ATOMIC_CAS(&maxfd, &old_maxfd, max_add_fd + 1)) if (_HA_ATOMIC_CAS(&maxfd, &old_maxfd, max_add_fd + 1))
break; break;
} }
@ -156,7 +156,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
new_maxfd--; new_maxfd--;
if (new_maxfd >= old_maxfd) if (new_maxfd >= old_maxfd)
break; break;
} while (!HA_ATOMIC_CAS(&maxfd, &old_maxfd, new_maxfd)); } while (!_HA_ATOMIC_CAS(&maxfd, &old_maxfd, new_maxfd));
thread_harmless_now(); thread_harmless_now();
@ -235,7 +235,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
/* always remap RDHUP to HUP as they're used similarly */ /* always remap RDHUP to HUP as they're used similarly */
if (e & POLLRDHUP) { if (e & POLLRDHUP) {
HA_ATOMIC_OR(&cur_poller.flags, HAP_POLL_F_RDHUP); _HA_ATOMIC_OR(&cur_poller.flags, HAP_POLL_F_RDHUP);
n |= FD_POLL_HUP; n |= FD_POLL_HUP;
} }
fd_update_events(fd, n); fd_update_events(fd, n);

View File

@ -56,7 +56,7 @@ static void _update_fd(int fd, int *max_add_fd)
/* fd totally removed from poll list */ /* fd totally removed from poll list */
hap_fd_clr(fd, fd_evts[DIR_RD]); hap_fd_clr(fd, fd_evts[DIR_RD]);
hap_fd_clr(fd, fd_evts[DIR_WR]); hap_fd_clr(fd, fd_evts[DIR_WR]);
HA_ATOMIC_AND(&polled_mask[fd], 0); _HA_ATOMIC_AND(&polled_mask[fd], 0);
} }
else { else {
/* OK fd has to be monitored, it was either added or changed */ /* OK fd has to be monitored, it was either added or changed */
@ -70,7 +70,7 @@ static void _update_fd(int fd, int *max_add_fd)
else else
hap_fd_set(fd, fd_evts[DIR_WR]); hap_fd_set(fd, fd_evts[DIR_WR]);
HA_ATOMIC_OR(&polled_mask[fd], tid_bit); _HA_ATOMIC_OR(&polled_mask[fd], tid_bit);
if (fd > *max_add_fd) if (fd > *max_add_fd)
*max_add_fd = fd; *max_add_fd = fd;
} }
@ -98,7 +98,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) { for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
fd = fd_updt[updt_idx]; fd = fd_updt[updt_idx];
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
if (!fdtab[fd].owner) { if (!fdtab[fd].owner) {
activity[tid].poll_drop++; activity[tid].poll_drop++;
continue; continue;
@ -120,7 +120,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
* we don't need every thread ot take care of the * we don't need every thread ot take care of the
* update. * update.
*/ */
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~all_threads_mask); _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~all_threads_mask);
done_update_polling(fd); done_update_polling(fd);
} else } else
continue; continue;
@ -132,7 +132,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
/* maybe we added at least one fd larger than maxfd */ /* maybe we added at least one fd larger than maxfd */
for (old_maxfd = maxfd; old_maxfd <= max_add_fd; ) { for (old_maxfd = maxfd; old_maxfd <= max_add_fd; ) {
if (HA_ATOMIC_CAS(&maxfd, &old_maxfd, max_add_fd + 1)) if (_HA_ATOMIC_CAS(&maxfd, &old_maxfd, max_add_fd + 1))
break; break;
} }
@ -148,7 +148,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
new_maxfd--; new_maxfd--;
if (new_maxfd >= old_maxfd) if (new_maxfd >= old_maxfd)
break; break;
} while (!HA_ATOMIC_CAS(&maxfd, &old_maxfd, new_maxfd)); } while (!_HA_ATOMIC_CAS(&maxfd, &old_maxfd, new_maxfd));
thread_harmless_now(); thread_harmless_now();