David Gibson [Fri, 3 Jun 2016 08:42:03 +0000 (18:42 +1000)]
altstack: Don't log internal calls in test cases
altstack/test/run.c uses some hairy macros to intercept the standard
library functions that altstack uses. This has two purposes: 1) to
conditionally cause those functions to fail, and thereby test altstack's
error paths, and 2) log which of the library functions was called in each
testcase.
The second function isn't actually useful - for the purposes of testing the
module, we want to check the actual behaviour, not what calls it made in
what order to accomplish it. Explicitly checking the calls makes it much
harder to change altstack's implementation without breaking the tests.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 3 Jun 2016 08:42:02 +0000 (18:42 +1000)]
altstack: Don't use 0 pointer literals
In a number of places the altstack module uses a literal '0' for pointer
values. That's correct C, but doesn't make it obvious on a quick read
whether values are integers or pointers. This patch changes those cases
to use the NULL define instead.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 3 Jun 2016 08:42:01 +0000 (18:42 +1000)]
altstack: Use ptrint instead of bare casts
Functions invoked with altstack take a void * parameter. However, the
test program wants to pass an integer, and so uses the trick of casting
the integer values to (void *) and back again.
The ptrint() module handles exactly this case in a more portable and
(somewhat) typesafe way, so use that instead.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 3 Jun 2016 08:42:00 +0000 (18:42 +1000)]
altstack: Restore alternate signal stack state
altstack relies on catching a SIGSEGV caused when overrunning the stack.
This means that the SEGV handler itself can't use the already overflowed
stack, and so we use sigaltstack() to assign the signal handler a different
stack. On completion, altstack() clears the alternate signal stack.
However, it's possible that the calling program could be using
sigaltstack() for its own reasons, so it's more correct to restore the
sigaltstack() state to that from the beginning of the altstack() call.
This patch implements this behaviour.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 3 Jun 2016 08:41:59 +0000 (18:41 +1000)]
altstack: Consolidate thread-local variables
altstack uses a number of __thread variables to track internal state. This
allows altstack to be thread-safe, although it's still not re-entrant.
This patch gathers all these variables into a single per-thread state
structure. This makes it easy to see at a glance what the whole of the
required state is, and thereby easier to reason about correctness of
changes to the implementation.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Sat, 4 Jun 2016 10:21:33 +0000 (20:21 +1000)]
tlist: Add tlist_next() and tlist_prev() functions
An odd omission from the tlist module is basic tlist_next() and
tlist_prev() macros matching list_next() and list_prev() in the basic
list module. This adds them.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
David Gibson [Fri, 3 Jun 2016 10:07:10 +0000 (20:07 +1000)]
agar: Add static graph initializer
Sometimes it's not convenient to initialize an agar graph at runtime with
agar_init_graph(). This adds an AGAR_INIT_GRAPH() macro to do the same
thing as a static initializer.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Mon, 9 May 2016 19:44:47 +0000 (20:44 +0100)]
Build info files
All modules have a _info file (a C file, despite the lack of extension)
giving metadata for the module. The Makefiles have a rule to build these..
but it's broken (missing an include directive).
This patch fixes the rule, and builds the info binaries for all modules by
default. This is a useful check and also useful for manually inspecting
a module's metadata.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Thu, 5 May 2016 15:40:48 +0000 (16:40 +0100)]
Automatically determine which modules have source
Currently, build of ccan is controlled by two Make variables: MODS_WITH_SRC
and MODS_NO_SRC which list modules containing .c files, and modules with
only .h files respectively.
When adding new modules this is fiddly to get right, and there are a number
of modules already listed in the wrong variable. There's also some
redundant logic in the DIRS variable to again filter out modules without
source.
This simplifies things by having a single manually updated MODS variable
listing every module, and determining MODS_WITH_SOURCE programmatically.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 16 Feb 2016 12:35:41 +0000 (23:35 +1100)]
Correctly include dependencies for nested modules
Currently we pull auto-generated dependencies into the Makefile with
include ccan/*/*.d. That will omit any .d files from nested modules,
meaning things might not be correctly rebuilt there.
Correct this by using the list of modules instead of a 1-level wildcard.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 16 Feb 2016 12:32:34 +0000 (23:32 +1100)]
Exclude system headers from .d files
We currently generated .d dependency files with the -MD option to cc. That
includes system header files in the dependencies, which isn't often useful
and makes the .d more complicated than necessary.
This changes to -MMD which excludes system headers.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 16 Feb 2016 12:24:05 +0000 (23:24 +1100)]
Clean up use of 'rm' in Makefiles
Most of the ccan Makefiles use $(RM) to remove files. However, 'rm' is
traditionally considered one of the few shell tools which can be used in
Makefiles without indirecting via a variable.
rm is also typically invoked with -f in Makefiles, so that it doesn't cause
errors if the files don't exist (because they haven't been built). A
number of instances in ccan were missing this.
This corrects these warts.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 16 Feb 2016 11:53:50 +0000 (22:53 +1100)]
Add missing files to make clean
At present, "make clean" will not remove the module-Makefile files for
non-top-level modules. It also won't remove the generated config.h.
Correct those errors.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
should_grp_score_cos(x,y) wasn't holding up its part of the bargain, so
real data was used to generate a fudge curve to bring
should_grp_score_cos(x,y) results into the same space. Really this is a
terrible hack and the problem needs more thought. Evaluation of
should_grp_score_cos(x,y)'s performance benefit (given the relaxation of
the filter under the fudge curve) is sorely needed.
Andrew Jeffery [Sat, 20 Feb 2016 10:49:53 +0000 (21:19 +1030)]
strgrp: Use angular similarity for distance metric properties
Distance metrics allow us to compare similarity results, however
applying the change leads to test suite breakage as we no longer satisfy
the requirement that each filter's score is at most as large as that of
the previous filter^. As such, also stop ccanlint from executing the
tests that are known to fail until we work around the problem.
^ This is a problem that has existed since the introduction of the
cosine similarity filter, it just wasn't detected by the test suite.
Andrew Jeffery [Sat, 20 Feb 2016 11:03:04 +0000 (21:33 +1030)]
strgrp: Use ratio of hypotenuse for consistent comparisons
Ensure comparing filter results is sensible by using a consistent
calculation. Note that the cosine similarity measurement doesn't yet
conform and this can give spurious results that are not detected by the
test suite.
Rusty Russell [Tue, 8 Mar 2016 05:38:36 +0000 (16:08 +1030)]
shachain: clarify design in terms of binary tree, reverse indexes.
Olaoluwa Osuntokun came up with an alternative which used binary trees;
that's a much better way to explain it, so do that in design.txt and
update the implementation to work the same way.
Anthony Towns pointed out that the numbering is the reverse of the normal
hash chaining descriptions, so fix that too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
David Gibson [Fri, 12 Feb 2016 12:49:49 +0000 (23:49 +1100)]
generator: Allow generators to take arguments
Using some serious macro magic, this patch extends generators to allow
them to take arbitrary arguments. The arguments are marshalled into a
structure placed at the far end of the generator's stack when it is
created. Then, they're unmarshalled back into C parameters when we first
context switch into the generator.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Sat, 19 Jul 2014 07:00:15 +0000 (17:00 +1000)]
configurator: Add test for ucontext.h
This adds a new HAVE_UCONTEXT define, which indicates that ucontext.h
is present, and more-or-less works.
It also adds HAVE_POINTER_SAFE_MAKECONTEXT, which indicates whether
pointer valued arguments can be passed through the varargs parameters
to makecontext().
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Mon, 15 Feb 2016 11:49:54 +0000 (22:49 +1100)]
altstack: Clarify checking macros
The chkfail() and chkok() macros in altstack's test program are pretty
difficult to read. More importantly, though, they do all their tests with
one big ok1(). That means if the test fails, you get no indication which
of the checks was actually wrong, making debugging harder.
This reworks the macros into a more verbose form that's easier to read,
and splits them into multiple ok1() tests to make failures more explicit.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Mon, 15 Feb 2016 11:47:36 +0000 (22:47 +1100)]
altstack: Declare memory clobbers
altstack includes a couple of inline asm blocks with x86 push and pop
instructions. These instructions will access memory (the stack), but
that's not declared in inline asm statement. We seem to be getting away
with it, but in theory that could allow the compiler to re-order accesses
to local variables across the asm block. Since those blocks change the
location of the stack, that could be very bad.
Adding a "memory" clobber should prevent this (effectively making the asm
blocks a compiler memory barrier).
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Mon, 15 Feb 2016 11:43:07 +0000 (22:43 +1100)]
altstack: Include config.h in run.c
ccan programs should always include config.h before anything else to make
sure everything is set up correctly. Doing so in altstack's run.c means
it no longer needs an explicit _XOPEN_SOURCE 700, since _GNU_SOURCE is set
in config.h (for GNU libc, anyway).
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Mon, 15 Feb 2016 11:01:18 +0000 (22:01 +1100)]
altstack: Increase signal stack size
At present the altstack module uses a stack of size MINSIGSTKSZ for its
SIGSEGV handler. Although MINSIGSTKSZ is defined to be large enough to
execute a signal handler, it doesn't guarantee that you can do anything
very much within it.
With certain libc versions, MINSIGSTKSZ is not enough to execute the
longjmp() used in altstack. Specfically, with Ubuntu 12.04 (the default
install for Travis containers), the first time longjmp() is executed the
symbol must be resolved by the dynamic linker in a process which overruns
the MINSIGSTKSZ sized stack. That then corrupts local variables in
altstack() itself causing a number of subsequent failures.
This patch addresses the problem by changing from MINSIGSTKSZ to SIGSTKSZ
which is supposed to cover "the usual requirements for an alternate signal
stack".
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 26 Jan 2016 10:54:47 +0000 (21:54 +1100)]
cppmagic: Iteration
This implements macros which iterate across their arguments. This is
implemented in terms of (kinda sorta) recursion. In fact, they will stop
working with enough arguments, but the limit is large and can be easily
increased by changing the depth of the CPPMAGIC_EVAL() macro.
There are 3 iterators (for now):
CPPMAGIC_MAP
applies another macro to each of its remaining arguments - the results
are comma separated, so they can be passed into another CPPMAGIC_MAP
invocation.
CPPMAGIC_2MAP
does the same thing, but takes the arguments a pair at a time, using
a supplied two-argument macro.
CPPMAGIC_JOIN
combines the arguments with a chosen delimiter (effectively replacing
the commas between the arguments with the delimiter)
same thing, but takes the arguments a pair at a time.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 26 Jan 2016 10:32:07 +0000 (21:32 +1100)]
cppmagic: Allow multiple and deferred evaluation
Recursion (and therefore iteration) in cpp is difficult, since the
preprocessor explicitly looks for and inhibits recursion.
But, it's possible to trick it, up to a point. CPPMAGIC_DEFER1() and
CPPMAGIC_DEFER2() can "hide" a macro, preventing it from being expanded
and being noticed as recursion.
Along with that we need to cause extra expansion passes to be executed.
There has to be a finite limit here - true recursion is impossible - but
that number can be made very large pretty easily. CPPMAGIC_EVAL() multiply
expands its argument(s) - up to 1024 times.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 26 Jan 2016 09:52:32 +0000 (20:52 +1100)]
cppmagic: Logical operations
In order to implement fancier things, we need to represent truth values in
cpp. We use '0' and '1' strings, like in C, but we need ways to get these
values from other conditions.
CPPMAGIC_ISZERO() and CPPMAGIC_NONZERO() test if the argument is '0' or
anything else (ISZERO doubles as a logical not).
CPPMAGIC_ISEMPTY() and CPPMAGIC_NON_EMPTY() expand to 0 or 1 depending on
whether they have any arguments at all or not.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 26 Jan 2016 09:51:57 +0000 (20:51 +1100)]
cppmagic: New module
A module for some of the awesome / horrifying techniques described at:
http://jhnet.co.uk/articles/cpp_magic
https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms
Start off with just some simple things.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Mon, 1 Feb 2016 11:54:32 +0000 (22:54 +1100)]
.travis.yml: Add -k to make check script
At the moment when Travis runs make check it will stop on the first
failure. That's not particularly useful, so add a -k so that all ccanlint
failures can be seen.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Mon, 1 Feb 2016 11:50:45 +0000 (22:50 +1100)]
ccanlint: Report failures with --summary
When run in --summary mode ccanlint doesn't actually report whether it
passed or failed in the message . In particular this means that when make
check is run with -j, it can be hard to tell which modules failed.
This adds a more obvious failure message.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Rusty Russell [Wed, 3 Feb 2016 05:41:05 +0000 (16:11 +1030)]
rszshm: disable valgrind for tests.
It returns EINVAL instead of ENOMEM for test/run.c line 96, then
complains on line 137:
==29368== Invalid read of size 4
==29368== at 0x4033BC: main (run.c:137)
==29368== Address 0x400000000018 is not stack'd, malloc'd or (recently) free'd
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell [Wed, 3 Feb 2016 02:27:33 +0000 (12:57 +1030)]
ccanlint: add "_info ported" (for ccan/altstack).
If _info handles the arg "ported" it should print out 1 or 0; 0 means
it can't be compiled/run/tested on this platform. This lets ccanlint
easily skip such modules.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
David Gibson [Wed, 27 Jan 2016 13:14:19 +0000 (00:14 +1100)]
idtree: Fix comparison is always false warning
idtree.c:146 triggers a "comparison is always false" warning on some
compiler configurations, since the 'id' variable is unsigned.
Elsewhere in the module ids seem to be represented by (signed) ints, so
use the same convention here, suppressing the warning and also maybe being
more correct in other ways.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Wed, 27 Jan 2016 13:06:02 +0000 (00:06 +1100)]
htable: Mark functions constructed by HTABLE_DEFINE_TYPE as UNNEEDED
The HTABLE_DEFINE_TYPE macro builds a type-specific hash table by
constructing a bunch of simple wrapper functions. The user of the hash
table may not end up using all of these. With gcc the fact that the
functions are inline stops an warnings about unused functions, but that's
not the case with clang.
Suppress these warnings by marking all the constructed functions except
for name##_add() as UNNEEDED (using the macro from ccan/compiler). _add
is left alone on the grounds that a hash table you never add anything to
isn't much use, so this will help you to spot an entirely redundant
HTABLE_DEFINE_TYPE invocation. *_init() would be a more obvious choice,
except that there is both *_init() and *_init_sized() and you only need
to use one of these.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Wed, 27 Jan 2016 12:52:12 +0000 (23:52 +1100)]
strmap: Convert to using TCON_WRAP() instead of plain TCON()
The usual way of construction strmap objects is to use the STRMAP_MEMBERS()
macro which expands to both a raw strmap structure and a tcon type canary.
However, the tcon type canary involves a flexible array member which means
that in standard C99 STRMAP_MEMBERS() must appear only at the end of a
structure definition. But worse, that structure can then only appear at
the end of any other structure it is included in, which is pretty
inconvenient for the intended purpose of creating type specific strmaps.
gcc extensions allow this to work (somehow), but clang complains loudly
about it.
The tcon module already includes the TCON_WRAP() mechanism, which already
provides this same sort of type-specific definitions in a more general way.
So convert strmap (and its users) to that approach.
This removes STRMAP_MEMBERS() entirely, breaking compatibility. I'm hoping
strmap is used in few enough places that we can get away with that.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Wed, 27 Jan 2016 12:11:31 +0000 (23:11 +1100)]
aga: Annotate unused return values
bfs_dequeue() and dfs_pop() discard the return values of lqueue_dequeue()
and lstack_pop() respectively. This is correct, but causes warnings in
some compiler configurations (including the one currently used by
travis-ci.org).
Use the cast-to-void idiom to tell the compiler this is intentional.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Tue, 26 Jan 2016 11:28:41 +0000 (22:28 +1100)]
configurator: Clarify empty if
configurator.c contains an if with an empty statement on the same line as
the condition. This is very easy to misread, and also causes a warning
from clang, so move the ; onto the next line.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Dan Good [Tue, 5 Jan 2016 01:07:19 +0000 (01:07 +0000)]
deque: check HAVE_STATEMENT_EXPR, tweaks from feedback
Thanks to the detailed feedback from David Gibson, I made the
following improvements:
* add missing includes
* check for statement expression support, give an error if absent
* ccanlint directive to skip "without features" steps
* add license ref to top of source files
* rename run1.c test to api1.c
Joel Stanley [Wed, 9 Dec 2015 01:17:51 +0000 (11:47 +1030)]
web/logo: Use a relative protocol
The webfont forces http, which results in a mixed content warning if
you're visiting the site on https. Strip the protocol so we use whatever
the user has connected with.
Signed-off-by: Joel Stanley <joel@jms.id.au> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
David Gibson [Fri, 6 Nov 2015 01:26:17 +0000 (12:26 +1100)]
aga,agar: New shortcut2 sample graph and testcases based on it
This patch adds a new test graph "shortcut2" which includes a negative cost
edge. Along with that we add a testcase for Dijkstra's algorithm checking
that it gracefully fails in this case.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 6 Nov 2015 01:26:03 +0000 (12:26 +1100)]
aga,agar: New shortcut1 sample graph and testcases based on it
For all the existing test graphs, the shortest path by cost is also the
shortest path by number of edges. This patch adds a new test graph where
that is not the case, in order to test that the Dijkstra's algorithm
implementation correctly handles that case.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 6 Nov 2015 01:25:50 +0000 (12:25 +1100)]
aga,agar: Non-equal edge costs for parallel test graph
At the moment the "parallel" test graph just uses the default cost of 1
for all the links between the two nodes. This patch changes that so that
the links have cost 2, except (optionally) one with cost 1. This provides
a useful test for the Dijkstra's algorithm implementation to ensure that
it picks the correct link for the shortest path.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 6 Nov 2015 01:25:30 +0000 (12:25 +1100)]
aga,agar: Dijkstra's algorithm
Implement Dijkstra's algorithm for one-source shortest-path.
This uses the lpq module as the implementation of the priority queue. That
means this implementation is some way behind the theoretical efficiency of
Dijkstra's algorithm. It should be reasonably straightforward to swap out
the priority queue for a better one in the future, though.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson [Fri, 6 Nov 2015 01:23:53 +0000 (12:23 +1100)]
aga,agar: Add edge costs
This allows the edge_info callback to supply a cost or length for an edge.
For now we only support 'long' valued costs. If the callback doesn't
supply a cost, it's considered cost 1.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>