mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 14:38:21 +00:00
futex: misc fixes
This commit is contained in:
@@ -103,10 +103,13 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value
|
|||||||
ret.errno = ENOMEM;
|
ret.errno = ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
POLL_INITHEADER(&futex->pollheader);
|
||||||
|
|
||||||
ret.errno = setfutex(futex, physical);
|
ret.errno = setfutex(futex, physical);
|
||||||
if (ret.errno)
|
if (ret.errno) {
|
||||||
|
free(futex);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
++futex->waiting;
|
++futex->waiting;
|
||||||
@@ -127,6 +130,8 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value
|
|||||||
} else if (futex->waking == 0) {
|
} else if (futex->waking == 0) {
|
||||||
// should go back to sleep
|
// should go back to sleep
|
||||||
poll_leave(&desc);
|
poll_leave(&desc);
|
||||||
|
desc.event = NULL;
|
||||||
|
desc.data[0].revents = 0;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
// can leave normally!
|
// can leave normally!
|
||||||
@@ -137,16 +142,17 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value
|
|||||||
|
|
||||||
// clean up if needed
|
// clean up if needed
|
||||||
if (futex->waiting == 0) {
|
if (futex->waiting == 0) {
|
||||||
|
poll_leave(&desc);
|
||||||
doleave = false;
|
doleave = false;
|
||||||
free(futex);
|
|
||||||
removefutex(physical);
|
removefutex(physical);
|
||||||
|
free(futex);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.ret = 0;
|
ret.ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ret.errno = ENOSYS;
|
ret.errno = ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user