mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-24 23:31:40 +02:00
MEDIUM: fd/poller: turn running_mask to group-local IDs
From now on, the FD's running_mask only refers to local thread IDs. However, there remains a limitation, in updt_fd_polling(), we temporarily have to check and set shared FDs against .thread_mask, which still contains global ones. As such, nbtgroups > 1 may break (but this is not yet supported without special build options).
This commit is contained in:
parent
6d3c501c08
commit
a707d02657
@ -413,7 +413,7 @@ static inline ulong fd_get_running(int fd, uint desired_tgid)
|
|||||||
*/
|
*/
|
||||||
static inline long fd_clr_running(int fd)
|
static inline long fd_clr_running(int fd)
|
||||||
{
|
{
|
||||||
return _HA_ATOMIC_AND_FETCH(&fdtab[fd].running_mask, ~tid_bit);
|
return _HA_ATOMIC_AND_FETCH(&fdtab[fd].running_mask, ~ti->ltid_bit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepares <fd> for being polled on all permitted threads of this group ID
|
/* Prepares <fd> for being polled on all permitted threads of this group ID
|
||||||
|
10
src/fd.c
10
src/fd.c
@ -376,7 +376,7 @@ void fd_delete(int fd)
|
|||||||
* safely delete the FD. Most of the time it will be the current thread.
|
* safely delete the FD. Most of the time it will be the current thread.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
HA_ATOMIC_OR(&fdtab[fd].running_mask, tid_bit);
|
HA_ATOMIC_OR(&fdtab[fd].running_mask, ti->ltid_bit);
|
||||||
HA_ATOMIC_STORE(&fdtab[fd].thread_mask, 0);
|
HA_ATOMIC_STORE(&fdtab[fd].thread_mask, 0);
|
||||||
if (fd_clr_running(fd) == 0)
|
if (fd_clr_running(fd) == 0)
|
||||||
_fd_delete_orphan(fd);
|
_fd_delete_orphan(fd);
|
||||||
@ -434,7 +434,7 @@ int fd_takeover(int fd, void *expected_owner)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
old = 0;
|
old = 0;
|
||||||
if (!HA_ATOMIC_CAS(&fdtab[fd].running_mask, &old, tid_bit)) {
|
if (!HA_ATOMIC_CAS(&fdtab[fd].running_mask, &old, ti->ltid_bit)) {
|
||||||
fd_drop_tgid(fd);
|
fd_drop_tgid(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -449,7 +449,7 @@ int fd_takeover(int fd, void *expected_owner)
|
|||||||
fd_stop_recv(fd);
|
fd_stop_recv(fd);
|
||||||
|
|
||||||
/* we're done with it */
|
/* we're done with it */
|
||||||
HA_ATOMIC_AND(&fdtab[fd].running_mask, ~tid_bit);
|
HA_ATOMIC_AND(&fdtab[fd].running_mask, ~ti->ltid_bit);
|
||||||
|
|
||||||
/* no more changes planned */
|
/* no more changes planned */
|
||||||
fd_drop_tgid(fd);
|
fd_drop_tgid(fd);
|
||||||
@ -531,7 +531,7 @@ int fd_update_events(int fd, uint evts)
|
|||||||
fd_drop_tgid(fd);
|
fd_drop_tgid(fd);
|
||||||
return FD_UPDT_MIGRATED;
|
return FD_UPDT_MIGRATED;
|
||||||
}
|
}
|
||||||
} while (!HA_ATOMIC_CAS(&fdtab[fd].running_mask, &rmask, rmask | tid_bit));
|
} while (!HA_ATOMIC_CAS(&fdtab[fd].running_mask, &rmask, rmask | ti->ltid_bit));
|
||||||
|
|
||||||
/* with running we're safe now, we can drop the reference */
|
/* with running we're safe now, we can drop the reference */
|
||||||
fd_drop_tgid(fd);
|
fd_drop_tgid(fd);
|
||||||
@ -594,7 +594,7 @@ int fd_update_events(int fd, uint evts)
|
|||||||
* This is detected by both thread_mask and running_mask being 0 after
|
* This is detected by both thread_mask and running_mask being 0 after
|
||||||
* we remove ourselves last.
|
* we remove ourselves last.
|
||||||
*/
|
*/
|
||||||
if ((fdtab[fd].running_mask & tid_bit) &&
|
if ((fdtab[fd].running_mask & ti->ltid_bit) &&
|
||||||
fd_clr_running(fd) == 0 && !fdtab[fd].thread_mask) {
|
fd_clr_running(fd) == 0 && !fdtab[fd].thread_mask) {
|
||||||
_fd_delete_orphan(fd);
|
_fd_delete_orphan(fd);
|
||||||
return FD_UPDT_CLOSED;
|
return FD_UPDT_CLOSED;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user