Commit graph

102 commits

Author SHA1 Message Date
Guy Harris
e8f42c6b48 Include config.h first; it defines _FILE_OFFSET_BITS, and if some system
header later causes it to be redefined - as happens on my Solaris 11
virtual machine - we get a redefinition warning, which gets treated as
an error.

svn path=/trunk/; revision=51344
2013-08-14 00:31:14 +00:00
Evan Huus
36ff6f2c25 Add support for allocating more than will fit in a single block, through the use
of a jumbo flag in the chunk header.

svn path=/trunk/; revision=51299
2013-08-11 17:18:19 +00:00
Evan Huus
8fafa9b758 Add wmem_tree_is_empty(). Also permit lookups on a NULL tree for compatibility
with emem.

svn path=/trunk/; revision=51045
2013-07-31 01:48:47 +00:00
Evan Huus
a9bccc8dc8 Don't force the allocator choice in the data-structure tests, we want to be able
to override that to simple for valgrinding (we still force the allocator in the
allocator and timing tests, of course).

svn path=/trunk/; revision=50971
2013-07-28 12:55:37 +00:00
Evan Huus
b43996c8ab Fix a bug in the gc routine discovered while formally working out parts of the
algorithm.

Also add a test case to excercise it for future.

svn path=/trunk/; revision=50970
2013-07-28 12:46:44 +00:00
Evan Huus
a076d6332e Use a #define, tweak a comment.
svn path=/trunk/; revision=50954
2013-07-27 21:56:43 +00:00
Evan Huus
037fc022da Add wmem queue 'implementation' by wrapping wmem_list and wmem_stack.
Also a bit of misc. refactoring of the stack while I was there, and doc tweaks.

svn path=/trunk/; revision=50769
2013-07-21 21:13:30 +00:00
Evan Huus
6635f5ef67 Replace wmem slist (singly-linked) with wmem list (doubly-linked).
The overhead is not large, and it makes append much faster (O(1) vs O(n)).

It also will make a queue easy to add, which I need for a dissector I'm
writing...

svn path=/trunk/; revision=50744
2013-07-20 20:33:38 +00:00
Evan Huus
e1268955c7 Add wmem_array_sort() which just hands off to the standard library's qsort().
svn path=/trunk/; revision=50411
2013-07-06 17:47:32 +00:00
Evan Huus
c574f7d1ea Simple growable array implementation for wmem.
svn path=/trunk/; revision=50400
2013-07-06 04:02:08 +00:00
Evan Huus
31bd48bce3 *sigh*
From the comment above wmem_tree_insert32_array():
 * If you use ...32_array() calls you MUST make sure that every single node
 * you add to a specific tree always has a key of exactly the same number of
 * keylen words or things will most likely crash. Or at least that every single
 * item that sits behind the same top level node always have exactly the same
 * number of words.

So clearly generating thousands of keys with random lengths while testing is
going to cause problems. Generate a set of random lengths, then use those
lengths consistently (but still generating random keys of those lengths).

Should hopefully fix the intermittent build-bot failures.

(unfortunately this does not manifest nicely, and I cannot see an easy way to
assert it so that we catch other people trying to use different-length key
subtrees)

svn path=/trunk/; revision=50184
2013-06-27 03:44:48 +00:00
Evan Huus
32f4010527 Remove debugging lines from wmem_test, I think I've figured out the problem.
svn path=/trunk/; revision=50181
2013-06-27 03:00:33 +00:00
Evan Huus
a69be407ab Arrays seems to be where the failure is, so remove excess verbiage around other
tests, and add more details to that section.

Now we wait for the buildbots to fail again...

svn path=/trunk/; revision=50156
2013-06-25 22:32:53 +00:00
Evan Huus
29c75dae91 So it comes to this...
Put in a whole bunch of stderr output in the wmem tree tests in the hopes that
the next time one of the buildbots randomly (and irreproducibly) fails on this
step we'll have at least a bit of a hint as to where it happened.

svn path=/trunk/; revision=50131
2013-06-24 21:59:02 +00:00
Evan Huus
e13d73e038 Rework wmem scoping limits so that users can still get a handle to a pool when
it is out of scope, they just can't *allocate* in the pool. This is necessary
because file-scope trees (migrating from emem) are set up on program
initialization when there is no file in scope - they need to initialize with the
handle, they just won't use it until a file is actually in scope.

svn path=/trunk/; revision=50046
2013-06-19 18:28:13 +00:00
Evan Huus
8ec8f94db7 Resurrect wmem_memdup in its own misc. utilities group. Emem provides it, so we
need to provide an analogue at least for now.

svn path=/trunk/; revision=50018
2013-06-18 21:42:54 +00:00
Evan Huus
d487bba75f Add wmem_alloc_array, wmem_strsplit, wmem_strconcat.
svn path=/trunk/; revision=50017
2013-06-18 21:25:37 +00:00
Evan Huus
881845a555 Scrap wmem_memdup, it's not actually as useful as I thought it would be.
svn path=/trunk/; revision=50009
2013-06-18 19:01:01 +00:00
Evan Huus
701fb00afa Add test block for wmem_tree_lookup32_array_le(), fix other tests where certain
random seeds would cause collisions and false failures.

svn path=/trunk/; revision=50004
2013-06-18 06:22:47 +00:00
Evan Huus
54959c293d Wmem tree tests with non-trivial keys.
svn path=/trunk/; revision=50003
2013-06-18 05:41:16 +00:00
Evan Huus
7c99d55773 Re-port a bunch of the red-black tree code from wmem with fewer modifications,
and enable the tests.

Lesson: make it work, *then* refactor it into sanity.

svn path=/trunk/; revision=50002
2013-06-18 05:31:12 +00:00
Evan Huus
b5c538ff81 Add tests for red-black tree array keys, if0-ed out until I can make them not
blow up. Not sure if the tests are wrong or if I broke something during the port
from wmem...

svn path=/trunk/; revision=49998
2013-06-18 00:21:32 +00:00
Evan Huus
858cb85eb4 Fix the test to respect the new behaviour.
svn path=/trunk/; revision=49971
2013-06-17 00:45:44 +00:00
Evan Huus
55264582be More callback tweaks, to permit unregistering a callback from the same place
it was originally registered.

svn path=/trunk/; revision=49969
2013-06-16 22:37:55 +00:00
Evan Huus
88c5b2e892 Rework the user callback code a bit to make it saner to use with the auto-reset
trees.

svn path=/trunk/; revision=49966
2013-06-16 22:07:24 +00:00
Evan Huus
28dafa414a Fix occasional wmem_test failure, allocator destruction order matters
(should it?)

svn path=/trunk/; revision=49951
2013-06-16 01:44:09 +00:00
Evan Huus
6fd601bc3b Most of a red-black tree implementation for wmem, based heavily on the emem
version.

One plane trip's worth of work.

svn path=/trunk/; revision=49945
2013-06-15 10:40:56 +00:00
Evan Huus
226b39f1d7 Add memdup function to wmem.
svn path=/trunk/; revision=49857
2013-06-09 13:49:16 +00:00
Evan Huus
5426ba4e02 Minor refactor: make the framework responsible for allocating and freeing the
actual wmem_allocator_t structure. This simplifies the internal API and
deduplicates a few alloc/free calls in the individual allocator implementations.

I'd originally made the allocators responsible for this on purpose with the
idea that they'd be able to optimize something clever based on the type of
allocator, but that's clearly more work and complexity than it's worth given
the small number of allocators we create/destroy.

svn path=/trunk/; revision=49512
2013-05-22 15:42:12 +00:00
Gerald Combs
c0702583d3 Make the minimum supported GLib version 2.16.
svn path=/trunk/; revision=49444
2013-05-20 17:27:05 +00:00
Evan Huus
f2bdbd2b32 Use a readable name for the wmem callback test. Warn that reallocing memory
for which a callback is registered is also a fairly stupid thing to do.

svn path=/trunk/; revision=49354
2013-05-16 23:38:31 +00:00
Evan Huus
d860a01aaf Round two of wmem cleanup callbacks. While the emem tree behaviour will require
recurring callbacks, I suspect most other potential uses will be once-only, so
make that possible, and improve the documentation on the remaining issues.

Also separate out the code into its own files and the testing into its own
test case.

svn path=/trunk/; revision=49209
2013-05-08 01:14:01 +00:00
Evan Huus
2e92c6dfde Add user callbacks to wmem. This feature is a generic way to transparently mimic
the behaviour emem has for seasonal trees, which is that the master tree
structure is not actually seasonal - it is permanent. When the seasonal memory
pool is cleared, the root node pointer in all of these permanent trees is set
to NULL, and the pool takes care of actually freeing the nodes.

Wmem can now mimic this by allocating the tree header struct in epan_scope(),
allocating any node structs in file_scope(), and registering a callback on
file_scope() that NULLs the pointer in the epan_scope() header. Yes, this is
confusing, but it seemed simpler than adding manual callback registrations to
every single dissector that currently uses seasonal trees.

The callbacks may also be useful for other things that need cleanup (I'm
thinking resource handles stored in wmem memory that need to be fclosed or
what-have-you before they the handle is lost).

As indicated by the number of caveats in README.wmem, the implementation
probably needs a bit of work to make it safer/saner/more-useful. Thoughts
(or patches!) in this direction are more than welcome.

svn path=/trunk/; revision=49205
2013-05-07 19:23:10 +00:00
Evan Huus
60fe9f1b9e Stub out the wmem test suite for older Glibs. This should restore
compatibility with GLIB 2.14.

svn path=/trunk/; revision=49161
2013-05-04 12:42:28 +00:00
Evan Huus
e8c813b2ea In part from Raúl Pérez Clavero via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8275
Implement wmem_slist_append().

svn path=/trunk/; revision=49094
2013-04-30 01:23:10 +00:00
Evan Huus
5deac1e6e1 Wmem string-buffer improvements:
- better tests
- fix a bug caught by the better tests
- implement append_c and append_unichar, with tests

Wmem string-buffers now have feature parity with their emem equivalents, so
remove them from the TODO list.

svn path=/trunk/; revision=49060
2013-04-26 21:30:24 +00:00
Evan Huus
2616e09140 Add truncate function to wmem strbuf.
svn path=/trunk/; revision=49010
2013-04-24 00:11:57 +00:00
Evan Huus
43e07d6d0d Add tests for wmem stack, and misc. tweaks to other tests.
The wmem test suite now covers all of the existing allocators, data
structures and utility functions in at least basic cases.

svn path=/trunk/; revision=48980
2013-04-22 21:23:16 +00:00
Gerald Combs
4f9a9cd3d3 Convert another instance of g_assert_cmpuint to g_assert.
svn path=/trunk/; revision=48967
2013-04-22 17:34:50 +00:00
Evan Huus
4983d99475 Improve wmem strbuf tests, add tests for string util. functions
svn path=/trunk/; revision=48964
2013-04-22 15:40:48 +00:00
Evan Huus
6ea50c8d2e Don't use g_assert_cmpuint, its definition breaks the Windows
buildbot for some reason; g_assert works just as well except
for providing less useful output on failures.

svn path=/trunk/; revision=48959
2013-04-22 01:29:13 +00:00
Evan Huus
2b9db8a7d4 Add wmem string-buffer tests and fix associated bugs.
svn path=/trunk/; revision=48957
2013-04-21 23:19:37 +00:00
Evan Huus
29b61239bc Add wmem tests for the singly-linked list implementation.
svn path=/trunk/; revision=48807
2013-04-10 14:11:13 +00:00
Evan Huus
ade9361071 Loop the timing test 128 times so that statistics work more in our favour.
Print the times to stdout so that in a failure case we can see how badly it
was off.

svn path=/trunk/; revision=48590
2013-03-27 17:30:12 +00:00
Evan Huus
0d2e02954f Add a timing test to check that the block allocator is actually faster than the
simple one. At the moment it seems to be between 2x and 2.5x faster in the
common case (a simple sequence of allocations followed by free_all).

svn path=/trunk/; revision=48588
2013-03-27 16:37:12 +00:00
Evan Huus
0a8b96a41b Generalize the allocator test function and use it to test the simple and
the strict allocators as well.

svn path=/trunk/; revision=48586
2013-03-27 12:43:29 +00:00
Evan Huus
64af18ddda Fix -Wshadow that happens with some old versions of gcc (not mine, for some
reason).

Don't use g_assert_cmpuint, since it apparently causes warnings on windows that
I don't know how to get rid of safely without breaking the conditions being
checked.

svn path=/trunk/; revision=48575
2013-03-27 02:28:45 +00:00
Evan Huus
4252a18c90 Greatly improve wmem tests, including random fuzz-style testing. Improve
assertions in the block allocator, and fix one rare potential underflow caught
by the improved tests.

The tests now take ~200MB and 5-10 seconds to run. Hopefully this is small
enough for the build-bots to handle, if not then we can reduce the max
allocation size or max iterations to suit.

svn path=/trunk/; revision=48574
2013-03-27 00:27:45 +00:00
Guy Harris
986d423b5b Replace implicit conversions with explicit casts.
svn path=/trunk/; revision=48533
2013-03-24 18:17:21 +00:00
Evan Huus
d30dbcbf9e Fix a few small bugs in the block allocator and add some more assertions to it
that run during normal usage. Simplify, expand and enable the test coverage,
since what's there now passes.

svn path=/trunk/; revision=48522
2013-03-24 12:53:22 +00:00
Evan Huus
8ccea72f10 Initial simple block allocator tests, not being run by default because they're
failing. I suspect it has to do with my lack of understanding of glib's unit
test framework, not the code being tested.

svn path=/trunk/; revision=48519
2013-03-24 00:45:32 +00:00
Evan Huus
4ef09071b5 Add empty placeholder wmem test suite. Hopefully my automake skills were
up for the challenge.

svn path=/trunk/; revision=48436
2013-03-20 00:28:36 +00:00