Brian Norris [Thu, 4 Oct 2012 21:59:44 +0000 (14:59 -0700)]
nodestack: destroy Nodes properly in ~NodeStack()
Brian Norris [Thu, 4 Oct 2012 21:57:37 +0000 (14:57 -0700)]
nodestack: use initializer list
Brian Norris [Thu, 4 Oct 2012 19:42:13 +0000 (12:42 -0700)]
model: assign "pending" return values in release_seq_heads()
Now that the lazy pending release sequences list is improved, return
more information from release_seq_heads().
Note that this change also affects the behavior of the last double loop;
now, even after discovering write(s) from one thread that might break the
release sequence, I continue exploring other threads. This has some pros
and cons:
Con:
* may cause more work in exploring many threads without gaining any
extra information
Pro:
* may help discover a write that *certainly* breaks the sequence,
whereas previously, we might have exited with an uncertain status
* builds a more thorough, complete set of writes that might break the
release sequence
The last point is the main intention, since we will require a complete
set for end-of-execution fixups. The others balance out to a net benefit
(and possibly a bugfix).
Brian Norris [Thu, 4 Oct 2012 19:15:14 +0000 (12:15 -0700)]
model: update pending release sequence list type
In working toward proper resolution of pending release sequences, I will
change the pending release sequence list again. This time, a single list
entry will have the ability to hold all important info regarding a
single release sequence. For now, I only utilize it to store the
'acquire' operation, so there should be no real change in behavior yet.
Brian Norris [Thu, 4 Oct 2012 18:15:39 +0000 (11:15 -0700)]
model: add release_seq structure definition
Brian Norris [Thu, 4 Oct 2012 19:11:05 +0000 (12:11 -0700)]
model: remove unnecessary boolean variable
Brian Demsky [Thu, 4 Oct 2012 08:32:45 +0000 (01:32 -0700)]
fix bug...can't mo_check_promises until we're done resolving promises for a write back in time
Brian Demsky [Thu, 4 Oct 2012 08:21:11 +0000 (01:21 -0700)]
local commit... bug that prunes too many executions
Brian Demsky [Thu, 4 Oct 2012 00:28:26 +0000 (17:28 -0700)]
Merge branch 'master' of /home/git/model-checker
Brian Demsky [Thu, 4 Oct 2012 00:26:43 +0000 (17:26 -0700)]
fix low hanging fruit when profiling...
dump typo was turning off optimized version of checkpointing...option 2 is by far fastest
was spending most of the time freeing an oversized hashtable
Brian Norris [Thu, 4 Oct 2012 00:12:59 +0000 (17:12 -0700)]
fixup more id vs. thread_id_t
Brian Norris [Tue, 25 Sep 2012 23:29:14 +0000 (16:29 -0700)]
action: return synchronization status for ModelAction::read_from()
The ModelChecker may need to know if any synchronization was performed in
read_from().
Note that the return status is not used yet.
Brian Norris [Wed, 3 Oct 2012 23:29:59 +0000 (16:29 -0700)]
action: remove clockvector flag from print() method
We don't actually need to tell ModelAction::print() when to print the
associated clock vector. The introduction of the 'print_cv' boolean flag
was to fix a separate bug that has been fixed. Now the clock vector can
be printed unconditionally, when it exists.
Brian Norris [Wed, 3 Oct 2012 23:07:54 +0000 (16:07 -0700)]
model: rename release_seq_head() -> release_seq_heads()
It may return multiple heads, so make it plural.
Brian Norris [Wed, 3 Oct 2012 22:36:26 +0000 (15:36 -0700)]
model: do not assume THREAD_FINISH is always the last action
It's possible that there will be special fixup ModelActions added, so
just use the Thread::is_complete() method to check for a completed
Thread.
Brian Norris [Wed, 3 Oct 2012 22:26:52 +0000 (15:26 -0700)]
fixup usage of int vs. thread_id_t
Brian Norris [Wed, 3 Oct 2012 22:08:28 +0000 (15:08 -0700)]
model: add const qualifier to get_thread()
Brian Norris [Wed, 3 Oct 2012 21:50:30 +0000 (14:50 -0700)]
model: rearrange conditionals, fixup take_step()
Brian Norris [Wed, 3 Oct 2012 20:54:22 +0000 (13:54 -0700)]
Merge remote-tracking branch 'origin/master'
Brian Norris [Wed, 3 Oct 2012 20:17:47 +0000 (13:17 -0700)]
modeltypes: move small typedefs to own header
To prevent some unnecessary inter-header dependencies, we can move some
simple typedefs to a modeltypes.h header.
Brian Norris [Wed, 3 Oct 2012 20:16:49 +0000 (13:16 -0700)]
model: don't include schedule.h
Brian Norris [Wed, 3 Oct 2012 20:50:51 +0000 (13:50 -0700)]
nodestack: move has_priority() out of header
Brian Norris [Wed, 3 Oct 2012 20:37:02 +0000 (13:37 -0700)]
model: move get_thread() implementations out of header
Brian Norris [Wed, 3 Oct 2012 20:16:00 +0000 (13:16 -0700)]
model: move get_current_thread() implementation out of header
Brian Demsky [Wed, 3 Oct 2012 19:38:27 +0000 (12:38 -0700)]
Merge branch 'master' of /home/git/model-checker
Brian Demsky [Wed, 3 Oct 2012 19:37:53 +0000 (12:37 -0700)]
a number of fixes to add missing mo_graph edges to speed up detection of infeasible
traces
Brian Norris [Wed, 3 Oct 2012 19:37:22 +0000 (12:37 -0700)]
model: update switch_to_master() comment
Brian Norris [Wed, 3 Oct 2012 19:13:03 +0000 (12:13 -0700)]
Makefile: eliminate malloc.c warning
malloc.c: In function ‘sys_trim’:
malloc.c:4289:20: warning: unused variable ‘newsize’ [-Wunused-variable]
malloc.c: In function ‘destroy_mspace’:
malloc.c:5452:13: warning: unused variable ‘base’ [-Wunused-variable]
Brian Norris [Wed, 3 Oct 2012 19:06:20 +0000 (12:06 -0700)]
mymemory: fix indentation for ModelAlloc
Brian Norris [Wed, 3 Oct 2012 18:50:35 +0000 (11:50 -0700)]
rename 'MyAlloc' to 'ModelAlloc'
Brian Norris [Wed, 3 Oct 2012 18:37:26 +0000 (11:37 -0700)]
mymemory: reword comments
Brian Norris [Wed, 3 Oct 2012 18:29:01 +0000 (11:29 -0700)]
snapshot: rename 'SnapShot' -> 'Snapshot'
This capitalization always messes me up
Brian Norris [Wed, 3 Oct 2012 18:26:17 +0000 (11:26 -0700)]
common: remove excess semicolon
Brian Norris [Wed, 3 Oct 2012 18:15:05 +0000 (11:15 -0700)]
mymemory: define SNAPSHOTALLOC appropriately
SNAPSHOTALLOC can be filled in with meaningful allocators, rather than
using the global default allocators.
Brian Norris [Wed, 3 Oct 2012 18:08:36 +0000 (11:08 -0700)]
replace malloc/calloc/free with snapshot_{malloc/calloc/free}
We need to explicitly declare when we are requesting snapshotting
memory, and we need to avoid using malloc, etc., directly. For now, this
has no functional change, as the 'snapshot_*' functions just call the
stdlib functions, but soon we may switch allocators to use a private
heap.
Brian Norris [Wed, 3 Oct 2012 18:05:36 +0000 (11:05 -0700)]
mymemory: make snapshot_{malloc,calloc,free} externally linkable
As we begin to use these functions, they can't be simply declared
statically in the header; they need to be linkable in hashtable.h, for
instance.
Brian Norris [Wed, 3 Oct 2012 17:12:56 +0000 (10:12 -0700)]
action: reword comments
Why all the ...?
Brian Demsky [Wed, 3 Oct 2012 10:04:21 +0000 (03:04 -0700)]
extra file committed accidentally
Brian Demsky [Wed, 3 Oct 2012 10:03:02 +0000 (03:03 -0700)]
missing change
Brian Demsky [Wed, 3 Oct 2012 09:57:32 +0000 (02:57 -0700)]
mspace_malloc will call into mmap if it runs out of memory... this does not play well with
snapshotting the mspace of course...
turn off the mmap option and give us a bigger heap...
add assertions to malloc/calloc/realloc if they return NULL (which is now possible with MMAP turned off)
Brian Demsky [Wed, 3 Oct 2012 08:28:12 +0000 (01:28 -0700)]
error
Brian Demsky [Wed, 3 Oct 2012 08:20:48 +0000 (01:20 -0700)]
random memory leak fixes and memory access fixes
Brian Norris [Tue, 2 Oct 2012 01:15:12 +0000 (18:15 -0700)]
model: debug print - pending release sequences
Brian Norris [Wed, 3 Oct 2012 01:52:43 +0000 (18:52 -0700)]
test: add a "pending release sequences" test
This helps test the end-of-execution "pending release sequence"
functionality, as well as other release-sequence-related code. It also
uncovered the regression that was just reverted prior to this.
Brian Norris [Wed, 3 Oct 2012 01:48:05 +0000 (18:48 -0700)]
(bug) revert JOIN/LOCK simplification
A test case throws an assertion when these changes are included. Maybe
I'll make a proper fix later, but for now, I mostly revert these.
Revert "model: remove obsolete ModelChecker::do_complete_join()"
This reverts commit
cef10a2b49af5da16ffe59c5b9ddd210c668fbac.
Revert "model: unify JOIN- and LOCK-related sleep/wake code"
This reverts commit
620ae95ce4fed006d18a41b6ccfd949d7e77f677.
Brian Norris [Wed, 26 Sep 2012 00:00:53 +0000 (17:00 -0700)]
model: one release sequence may help resolve another
Brian Norris [Wed, 3 Oct 2012 01:09:40 +0000 (18:09 -0700)]
model: THREAD_FINISH triggers release sequence check
A THREAD_FINISH action may ensure that a Thread is no longer able to
break release sequences, so all pending release sequences should be
checked.
Brian Demsky [Wed, 3 Oct 2012 01:07:02 +0000 (18:07 -0700)]
Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/model-checker
Brian Demsky [Wed, 3 Oct 2012 01:06:46 +0000 (18:06 -0700)]
a bug fix
Brian Norris [Wed, 3 Oct 2012 00:54:26 +0000 (17:54 -0700)]
assign sequence numbers after initial processing
When re-ordering the execution of JOIN and LOCK operations (e.g., when
they attempt to execute when not enabled), the sequence numbers became
out of order. Also, RMW operations would cause sequence numbers to jump
by 2 every time.
This fix arranges initialization such that a ModelAction is only
assigned a sequence number after it passes some initial checks to ensure
that it will be executed and utilized immediately. Otherwise, it will
either be discarded or held pending until it is enabled.
Brian Norris [Wed, 3 Oct 2012 00:58:01 +0000 (17:58 -0700)]
action: edit some spacing
Brian Norris [Wed, 3 Oct 2012 00:29:56 +0000 (17:29 -0700)]
model: remove obsolete ModelChecker::do_complete_join()
This function was folded into the one place it is used, now.
Brian Norris [Wed, 3 Oct 2012 00:28:02 +0000 (17:28 -0700)]
model: unify JOIN- and LOCK-related sleep/wake code
We might as well use similar code paths for JOIN and LOCK operations
that must wait on another thread to re-enable it. The side benefit here
is that the JOIN action is now placed at the correct sequence point in
the execution trace.
Brian Norris [Wed, 3 Oct 2012 00:14:46 +0000 (17:14 -0700)]
model: refactor mutex thread-blocking code
There are a few functions that are used in suboptimal ways.
* use the ModelChecker::get_thread(ModelAction *) version of overloaded
'get_thread()' function
* the add/remove interfaces were used inconsistently previously; for
"waking" we directly utilized Scheduler::add_thread, whereas the
"sleeping" case used ModelChecker::remove_thread
* use the Scheduler::sleep and Scheduler::wake functions for sleep/wake
instead of explicitly adding/removing
Brian Norris [Tue, 2 Oct 2012 19:33:21 +0000 (12:33 -0700)]
action: don't print clock vector when it is invalid
Due to clock vector snapshotting, a ModelAction may hold a pointer to
an inavlid ClockVector. This fix allows callers of ModelAction::print()
to prevent it from printing a corrupted ClockVector.
Brian Demsky [Tue, 2 Oct 2012 21:54:59 +0000 (14:54 -0700)]
small hack to optimize our common case for snapshotting and set config option to turn this back on.
hack assumes that same pages will be dirty across different executions so just copies them and doesn't reprotect them
Brian Demsky [Tue, 2 Oct 2012 21:29:10 +0000 (14:29 -0700)]
fix bug.... not quite perfect for linux locks, but runs to completion...
Revert "model: revert broken bugfix"
This reverts commit
ae7fcd2e5e499f72d9d1530bdc293f4fbc5f0644.
Brian Norris [Tue, 2 Oct 2012 19:17:16 +0000 (12:17 -0700)]
clockvector: snapshot the whole object
Brian Norris [Tue, 2 Oct 2012 18:16:12 +0000 (11:16 -0700)]
model: revert broken bugfix
This reverts parts of the following commit:
commit
7ba211ec7d1cacbaa3ef2027f1a0f534888f1708
The bugfix broke our basic test case (userprog)
Brian Norris [Tue, 2 Oct 2012 18:02:46 +0000 (11:02 -0700)]
model: fix "earliest diverge" NULL pointer exception
Brian Demsky [Tue, 2 Oct 2012 09:09:13 +0000 (02:09 -0700)]
start support for drawing execution diagrams
fix some signed/unsigned warnings
Brian Demsky [Tue, 2 Oct 2012 07:29:10 +0000 (00:29 -0700)]
Fixed bug breaking our consolidation of future values...
Brian Demsky [Tue, 2 Oct 2012 04:48:34 +0000 (21:48 -0700)]
Two change:
(1) Bug fix... Check that rf is non-null before calling
r_modification
(2) Add a hook into assert mechanism for the debugger
Brian Norris [Tue, 2 Oct 2012 01:18:07 +0000 (18:18 -0700)]
rename MYFREE -> model_free
Brian Norris [Tue, 2 Oct 2012 01:17:26 +0000 (18:17 -0700)]
rename MYCALLOC -> model_calloc
Brian Norris [Tue, 2 Oct 2012 01:16:24 +0000 (18:16 -0700)]
rename MYMALLOC -> model_malloc
Brian Norris [Tue, 2 Oct 2012 00:37:02 +0000 (17:37 -0700)]
model: refactor/reword initialize_curr_action()
Brian Norris [Tue, 2 Oct 2012 00:30:01 +0000 (17:30 -0700)]
clockvector: snapshot our clock vectors
Clock vectors need to be snapshotted
Brian Norris [Tue, 2 Oct 2012 00:11:52 +0000 (17:11 -0700)]
mymemory: add placeholder "snapshot_{calloc,malloc,free}" functions
Eventually, we may want a separate heap for the model-checker's
snapshotted data (vs. user's snapshotted data), so create allocator
stubs for this. This allows us to begin annotating our malloc()'s
properly.
Brian Norris [Tue, 2 Oct 2012 00:20:34 +0000 (17:20 -0700)]
model: always re-calculate clock vectors
Clock vectors are mutable, via synchronization. We will need to both
snapshot and recompute clock vectors as they are generated. Right now,
we have some incorrect assumptions in place. This bugfix prevents stale
clock vectors (from previous executions) from polluting subsequent
executions.
Brian Demsky [Mon, 1 Oct 2012 23:27:49 +0000 (16:27 -0700)]
another bug fix
Brian Demsky [Mon, 1 Oct 2012 22:17:11 +0000 (15:17 -0700)]
bug fix...recompute promises of RMW actions at divergence points
Brian Norris [Mon, 1 Oct 2012 20:29:54 +0000 (13:29 -0700)]
model: utilize bad_synchronization flag
Brian Norris [Mon, 1 Oct 2012 20:29:00 +0000 (13:29 -0700)]
model: add "bad synchronization" flag
Can be used for aborting a trace when an incorrectly-ordered
synchronization occurs.
Brian Norris [Mon, 1 Oct 2012 20:20:56 +0000 (13:20 -0700)]
action: synchronize_with - return status for out-of-order synchronization
"synchronize_with()" now can return a boolean status, rather than just
using an ASSERT(). This allows synchronize_with() to be called with
actions that are against the program trace order, then return a status
to signify success/failure. This will allow, for instance, release
sequence calculations to simply abort this single execution, not the
whole model-checker.
Brian Norris [Mon, 1 Oct 2012 17:55:23 +0000 (10:55 -0700)]
model: remove debug print
Brian Demsky [Sat, 29 Sep 2012 03:58:27 +0000 (20:58 -0700)]
missing commit of mo_graph changes
Brian Demsky [Fri, 28 Sep 2012 10:16:00 +0000 (03:16 -0700)]
fix bug from moving read_from check_recency...check_recency had the assumption that the read_from field was set...
Brian Norris [Thu, 27 Sep 2012 19:29:05 +0000 (12:29 -0700)]
nodestack: add debug prints
Brian Norris [Thu, 27 Sep 2012 17:53:59 +0000 (10:53 -0700)]
model: push mo_graph cycle check into release_seq code
Release sequences traveral should only be undertaken if the mo_graph has
no cycles. Instead of just making this check a hack within
resolve_promises(), make it part of every release sequence exploration.
Brian Norris [Thu, 27 Sep 2012 17:53:37 +0000 (10:53 -0700)]
model: add RMW violation debug print
Brian Norris [Thu, 27 Sep 2012 17:15:28 +0000 (10:15 -0700)]
doc: add release sequence notes
Brian Norris [Thu, 27 Sep 2012 16:58:10 +0000 (09:58 -0700)]
docs: move to subdirectory
Brian Norris [Wed, 26 Sep 2012 02:23:51 +0000 (19:23 -0700)]
model: avoid infinite loop in release_seq_head()
To understand the problem I'm solving here, note that resolve_promises()
calls ModelAction::read_from() which calls ModelChecker::release_seq_head().
Now, release_seq_head() has the basic assumption that the mo_graph
doesn't have cycles (or specifically, in this case it's important that
sequences of RMW's don't form loops in the reads-from relation).
Unfortunately, resolve_promises() can create such a cycle (by assigning
the "reads-from" value) before checking if that would create a cycle.
This will trigger a check to release_seq_head, which gets stuck in an
infinite loop...
The solution, at least for this targeted portion of code, is to:
(1) First add the relevant RMW edge, if possible
(2) If (1) didn't create mo_graph cycles:
Then assign reads-from, check release sequences, update
synchronization
(3) Calculate other normal mo_graph edges
This way, (2) will simply be skipped if we have cycles, avoiding the
problem.
Brian Norris [Wed, 26 Sep 2012 18:16:17 +0000 (11:16 -0700)]
model: bugfix - iterator naming conflict
There's already another iterator named 'it' in resolve_release_sequences().
Although this iterator probably will mask the earlier iterator (giving correct
behavior), it's probably safer to rename the later one for clarity.
Brian Norris [Tue, 25 Sep 2012 23:56:02 +0000 (16:56 -0700)]
model: re-check release sequences after THREAD_JOIN
If a THREAD-specific operation (from process_thread_action()) added any
synchronization, we should re-check all release sequences.
Brian Norris [Tue, 25 Sep 2012 23:59:30 +0000 (16:59 -0700)]
model: add current action work_queue comment
Brian Norris [Thu, 20 Sep 2012 22:26:37 +0000 (15:26 -0700)]
model: mutex synchronization -> re-check release sequences
All synchronization updates should generate a re-check of release sequences.
This commit corrects this for mutexes.
Brian Norris [Tue, 25 Sep 2012 23:50:59 +0000 (16:50 -0700)]
model: trivial - rename 'updated' -> 'update'
Brian Norris [Tue, 25 Sep 2012 23:39:07 +0000 (16:39 -0700)]
model: bugfix - release sequences - handle Thread completion
A completed Thread cannot generate any new writes that would break release
sequences.
Brian Norris [Tue, 25 Sep 2012 22:33:51 +0000 (15:33 -0700)]
model: fixup spelling (and formatting) in comments
relese -> release
Brian Norris [Tue, 25 Sep 2012 22:28:31 +0000 (15:28 -0700)]
model: split THREAD_* processing into process_thread_action()
The THREAD_* specific functionality can easily be in its own function.
Additionally, this patch:
* performs the trivial rearrangement of moving this code inside the
work_queue loop, for consistency
* returns a "synchronized" status, so that THREAD_FINISH/THREAD_JOIN can be
hooked into the work_queue update loop later
Brian Norris [Tue, 25 Sep 2012 19:19:44 +0000 (12:19 -0700)]
Merge branch 'norris'
Brian Norris [Tue, 25 Sep 2012 18:38:31 +0000 (11:38 -0700)]
model: release_seq_head - rewrite RMW recursion as loop
A bug in release sequences coce (independent of this patch) causes a huge
blowup of the recursion, yielding strange stack errors. So I address "@todo
Might it be better to make this into a loop", causing a loop of memory usage
instead. This can be triggered, for example, with:
./run.sh ./test/linuxrwlocks.o -e 1 -f 4 -m 1
Brian Demsky [Tue, 25 Sep 2012 17:12:38 +0000 (10:12 -0700)]
add comments
Brian Demsky [Mon, 24 Sep 2012 22:46:52 +0000 (15:46 -0700)]
fairness changes...
fix bug with putting enabled information in wrong place
reveals norris bug...
Brian Norris [Thu, 20 Sep 2012 21:00:13 +0000 (14:00 -0700)]
model: flatten "pending acquire/release sequence" structure
This structure should just be a simple flat array, so that we can simply
iterate through all acquire operations with pending release sequences. There
probably wasn't much to be saved by organizing this structure as a hash table
of lists; if so, I can add the complexity back in later.
This eliminates the need for a separate 'lazy_sync_size' count and renames
'lazy_sync_with_release' to 'pending_acq_rel_seq'.
Brian Norris [Fri, 21 Sep 2012 17:27:27 +0000 (10:27 -0700)]
Merge branch 'norris'
1 bugfix
Brian Norris [Fri, 21 Sep 2012 17:23:21 +0000 (10:23 -0700)]
model: bugfix - infinite loop in resolve_release_sequences()
Brian Demsky [Fri, 21 Sep 2012 00:57:35 +0000 (17:57 -0700)]
comments