model-checker.git
10 years agofix bug.... not quite perfect for linux locks, but runs to completion...
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.

10 years agoclockvector: snapshot the whole object
Brian Norris [Tue, 2 Oct 2012 19:17:16 +0000 (12:17 -0700)]
clockvector: snapshot the whole object

10 years agomodel: revert broken bugfix
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)

10 years agomodel: fix "earliest diverge" NULL pointer exception
Brian Norris [Tue, 2 Oct 2012 18:02:46 +0000 (11:02 -0700)]
model: fix "earliest diverge" NULL pointer exception

10 years agostart support for drawing execution diagrams
Brian Demsky [Tue, 2 Oct 2012 09:09:13 +0000 (02:09 -0700)]
start support for drawing execution diagrams

fix some signed/unsigned warnings

10 years agoFixed bug breaking our consolidation of future values...
Brian Demsky [Tue, 2 Oct 2012 07:29:10 +0000 (00:29 -0700)]
Fixed bug breaking our consolidation of future values...

10 years agoTwo change:
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

10 years agorename MYFREE -> model_free
Brian Norris [Tue, 2 Oct 2012 01:18:07 +0000 (18:18 -0700)]
rename MYFREE -> model_free

10 years agorename MYCALLOC -> model_calloc
Brian Norris [Tue, 2 Oct 2012 01:17:26 +0000 (18:17 -0700)]
rename MYCALLOC -> model_calloc

10 years agorename MYMALLOC -> model_malloc
Brian Norris [Tue, 2 Oct 2012 01:16:24 +0000 (18:16 -0700)]
rename MYMALLOC -> model_malloc

10 years agomodel: refactor/reword initialize_curr_action()
Brian Norris [Tue, 2 Oct 2012 00:37:02 +0000 (17:37 -0700)]
model: refactor/reword initialize_curr_action()

10 years agoclockvector: snapshot our clock vectors
Brian Norris [Tue, 2 Oct 2012 00:30:01 +0000 (17:30 -0700)]
clockvector: snapshot our clock vectors

Clock vectors need to be snapshotted

10 years agomymemory: add placeholder "snapshot_{calloc,malloc,free}" functions
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.

10 years agomodel: always re-calculate clock vectors
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.

10 years agoanother bug fix
Brian Demsky [Mon, 1 Oct 2012 23:27:49 +0000 (16:27 -0700)]
another bug fix

10 years agobug fix...recompute promises of RMW actions at divergence points
Brian Demsky [Mon, 1 Oct 2012 22:17:11 +0000 (15:17 -0700)]
bug fix...recompute promises of RMW actions at divergence points

10 years agomodel: utilize bad_synchronization flag
Brian Norris [Mon, 1 Oct 2012 20:29:54 +0000 (13:29 -0700)]
model: utilize bad_synchronization flag

10 years agomodel: add "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.

10 years agoaction: synchronize_with - return status for out-of-order synchronization
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.

10 years agomodel: remove debug print
Brian Norris [Mon, 1 Oct 2012 17:55:23 +0000 (10:55 -0700)]
model: remove debug print

10 years agomissing commit of mo_graph changes
Brian Demsky [Sat, 29 Sep 2012 03:58:27 +0000 (20:58 -0700)]
missing commit of mo_graph changes

10 years agofix bug from moving read_from check_recency...check_recency had the assumption that...
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...

10 years agonodestack: add debug prints
Brian Norris [Thu, 27 Sep 2012 19:29:05 +0000 (12:29 -0700)]
nodestack: add debug prints

10 years agomodel: push mo_graph cycle check into release_seq code
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.

10 years agomodel: add RMW violation debug print
Brian Norris [Thu, 27 Sep 2012 17:53:37 +0000 (10:53 -0700)]
model: add RMW violation debug print

10 years agodoc: add release sequence notes
Brian Norris [Thu, 27 Sep 2012 17:15:28 +0000 (10:15 -0700)]
doc: add release sequence notes

10 years agodocs: move to subdirectory
Brian Norris [Thu, 27 Sep 2012 16:58:10 +0000 (09:58 -0700)]
docs: move to subdirectory

10 years agomodel: avoid infinite loop in release_seq_head()
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.

10 years agomodel: bugfix - iterator naming conflict
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.

10 years agomodel: re-check release sequences after THREAD_JOIN
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.

10 years agomodel: add current action work_queue comment
Brian Norris [Tue, 25 Sep 2012 23:59:30 +0000 (16:59 -0700)]
model: add current action work_queue comment

10 years agomodel: mutex synchronization -> re-check release sequences
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.

10 years agomodel: trivial - rename 'updated' -> 'update'
Brian Norris [Tue, 25 Sep 2012 23:50:59 +0000 (16:50 -0700)]
model: trivial - rename 'updated' -> 'update'

10 years agomodel: bugfix - release sequences - handle Thread completion
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.

10 years agomodel: fixup spelling (and formatting) in comments
Brian Norris [Tue, 25 Sep 2012 22:33:51 +0000 (15:33 -0700)]
model: fixup spelling (and formatting) in comments

relese -> release

10 years agomodel: split THREAD_* processing into process_thread_action()
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

10 years agoMerge branch 'norris'
Brian Norris [Tue, 25 Sep 2012 19:19:44 +0000 (12:19 -0700)]
Merge branch 'norris'

10 years agomodel: release_seq_head - rewrite RMW recursion as loop
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

10 years agoadd comments
Brian Demsky [Tue, 25 Sep 2012 17:12:38 +0000 (10:12 -0700)]
add comments

10 years agofairness changes...
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...

10 years agomodel: flatten "pending acquire/release sequence" structure
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'.

10 years agoMerge branch 'norris'
Brian Norris [Fri, 21 Sep 2012 17:27:27 +0000 (10:27 -0700)]
Merge branch 'norris'

1 bugfix

10 years agomodel: bugfix - infinite loop in resolve_release_sequences()
Brian Norris [Fri, 21 Sep 2012 17:23:21 +0000 (10:23 -0700)]
model: bugfix - infinite loop in resolve_release_sequences()

10 years agocomments
Brian Demsky [Fri, 21 Sep 2012 00:57:35 +0000 (17:57 -0700)]
comments

10 years agoMerge branch 'norris'
Brian Norris [Thu, 20 Sep 2012 23:33:37 +0000 (16:33 -0700)]
Merge branch 'norris'

10 years agomodel: fixup style
Brian Norris [Thu, 20 Sep 2012 21:29:08 +0000 (14:29 -0700)]
model: fixup style

10 years agoMerge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/model-checker
Brian Demsky [Thu, 20 Sep 2012 22:49:20 +0000 (15:49 -0700)]
Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/model-checker

10 years agomore documentation
Brian Demsky [Thu, 20 Sep 2012 22:49:02 +0000 (15:49 -0700)]
more documentation

10 years agomodel: release_seq_head: improve ordering of tests
Brian Norris [Thu, 20 Sep 2012 17:59:14 +0000 (10:59 -0700)]
model: release_seq_head: improve ordering of tests

We can get useful information from a non-write action, as long as we aren't
checking it for modification order or breaking of the release sequence.

10 years agomodel: release sequences: check last action in each thread
Brian Norris [Thu, 20 Sep 2012 17:47:31 +0000 (10:47 -0700)]
model: release sequences: check last action in each thread

Previously, release_seq_head would only examine actions on a particular, given
object to determine a release sequence. However, we can get information
regarding the possibility of future disruptive writes by checking the clock
vector of the last action of each thread, regardless of object.

10 years agomodel: pad the digits in exec#.dot filenames
Brian Norris [Thu, 20 Sep 2012 17:45:39 +0000 (10:45 -0700)]
model: pad the digits in exec#.dot filenames

The generated .dot files can't be sorted alphabetically once we have double
digit executions. Make the filename use a 4-digit number, padded with zeros.

10 years agomodel: add const qualifiers, fixup comments
Brian Norris [Thu, 20 Sep 2012 17:33:58 +0000 (10:33 -0700)]
model: add const qualifiers, fixup comments

The "get_last_*" series of functions should be labeled const.

Also, some of the comments were missing/incorrect.

10 years agodocumentation
Brian Demsky [Thu, 20 Sep 2012 20:59:05 +0000 (13:59 -0700)]
documentation

10 years agomodel: get_last_conflict - replace if/else-if block with switch
Brian Norris [Thu, 20 Sep 2012 17:08:03 +0000 (10:08 -0700)]
model: get_last_conflict - replace if/else-if block with switch

10 years agoMakefile: move common Mac flags to common.mk
Brian Norris [Thu, 20 Sep 2012 16:44:31 +0000 (09:44 -0700)]
Makefile: move common Mac flags to common.mk

10 years agofix compilation (includes)
Brian Norris [Thu, 20 Sep 2012 16:42:14 +0000 (09:42 -0700)]
fix compilation (includes)

10 years agobug fixes for lock support...think it works now...
Brian Demsky [Thu, 20 Sep 2012 08:20:34 +0000 (01:20 -0700)]
bug fixes for lock support...think it works now...

10 years agofix merge
Brian Demsky [Thu, 20 Sep 2012 00:42:13 +0000 (17:42 -0700)]
fix merge

10 years agochanges
Brian Demsky [Thu, 20 Sep 2012 00:38:39 +0000 (17:38 -0700)]
changes

10 years agopush changes
Brian Demsky [Thu, 20 Sep 2012 00:38:24 +0000 (17:38 -0700)]
push changes

10 years agomerge stuff
Brian Demsky [Wed, 19 Sep 2012 23:55:10 +0000 (16:55 -0700)]
merge stuff
Merge branch 'master' into mutex

Conflicts:
model.cc
model.h

10 years agomore mutex changes
Brian Demsky [Wed, 19 Sep 2012 23:38:33 +0000 (16:38 -0700)]
more mutex changes

10 years agosupport for locks... untested, but doesn't break quick run of a sample of test cases
Brian Demsky [Wed, 19 Sep 2012 23:09:19 +0000 (16:09 -0700)]
support for locks...  untested, but doesn't break quick run of a sample of test cases

10 years agomore bugs
Brian Demsky [Wed, 19 Sep 2012 08:19:39 +0000 (01:19 -0700)]
more bugs

10 years agofix merge bug
Brian Demsky [Wed, 19 Sep 2012 07:38:14 +0000 (00:38 -0700)]
fix merge bug

10 years agofix
Brian Demsky [Wed, 19 Sep 2012 07:35:54 +0000 (00:35 -0700)]
fix
Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/model-checker

Conflicts:
model.cc

10 years agomy schedule changes
Brian Demsky [Wed, 19 Sep 2012 07:34:37 +0000 (00:34 -0700)]
my schedule changes

10 years agomerge in master
Brian Demsky [Wed, 19 Sep 2012 07:34:02 +0000 (00:34 -0700)]
merge in master

10 years agofix bug
Brian Demsky [Wed, 19 Sep 2012 07:25:45 +0000 (00:25 -0700)]
fix bug

10 years agomodel: replace list type with action_list_t
Brian Norris [Wed, 19 Sep 2012 02:29:05 +0000 (19:29 -0700)]
model: replace list type with action_list_t

10 years agomodel: add typedef for list of release sequence heads
Brian Norris [Wed, 19 Sep 2012 01:54:40 +0000 (18:54 -0700)]
model: add typedef for list of release sequence heads

10 years agomodel: THREAD_JOIN synchronizes with THREAD_FINISH
Brian Norris [Wed, 19 Sep 2012 01:45:17 +0000 (18:45 -0700)]
model: THREAD_JOIN synchronizes with THREAD_FINISH

10 years agoaction: THREAD_JOIN can synchronize against execution order
Brian Norris [Wed, 19 Sep 2012 01:37:22 +0000 (18:37 -0700)]
action: THREAD_JOIN can synchronize against execution order

synchronize_with() had an assertion to ensure that synchronization never
occurred opposite the execution trace ordering. But THREAD_JOIN is a special
case, where this ordering won't break the rest of the model-checker.

10 years agoichange
Brian Demsky [Wed, 19 Sep 2012 00:15:01 +0000 (17:15 -0700)]
ichange

10 years agomodel: add curr to action lists early
Brian Norris [Tue, 18 Sep 2012 23:42:09 +0000 (16:42 -0700)]
model: add curr to action lists early

The current action should be added to the ModelChecker lists early within
check_current_action, so that we can have consistency throughout the function.
We only allow an isolated piece of initialization (initialize_curr_action) to
occur before this step.

10 years agomodel: document behavior of ModelChecker::initialize_curr_action
Brian Norris [Tue, 18 Sep 2012 23:35:46 +0000 (16:35 -0700)]
model: document behavior of ModelChecker::initialize_curr_action

10 years agomodel: pull "may_read_from set" calculation out of initialization
Brian Norris [Tue, 18 Sep 2012 23:26:52 +0000 (16:26 -0700)]
model: pull "may_read_from set" calculation out of initialization

The build_reads_from_past calculation shouldn't be part of the action
initialization. It requires more information from the ModelChecker.

In the future, we will assume that all check_curren_action code (after
initialization) may include the current action in the model-checker lists. So
this also fixes up the build_reads_from_past code so that it skips the current
action.

10 years agomodel: refactor ModelChecker::initialize_curr_action
Brian Norris [Tue, 18 Sep 2012 23:16:38 +0000 (16:16 -0700)]
model: refactor ModelChecker::initialize_curr_action

Rewrite some logic for simplification. Just refactorization.

10 years agomodel: move init code to ModelChecker::initialize_curr_action
Brian Norris [Tue, 18 Sep 2012 22:51:37 +0000 (15:51 -0700)]
model: move init code to ModelChecker::initialize_curr_action

Refactoring

10 years agochanges
Brian Demsky [Tue, 18 Sep 2012 22:46:29 +0000 (15:46 -0700)]
changes

10 years agomodel: pull computation out of conditional
Brian Norris [Tue, 18 Sep 2012 22:39:35 +0000 (15:39 -0700)]
model: pull computation out of conditional

10 years agotests: add releaseseq test
Brian Norris [Fri, 14 Sep 2012 20:12:42 +0000 (13:12 -0700)]
tests: add releaseseq test

Very simple release/acquire test, with some relaxed writes thrown in. The test
is semi-useful and can certainly be tweaked a bit.

10 years agomodel: add some mo_graph fixup code to work_queue
Brian Norris [Fri, 14 Sep 2012 20:11:08 +0000 (13:11 -0700)]
model: add some mo_graph fixup code to work_queue

The work queue has all its work items implemented now. But I haven't fully
verified that this is complete yet.

10 years agoMerge branch 'norris'
Brian Norris [Tue, 18 Sep 2012 20:26:55 +0000 (13:26 -0700)]
Merge branch 'norris'

Primary change: push 'add_action_to_lists()' before main work in
'check_current_action()'

10 years agocyclegraph: add ASSERT() for reflexive edges
Brian Norris [Tue, 18 Sep 2012 20:24:47 +0000 (13:24 -0700)]
cyclegraph: add ASSERT() for reflexive edges

10 years agomodel: add infeasibility debugging
Brian Norris [Tue, 18 Sep 2012 19:00:30 +0000 (12:00 -0700)]
model: add infeasibility debugging

10 years agocommon: print tracing info for ASSERT() failures
Brian Norris [Fri, 14 Sep 2012 19:58:05 +0000 (12:58 -0700)]
common: print tracing info for ASSERT() failures

This adds a global model_print_summary() function, so we can view the current
ModelChecker summary info when we hit an assertion.

10 years agomodel: bugfix - w_modification_order handling current action
Brian Norris [Tue, 18 Sep 2012 17:40:33 +0000 (10:40 -0700)]
model: bugfix - w_modification_order handling current action

The current action should be skipped when iterating lists in
w_modification_order.

Bugfix thanks to Brian D.

10 years agomodel: fixup r_modification_order
Brian Norris [Tue, 18 Sep 2012 17:39:44 +0000 (10:39 -0700)]
model: fixup r_modification_order

Bugfix thanks to Brian D.

10 years agomodel: check_recency - "already_added" always true
Brian Norris [Tue, 18 Sep 2012 17:36:06 +0000 (10:36 -0700)]
model: check_recency - "already_added" always true

The current action is always part of the lists now.

Bugfix thanks to Brian D.

10 years agomodel: bugfix get_last_seq_action()
Brian Norris [Tue, 18 Sep 2012 17:29:04 +0000 (10:29 -0700)]
model: bugfix get_last_seq_action()

The action lists may include the current action, which we don't want to
consider for 'get_last_seq_action()'.

Also, rewrite some of the comments for this function.

Bugfix thanks to Brian D.

10 years agomore changes towards locks
Brian Demsky [Tue, 18 Sep 2012 08:15:06 +0000 (01:15 -0700)]
more changes towards locks

10 years agoMerge branch 'master' into mutex
Brian Demsky [Tue, 18 Sep 2012 05:18:56 +0000 (22:18 -0700)]
Merge branch 'master' into mutex

10 years agoadd mutex files
Brian Demsky [Tue, 18 Sep 2012 05:15:55 +0000 (22:15 -0700)]
add mutex files

10 years agoadd mutex files
Brian Demsky [Tue, 18 Sep 2012 05:15:55 +0000 (22:15 -0700)]
add mutex files

10 years agostart towards adding support for mutexes
Brian Demsky [Tue, 18 Sep 2012 05:15:35 +0000 (22:15 -0700)]
start towards adding support for mutexes

10 years agomodel: fixup happens_before/reflexivity, add 'curr' to lists earlier
Brian Norris [Fri, 14 Sep 2012 19:43:25 +0000 (12:43 -0700)]
model: fixup happens_before/reflexivity, add 'curr' to lists earlier

Some code under 'check_current_action' assumes that the current action is not
added to the ModelChecker trace/list data structures yet. However, some
features I need to add will require the current action to be in these
data structures already. So there are a few spots I need to fixup so that the
code can handle "happens_before" reflexivity properly.

This commit moves the "add_action_to_lists()" call as well as fixes up
reflexivity.

10 years agoMerge branch 'norris'
Brian Norris [Fri, 14 Sep 2012 18:25:59 +0000 (11:25 -0700)]
Merge branch 'norris'

10 years agomodel: release_seq synchronization generates mo_graph edge "work entries"
Brian Norris [Fri, 14 Sep 2012 18:07:22 +0000 (11:07 -0700)]
model: release_seq synchronization generates mo_graph edge "work entries"

Now, when the synchronization for a ModelAction is updated while resolving
release sequences, the affected ModelAction(s) can be queued to the work_queue
for later processing (i.e., checking for mo_graph edge additions).

Note that the MOEdgeWorkEntry is not yet handled in the work_queue loop.

10 years ago.gitignore: ignore .dot graph files
Brian Norris [Fri, 14 Sep 2012 17:33:53 +0000 (10:33 -0700)]
.gitignore: ignore .dot graph files