Brian Norris [Thu, 6 Sep 2012 20:55:05 +0000 (13:55 -0700)]
libthreads: don't spin on THREAD_JOIN
THREAD_JOIN can now be implemented properly here. We shouldn't have to spin,
waiting for another thread to complete. This may help improve the ModelChecker
architecture, since we will never have NULL actions passed to the ModelChecker.
Brian Norris [Thu, 6 Sep 2012 20:54:06 +0000 (13:54 -0700)]
model: hook up THREAD_JOIN and THREAD_FINISH actions
Brian Norris [Thu, 6 Sep 2012 20:37:35 +0000 (13:37 -0700)]
schedule: add wait and wake functions
These functions will be used to prevent execution of threads that should be
waiting for another event (e.g., a THREAD_JOIN should cause a thread to wait
for another thread's exit).
Brian Norris [Thu, 6 Sep 2012 20:47:12 +0000 (13:47 -0700)]
threads: fixup THREAD_READY comment
This state will be used for more than just a context switch, so reword the
comment.
Brian Norris [Thu, 6 Sep 2012 20:41:12 +0000 (13:41 -0700)]
threads: add THREAD_BLOCKED state
To signal that a Thread cannot yet be added back to the Scheduler's ready list.
Brian Norris [Thu, 6 Sep 2012 20:17:06 +0000 (13:17 -0700)]
threads: add a wait_list
This list will contain all Threads that are waiting on the current Thread. Will
be used for Thread joins, in particular.
Brian Norris [Thu, 6 Sep 2012 20:10:11 +0000 (13:10 -0700)]
threads: add is_complete() helper function
Brian Norris [Thu, 6 Sep 2012 20:07:26 +0000 (13:07 -0700)]
action: add THREAD_FINISH action
For cleanly finalizing a thread.
Brian Norris [Thu, 6 Sep 2012 18:43:06 +0000 (11:43 -0700)]
snapshot-interface: debug prints: lengthen the "regionname" field
Brian Norris [Tue, 4 Sep 2012 21:13:28 +0000 (14:13 -0700)]
model: document ModelChecker::check_current_action
Brian Norris [Tue, 4 Sep 2012 20:08:46 +0000 (13:08 -0700)]
model: check_current_action returns its 'nextThread'
To begin some code structure rearrangements, I make check_current_action()
return the 'nextThread' value as a true return value. Eventually, the
nextThread field might not be needed, and the model-checker behavior might make
more sense...
Brian Norris [Tue, 4 Sep 2012 19:45:49 +0000 (12:45 -0700)]
model/schedule: revise 'nextThread' data flow
The ModelChecker::nextThread field was being abused a little in my aging
design. It really should be either a private field (not accessed even via
accessors) or else just a return value / function parameter.
This commit makes a change so that nextThread is a Thread pointer and is
directly supplied to the Scheduler. If it is NULL, then the Scheduler is
allowed to pick its own Thread to run.
Brian Norris [Tue, 4 Sep 2012 17:59:47 +0000 (10:59 -0700)]
action: print '?' for unknown read-from-future
To provide more informative debugging traces, use a placeholder '?' as the "Rf"
value when printing a 'read' ModelAction that has no reads-from value. This
helps, for instance, when manually identifying problem points in an infeasible
execution.
Brian Norris [Fri, 24 Aug 2012 00:54:39 +0000 (17:54 -0700)]
model: re-check release sequences lazily
For now, I write this "lazy check" as follows:
Whenever one of the following occurs:
* a Promise is fulfilled
* a mo_graph edge is added
Then I recheck all the actions (for the relevant object location) that are
waiting in the lazy release head queue.
Brian Norris [Sat, 25 Aug 2012 01:37:15 +0000 (18:37 -0700)]
model: add resolve_release_sequences() function
This function can check for release sequence resolutions then propagate
synchronization and remove from the "lazy release" list. It does not add any
new mo_graph edges yet.
Brian Norris [Thu, 23 Aug 2012 02:16:58 +0000 (19:16 -0700)]
model: stash actions for lazy release-seq checking
Build up lists of actions to lazily check for new release sequence
developments.
Brian Norris [Fri, 24 Aug 2012 00:47:31 +0000 (17:47 -0700)]
model: report 'updates' when adding mo_graph edges
The rest of the model checker would like to know if any edges were added. Add a
boolean return value to report this.
Brian Norris [Fri, 24 Aug 2012 00:50:21 +0000 (17:50 -0700)]
model: report status of resolved promises
The rest of the model checker needs to know when promises are added, so add a
return status as a boolean.
Brian Norris [Thu, 23 Aug 2012 19:31:08 +0000 (12:31 -0700)]
action, clockvector: add 'has_synchronized_with()' functions
These functions will check whether a ClockVector (or corresponding ModelAction)
is *completely* synchronized with another already. This is different from
simply "happens before," because I may need to update and propagate a clock
vector after initial execution as more information becomes available, and so
this function helps determine whether a particular pair of vectors is worth
merging (and then - expensively - propagating) before actually performing the
synchronization.
[Not documented properly yet...]
Brian Norris [Thu, 23 Aug 2012 19:30:27 +0000 (12:30 -0700)]
action: make synchronize_with() public
Brian Norris [Wed, 15 Aug 2012 00:37:32 +0000 (17:37 -0700)]
action: utilize release sequence(s) for synchronization
Instead of checking only the trivial release sequence (i.e., a read-acquire
reads directly from a write-release) for establishing synchronization, make use
of the ModelChecker's more complete 'get_release_seq_head()' functionality,
then loop through all release heads and synchronize with each. This is
necessary because a read-acquire may synchronize with more than one
store-release.
Note that this step only implements support based on present knowledge. The
incomplete knowledge of the modification order, as given in mo_graph, as well
as "reading from the future" may require lazy checking.
Brian Norris [Wed, 15 Aug 2012 00:21:29 +0000 (17:21 -0700)]
model: add release sequence support
The ModelChecker now can find the head(s) of the release sequence(s) with which
a particular ModelAction (read-acquire) will synchronize.
The ModelChecker::release_seq_head function can locate a release sequence head
for a given ModelAction, based on information at a given moment. That is, it
knows happens-before and modification information for the present, but some
decisions may need to be made in the future as reads-from promises are
fulfilled or modification ordering is observed by future reads and writes.
Lazy checking for the latter cases has yet to be implemented.
Brian Norris [Fri, 24 Aug 2012 00:52:46 +0000 (17:52 -0700)]
model: change pointer spacing style
Brian Norris [Thu, 23 Aug 2012 02:15:04 +0000 (19:15 -0700)]
action: (assertion) disallow out-of-order synchronization
We build our ModelChecker around the assumption that synchronization never
occurs counter to the execution order. This assertion lets us know if that
fails.
Brian Norris [Thu, 23 Aug 2012 02:08:50 +0000 (19:08 -0700)]
model: improve some promise-related comments
Brian Norris [Mon, 20 Aug 2012 22:59:25 +0000 (15:59 -0700)]
action: update 'reads_from' field before synchronization
As the ModelChecker's release/acquire functionality gets more complex,
it makes more sense to assign the ModelAction::reads_from field before
checking synchronization. Currently, this makes no change in behavior.
Brian Norris [Wed, 22 Aug 2012 23:45:55 +0000 (16:45 -0700)]
nodestack: turn magic promise numbers into enum + typedef
Document the enum properly, since it's quite unclear what these flags really
mean.
Brian Norris [Wed, 22 Aug 2012 23:02:48 +0000 (16:02 -0700)]
nodestack, model: use uniform spacing, style
Brian Norris [Wed, 22 Aug 2012 22:56:13 +0000 (15:56 -0700)]
nodestack: don't use uint32_t
uint32_t (and similar) should only be used when an exact field-size is needed
across platforms with different integer sizes. In this case, we only need an
unsigned type, so just use unsigned int.
Brian Norris [Wed, 22 Aug 2012 22:51:43 +0000 (15:51 -0700)]
nodestack: remove unnecessary typedefs
These typedefs are used once or twice and don't add much meaning.
Brian Norris [Fri, 17 Aug 2012 00:06:31 +0000 (17:06 -0700)]
cyclegraph: add public CycleGraph::checkReachable()
The private CycleGraph::checkReachable() function can be useful externally,
when provided with two ModelActions. This implements a small wrapper for public
usage.
Brian Norris [Tue, 21 Aug 2012 06:58:38 +0000 (23:58 -0700)]
model: correct mo_graph comment
My understanding of the mo_graph was incorrect, due to some confusion over the
CycleGraph interfaces. Correct this.
Brian Norris [Tue, 21 Aug 2012 06:56:10 +0000 (23:56 -0700)]
cyclegraph: straighten out header vs. implementation vs. usage
The CycleGraph::addEdge and CycleGraph::addRMWEdge functions were a little
confusing to use, since their implementation and header prototypes had
different parameter naming. This swapped the 'to' and 'from' naming, such that
it appeared as if the addEdge() users were adding edges in the reverse
direction. The functionality was not actually incorrect, but my understanding
was...
This corrects the naming and switches the order of the arguments.
Brian Norris [Mon, 20 Aug 2012 19:11:42 +0000 (12:11 -0700)]
promise: rewrite into a simpler header file
Brian Norris [Fri, 10 Aug 2012 18:52:36 +0000 (11:52 -0700)]
Makefile: rewrite header dependencies
We shouldn't need to add new files in 3 different places. Automatically
generate most of this using GCC's '-MM' option.
Brian Norris [Mon, 20 Aug 2012 18:22:32 +0000 (11:22 -0700)]
model: document ModelChecker::mo_graph
The modification order graph is a complex data structure, and there are a few
pieces of high-level information that should be noted. For example, the edges
are actually directed from most recent to oldest, which is somewhat in reverse
of the usage in the literature, where
a --mo--> b
means that a comes *before* b in the modification order. This convention can be
changed in the future, but it should be documented here.
Brian Norris [Mon, 20 Aug 2012 18:03:36 +0000 (11:03 -0700)]
model: rename 'cyclegraph' to 'mo_graph'
This is not just an arbitrary graph with cycle-detection; it is specifically a
representation of the modification order of various atomic objects.
Brian Norris [Mon, 20 Aug 2012 19:53:28 +0000 (12:53 -0700)]
model: don't "leak" promises
Brian Norris [Fri, 17 Aug 2012 00:40:40 +0000 (17:40 -0700)]
test/Makefile: remove pointless variable
Brian Norris [Fri, 17 Aug 2012 00:11:27 +0000 (17:11 -0700)]
.gitignore: don't ignore /model anymore
We don't produce an executable named 'model' anymore.
Brian Norris [Thu, 16 Aug 2012 17:40:59 +0000 (10:40 -0700)]
Merge branch 'norris'
Brian Norris [Fri, 10 Aug 2012 23:20:15 +0000 (16:20 -0700)]
schedule: make print() const
Switch to using a "const_iterator" so that the whole function becomes const.
Brian Norris [Fri, 10 Aug 2012 22:27:38 +0000 (15:27 -0700)]
model: privatize check_current_action()
Brian Norris [Fri, 10 Aug 2012 22:22:33 +0000 (15:22 -0700)]
threads: correct 'swap()' documentation
Some of the swap() documentation was duplicated incorrectly. While I'm at it,
make the descriptions more clear and precise.
Brian Norris [Fri, 10 Aug 2012 22:15:24 +0000 (15:15 -0700)]
main, model: don't 'initialize' system_context
I was unnecessarily giving main.cc control of the system_context variable,
since I thought I needed to use getcontext() before entering the model checker.
However, the structure of the runtime scheduling is such that this
"initialization" would be obliterated by the first swapcontext() call
(switching form system-context to user-context).
So, the point is that the model-checker can just declare its own
("uninitialized") context that will be initialized as soon as the model-checker
makes a thread swap. Thus, I remove the external interface for initializing the
context (set_system_context()).
Brian Norris [Fri, 10 Aug 2012 21:59:20 +0000 (14:59 -0700)]
action: don't merge twice in read_from()
synchronize_with() already takes care of the clock vector merging, so don't
merge a second time.
Brian Norris [Fri, 10 Aug 2012 21:57:20 +0000 (14:57 -0700)]
action: rework/rename 'synchronized()' to 'synchronize_with()'
Fix some comments, names, etc.
Privatize synchronized()/synchronize_with(), since it's only intended for
within other wrapper actions performed on ModelAction.
Brian Norris [Fri, 10 Aug 2012 21:51:27 +0000 (14:51 -0700)]
model: remove useless return code from add_thread()
Brian Norris [Fri, 10 Aug 2012 21:43:19 +0000 (14:43 -0700)]
schedule, threads: update comments, const's
Brian Norris [Fri, 10 Aug 2012 21:29:06 +0000 (14:29 -0700)]
model: make scheduler private
To accomplish this, I needed to add one accessor method for
'get_current_thread()'.
Brian Norris [Fri, 10 Aug 2012 21:23:29 +0000 (14:23 -0700)]
main, model: move main execution loop into ModelChecker class
Brian Norris [Tue, 14 Aug 2012 22:25:11 +0000 (15:25 -0700)]
cyclegraph: improve comments, use initializer list
Brian Norris [Sat, 11 Aug 2012 01:11:12 +0000 (18:11 -0700)]
hashtable: document get_safe_ptr()
Brian Norris [Sat, 11 Aug 2012 01:10:20 +0000 (18:10 -0700)]
hashtable: rename ensureptr() to get_safe_ptr()
ensureptr() is kind of vague. This rename -- along with some better description
-- will help clarify what this function does.
Brian Norris [Sat, 11 Aug 2012 00:44:36 +0000 (17:44 -0700)]
hashtable: bugfix - increment size only when new bins are linked
In both put() and ensureptr(), the 'size' counter should not be incremented
until we decide if we're adding a new bin or not. When incremented improperly,
'size' ended up out of sync with the hash table; it reported a size much larger
than the actual table.
Brian Norris [Sat, 11 Aug 2012 00:42:40 +0000 (17:42 -0700)]
hashtable: some refactoring, signed-ness
Since 'capacity' is unsigned, so should the index that compares with it.
The (duplicated) compare/resize code can be a bit shorter and (IMO) easier to
read.
Brian Norris [Fri, 10 Aug 2012 19:21:12 +0000 (12:21 -0700)]
model: reformat/refactor some code
Brian Norris [Fri, 10 Aug 2012 18:44:00 +0000 (11:44 -0700)]
impatomic.h: fixup spacing
Tabs vs. spaces for indentation screws up this indentation, making it even
harder to read than it should be. Switch this all to spaces (for uniformity
across all editor configurations) and align things properly.
Brian Norris [Wed, 8 Aug 2012 23:36:10 +0000 (16:36 -0700)]
threads: trivial change
Brian Norris [Wed, 8 Aug 2012 23:27:07 +0000 (16:27 -0700)]
model: revert unnecessary parameter for print_summary()
CycleGraph::checkForCycles() is a cheap function; it only checks a flag status.
So we don't need to make code more complicated just to avoid calling this
function.
Effectively a revert of:
commit
7cee72d776ddfbf585038f3cad3df799e353cc11
Brian Norris [Wed, 8 Aug 2012 22:22:25 +0000 (15:22 -0700)]
add basic parameter handling
Brian Norris [Wed, 8 Aug 2012 22:00:13 +0000 (15:00 -0700)]
common: add error_msg() function
Brian Norris [Wed, 8 Aug 2012 19:41:02 +0000 (12:41 -0700)]
run.sh: pass command-line arguments through to test program
Once the model-checker begins handling arguments, we should pass through
arguments to the program.
Brian Norris [Wed, 8 Aug 2012 23:33:00 +0000 (16:33 -0700)]
.gitignore: ignore other vim swap file type
Brian Norris [Wed, 8 Aug 2012 15:59:52 +0000 (08:59 -0700)]
model: reformat some code
Brian Norris [Wed, 8 Aug 2012 00:59:44 +0000 (17:59 -0700)]
main, threads: improve comments regarding thread stepping
The comment in thread_system_next was incorrect:
"Returns the 1 if there is another step and 0 otherwise."
Add a few comments throughout to help clarify this behavior.
Brian Demsky [Sat, 4 Aug 2012 07:21:05 +0000 (02:21 -0500)]
add a todo flag to a comment so it won't get lost... low priority item though
Brian Norris [Fri, 3 Aug 2012 04:00:22 +0000 (21:00 -0700)]
Makefile: fix config.h dependencies
The snapshotting code needs to be rebuilt when config.h is modified.
Brian Norris [Thu, 2 Aug 2012 23:55:58 +0000 (16:55 -0700)]
Merge branch 'brian'
Brian Norris [Thu, 2 Aug 2012 23:51:45 +0000 (16:51 -0700)]
DEBUGGINGNOTES: include gdb info for Linux
Brian Demsky [Thu, 2 Aug 2012 22:40:40 +0000 (15:40 -0700)]
bug fix
Brian Norris [Thu, 2 Aug 2012 23:37:03 +0000 (16:37 -0700)]
run.sh: fixup run script
run.sh will, by default, run ./test/userprog.o now. This can be modified later
to provide several regression tests in-tree, with scripted execution of the
tests.
Brian Norris [Thu, 2 Aug 2012 23:36:29 +0000 (16:36 -0700)]
Makefile: wire up test/ directory for compilation
Brian Norris [Thu, 2 Aug 2012 23:33:16 +0000 (16:33 -0700)]
Makefile: split part into a common makefile (common.mk)
Brian Norris [Thu, 2 Aug 2012 23:27:02 +0000 (16:27 -0700)]
userprog: move to 'test/' directory
Brian Norris [Thu, 2 Aug 2012 23:25:44 +0000 (16:25 -0700)]
Makefile: don't build userprog.c from top level
(Temporarily disables userprog compilation; will restore soon)
Brian Norris [Thu, 2 Aug 2012 19:55:04 +0000 (12:55 -0700)]
blank lines, spacing, etc.
Brian Norris [Thu, 2 Aug 2012 19:35:21 +0000 (12:35 -0700)]
nodestack: remove completed @todo
Brian Norris [Thu, 2 Aug 2012 19:33:43 +0000 (12:33 -0700)]
nodestack: clean up comments
Brian Norris [Thu, 2 Aug 2012 18:13:46 +0000 (11:13 -0700)]
model: do not call isfinalfeasible() too many times
This function call incurs graph exploration, so when performing some
end-of-trace bookkeeping, we should only call it once and cache the result.
Brian Norris [Thu, 2 Aug 2012 17:59:16 +0000 (10:59 -0700)]
hashtable: add some documentation
Brian Norris [Thu, 2 Aug 2012 17:25:31 +0000 (10:25 -0700)]
model: delete Threads on destruction
When switching from STL map to hashtable, the Thread destruction was just
commented out instead of reimplemented. This is a good enough version, I think.
Brian Norris [Thu, 2 Aug 2012 17:25:17 +0000 (10:25 -0700)]
more reformatting/indentation
Brian Demsky [Sat, 28 Jul 2012 17:45:48 +0000 (10:45 -0700)]
forgot about events that happen after an unresolved read... bug fix checked in
Brian Norris [Wed, 1 Aug 2012 03:13:17 +0000 (20:13 -0700)]
fixup whitespace
Brian Norris [Fri, 27 Jul 2012 21:50:15 +0000 (14:50 -0700)]
action: add memory_order printing
Brian Demsky [Fri, 27 Jul 2012 09:06:29 +0000 (02:06 -0700)]
change test case to match nice one from spec... it works. :)
Brian Demsky [Fri, 27 Jul 2012 08:59:52 +0000 (01:59 -0700)]
bugs...
Brian Demsky [Fri, 27 Jul 2012 08:24:24 +0000 (01:24 -0700)]
add some comments
Brian Demsky [Fri, 27 Jul 2012 08:19:07 +0000 (01:19 -0700)]
standardize names a little
Brian Demsky [Fri, 27 Jul 2012 07:25:19 +0000 (00:25 -0700)]
okay...known bugs for my trivial test are out of send future values backwards
Brian Demsky [Fri, 27 Jul 2012 05:20:54 +0000 (22:20 -0700)]
finish promise support
Brian Demsky [Thu, 26 Jul 2012 23:20:02 +0000 (16:20 -0700)]
more changes towards keeping track of promises resolved by a given write statement
Brian Demsky [Thu, 26 Jul 2012 05:59:41 +0000 (22:59 -0700)]
changes
Brian Demsky [Wed, 25 Jul 2012 23:11:51 +0000 (16:11 -0700)]
some changes towards reading from future writes
Brian Demsky [Sat, 21 Jul 2012 02:12:20 +0000 (19:12 -0700)]
move more configurables and add documentation
Brian Demsky [Sat, 21 Jul 2012 01:52:55 +0000 (18:52 -0700)]
more hashtable fixes
clean up memory allocation code a bit
Brian Demsky [Fri, 20 Jul 2012 21:48:01 +0000 (14:48 -0700)]
fix some allocation/free bugs when we put non objects into table...
Brian Demsky [Fri, 20 Jul 2012 21:45:03 +0000 (14:45 -0700)]
fix my todo comments so they appear in documentation
Brian Demsky [Fri, 20 Jul 2012 21:39:23 +0000 (14:39 -0700)]
switch everything over to our own hashtable
give us a calloc to use from our code