| Index: gdb/testsuite/lib/cache.exp | 
| diff --git a/gdb/testsuite/lib/cache.exp b/gdb/testsuite/lib/cache.exp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..e669ebf0a3c220944968b0acac92bb9f7617c46a | 
| --- /dev/null | 
| +++ b/gdb/testsuite/lib/cache.exp | 
| @@ -0,0 +1,75 @@ | 
| +# Copyright 2012, 2013 Free Software Foundation, Inc. | 
| + | 
| +# This program is free software; you can redistribute it and/or modify | 
| +# it under the terms of the GNU General Public License as published by | 
| +# the Free Software Foundation; either version 3 of the License, or | 
| +# (at your option) any later version. | 
| +# | 
| +# This program is distributed in the hope that it will be useful, | 
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| +# GNU General Public License for more details. | 
| +# | 
| +# You should have received a copy of the GNU General Public License | 
| +# along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
| + | 
| + | 
| +# The in-memory cache. | 
| +array set gdb_data_cache {} | 
| + | 
| +# A helper for gdb_caching_proc that handles the caching. | 
| + | 
| +proc gdb_do_cache {name} { | 
| +    global gdb_data_cache objdir | 
| +    global GDB_PARALLEL | 
| + | 
| +    # See if some other process wrote the cache file.  Cache value per | 
| +    # "board" to handle runs with multiple options | 
| +    # (e.g. unix/{-m32,-64}) correctly.  We use "file join" here | 
| +    # because we later use this in a real filename. | 
| +    set cache_name [file join [target_info name] $name] | 
| + | 
| +    if {[info exists gdb_data_cache($cache_name)]} { | 
| +	verbose "$name: returning '$gdb_data_cache($cache_name)' from cache" 2 | 
| +	return $gdb_data_cache($cache_name) | 
| +    } | 
| + | 
| +    if {[info exists GDB_PARALLEL]} { | 
| +	set cache_filename [file join $objdir cache $cache_name] | 
| +	if {[file exists $cache_filename]} { | 
| +	    set fd [open $cache_filename] | 
| +	    set gdb_data_cache($cache_name) [read -nonewline $fd] | 
| +	    close $fd | 
| +	    verbose "$name: returning '$gdb_data_cache($cache_name)' from file cache" 2 | 
| +	    return $gdb_data_cache($cache_name) | 
| +	} | 
| +    } | 
| + | 
| +    set real_name gdb_real__$name | 
| +    set gdb_data_cache($cache_name) [uplevel 1 $real_name] | 
| + | 
| +    if {[info exists GDB_PARALLEL]} { | 
| +	verbose "$name: returning '$gdb_data_cache($cache_name)' and writing file" 2 | 
| +	file mkdir [file dirname $cache_filename] | 
| +	# Make sure to write the results file atomically. | 
| +	set fd [open $cache_filename.[pid] w] | 
| +	puts $fd $gdb_data_cache($cache_name) | 
| +	close $fd | 
| +	file rename -force -- $cache_filename.[pid] $cache_filename | 
| +    } | 
| +    return $gdb_data_cache($cache_name) | 
| +} | 
| + | 
| +# Define a new proc named NAME that takes no arguments.  BODY is the | 
| +# body of the proc.  The proc will evaluate BODY and cache the | 
| +# results, both in memory and, if GDB_PARALLEL is defined, in the | 
| +# filesystem for use across invocations of dejagnu. | 
| + | 
| +proc gdb_caching_proc {name body} { | 
| +    # Define the underlying proc that we'll call. | 
| +    set real_name gdb_real__$name | 
| +    proc $real_name {} $body | 
| + | 
| +    # Define the advertised proc. | 
| +    proc $name {} [list gdb_do_cache $name] | 
| +} | 
|  |