As one national park director once said: "my problems start when the
dumber of my visitors meet the smarter of my bears".
Old inline asm used specific hardcoded registers "assuming that gcc
doesn't do anything funny with these". Unfortunately now it does,
especially when this function is inlined. We ended up restoring a
wrong context. The result was mysterious infinite memory faults.
Rewrite in safer inline asm, so that gcc is not confused.
Many thanks to chs@ for his patience.
- Some of what was defined as "generic itimer" behavior turned out to be
ptimer-specific. As such, everything related to the "fired timer queue"
is now specific to ptimers, and the queue and softint handle fields of
itimer_ops are not needed.
- Split itimer_fini() into 2 parts: itimer_poision() marks the timer as
dead and attempts to cancel it. itimer_fini() is then just responsible
for freeing itimer resources and releasing the lock. They are split
into two parts, as ptimers require an addition processing step between
those two operations, but other kinds of itimers do not necessarily require
that.
- Export a few more itimer-related symbols that other itimer types will
need.
Riding previous kernel version bump since there are no external uses of
this code since the version bump that accompanied the original change.
The first parameter of the macro was always stdout, and there was no
apparent reason to pass anything else there.
Let the compiler decide whether to inline this or not, it's not
time-critical.
Since Var_Export1 is neither exported by the module nor does it belong
to the Var type, the previous function name was misleading. The 1 in
the function name was not as expressive as possible. The new name
aligns nicely with UnexportVar, which is a very young name as well.
Now that errors in the main targets and in their dependencies have the
same effect on the .END node and its dependencies, the two variables can
be merged.
Whether in -k mode or not, the exit status tells whether all requested
targets were made or not. If a dependency could not be made, the main
target was not made as well, therefore the exit status must be nonzero
in such a case.
This part of the code lacked proper unit tests until today. The unit
test deptgt-end-fail.mk is compatible with make>=2003 at least, allowing
to compare the output over time.
In 2003, in the ok-ok-ok-ok case, "Making all from all-dep." was printed
twice in a row, for whatever reason ... (40 minutes later) ... If I had
just made the two commands for 'all' and '.END' more distinguishable.
Back in 2003, the local variables for .END had not been initialized,
instead the .END node was run with the local variables of the last
preceding node. In this case, that node was 'all', therefore ${.TARGET}
had obviously expanded to 'all'.
Somewhere in 2004, the shell commands were no longer run with the -e
flag, which resulted in the "exit status $?" line to be printed in cases
that had stopped early before.
Somewhere in 2005, the local variables for the .END node had been fixed.
The variable ${.TARGET} now had the value '.END', just as expected. In
addition, the dependencies for the .END node were made, although without
getting their proper local variables. This resulted in the output
"Making out of nothing" instead of the expected "Making end-dep out of
nothing".
Still in 2005, in the test case "all=ok all-dep=ok end=ok end-dep=ERR",
the error code of the failed 'end-dep' was first reported as "*** Error
code 1 (continuing)". To compensate for this improvement, a new bug had
been introduced. The test case "all=ok all-dep=ok end=ERR end-dep=ERR"
had properly exited with status 1 on 2005-01-01, but on 2006-01-01 it
exited with status 0, thereby ignoring errors in the .END node.
Somewhere in 2008, some of the error messages (but not all) were
directed to stderr instead of stdout. The actual output stayed the same
though.
Somewhere in 2011, the dependency of the .END node got its own local
variables, and ${.TARGET} now expanded to 'end-dep', as expected.
Somewhere in 2016, the two empty lines between the "*** Error code 1
(continuing)" and the "Stop." got compressed into a single empty line.
On 2020-12-07 (that is, today), the exit status 1 has been restored in
the error cases, after it had been wrong for at least 14 years.
Adding an individual test for each of the 16 combinations would have
been too much manual work, and it's not easy to come up with a good
naming scheme for all the tests, keeping them short and expressive at
the same time.
Earlier versions of make didn't know the -v option to print the expanded
value of a variable. To make the test runnable by older makes as well,
switch to -V instead, which has been available much longer.