SE: Ignore FUTEX_PRIVATE_FLAG of sys_futex
This patch ignores the FUTEX_PRIVATE_FLAG of the sys_futex system call in SE mode. With this patch, when sys_futex with the options FUTEX_WAIT_PRIVATE or FUTEX_WAKE_PRIVATE is emulated, the FUTEX_PRIVATE_FLAG is ignored and so their behaviours are the regular FUTEX_WAIT and FUTEX_WAKE. Emulating FUTEX_WAIT_PRIVATE and FUTEX_WAKE_PRIVATE as if they were non-private is safe from a functional point of view. The FUTEX_PRIVATE_FLAG does not change the semantics of the futex, it's just a mechanism to improve performance under certain circunstances that can be ignored in SE mode.
This commit is contained in:
parent
9cd0c5ecc8
commit
c8de765468
2 changed files with 3 additions and 1 deletions
|
@ -225,6 +225,7 @@ class Linux : public OperatingSystem
|
||||||
static const unsigned TGT_FUTEX_WAKE = 1;
|
static const unsigned TGT_FUTEX_WAKE = 1;
|
||||||
static const unsigned TGT_EAGAIN = 11;
|
static const unsigned TGT_EAGAIN = 11;
|
||||||
static const unsigned TGT_EWOULDBLOCK = TGT_EAGAIN;
|
static const unsigned TGT_EWOULDBLOCK = TGT_EAGAIN;
|
||||||
|
static const unsigned TGT_FUTEX_PRIVATE_FLAG = 128;
|
||||||
|
|
||||||
}; // class Linux
|
}; // class Linux
|
||||||
|
|
||||||
|
|
|
@ -359,6 +359,7 @@ futexFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||||
DPRINTF(SyscallVerbose, "In sys_futex: Address=%llx, op=%d, val=%d\n",
|
DPRINTF(SyscallVerbose, "In sys_futex: Address=%llx, op=%d, val=%d\n",
|
||||||
uaddr, op, val);
|
uaddr, op, val);
|
||||||
|
|
||||||
|
op &= ~OS::TGT_FUTEX_PRIVATE_FLAG;
|
||||||
|
|
||||||
if (op == OS::TGT_FUTEX_WAIT) {
|
if (op == OS::TGT_FUTEX_WAIT) {
|
||||||
if (timeout != 0) {
|
if (timeout != 0) {
|
||||||
|
@ -410,7 +411,7 @@ futexFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||||
"thread contexts\n", wokenUp);
|
"thread contexts\n", wokenUp);
|
||||||
return wokenUp;
|
return wokenUp;
|
||||||
} else {
|
} else {
|
||||||
warn("sys_futex: op %d is not implemented, just returning...");
|
warn("sys_futex: op %d is not implemented, just returning...", op);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue