efence: Fix it all and add a test
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 6 Jun 2017 20:54:01 +0000 (16:54 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 7 Jun 2017 15:38:14 +0000 (11:38 -0400)
commit3c77917de7a8eaeef04859c36aee9d9c14cb4e0e
treeb2ccf215855a6e4577d33637105673952010d1a8
parent249222a498fe8626a670d1e0326df2f3a25c77ea
efence: Fix it all and add a test

To use it, link with -lelectric-fence.  You can do this from your top-level
Makelocal.  e.g. CFLAGS_USER or _TESTS += -lelectric-fence.

This doesn't support C++.  For that, we can look into libduma or something.

The biggest pain was that gcc was optimizing away internalUse and other
flag variables.  That's because it knows about malloc(), but doesn't know
that we are overriding it.  So we have to disable that optimization.

The other thing was locking: first off, our trylock returns a bool (TRUE or
FALSE), not an int (0 or 1).  Second, malloc and free are called from vcore
context, so we can't use a mutex.  Much like with Glibc's malloc lock, we
need to use spin_pdr locks.  Finally, we need to lock inside memalign, not
in the outer functions.  Specifically, someone could be calling memalign
directly and be unprotected.  There's nothing in malloc/calloc/valloc/etc
that needs to be protected.

I also added wrappers for functions like posix_memalign(), and removed the
obnoxious version printing.  I removed tstheap, put its guts in one of our
utests, and added a test for catching faults.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tests/Makefile
tests/electric-fence/Makefrag [deleted file]
tests/electric-fence/tstheap.c [deleted file]
user/electric-fence/Makefile
user/electric-fence/efence.c
user/utest/Makefile
user/utest/efence.c [new file with mode: 0644]