# 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]
}
