# Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
# 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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

#### Dining Philosophers, on LinuxThreads - Jim Blandy <jimb@cygnus.com>
####
#### At the moment, GDB's support for LinuxThreads is pretty
#### idiosyncratic --- GDB's output doesn't look much like the output
#### it produces for other thread implementations, messages appear at
#### different times, etc.  So these tests are specific to LinuxThreads.
####
#### However, if all goes well, Linux will soon have a libthread_db
#### interface, and GDB will manage it the same way it does other
#### libthread_db-based systems.  Then, we can adjust this file to
#### work with any such system.

### Other things we ought to test:
### stepping a thread while others are running
### killing and restarting
### quitting gracefully

if $tracelevel then {
	strace $tracelevel
}


# This only works with Linux configurations.
if ![istarget *-*-linux-gnu*] then {
    return
}

set testfile "linux-dp"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != ""} {
    return -1
}

gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test_no_output "set print sevenbit-strings"
runto_main

# There should be no threads initially.
gdb_test "info threads" ".*" "info threads 1"

# Try stepping over the thread creation function.
gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: create philosopher"]
set expect_manager -1
for {set i 0} {$i < 5} {incr i} {
    gdb_continue_to_breakpoint "about to create philosopher: $i"
    set threads_before {}
    gdb_test_multiple "info threads" "info threads before: $i" {
	-re "info threads\r\n" {
	    exp_continue
	}
	-re "^. +(\[0-9\]+ Thread \[-0-9a-fx\]+) \[^\n\]*\n" {
	    verbose -log "found thread $expect_out(1,string)" 2
	    lappend threads_before $expect_out(1,string)
	    exp_continue
	}
	-re "^\[^\n\]*\n" {
	    verbose -log "skipping line" 2
	    exp_continue -continue_timer
	}
	-re "^$gdb_prompt $" {
	}
    }
    set threads_created 0
    gdb_test_multiple "next" "create philosopher: $i" {
	-re "^next\r\n" {
	    exp_continue
	}
	-re "^ *\[_!\] \[0-9\]* \[_!\]\r\n" {
	    # Ignore program output.
	    exp_continue -continue_timer
	}
	-re "^\\\[New \[^\]\n\]+\\\]\[^\n\]+\n" {
	    incr threads_created
	    exp_continue
	}
	-re "^189\[^\n\]+\n" {
	    exp_continue
	}
	-re "^$gdb_prompt $" {
	}
	-re "Program received signal.*(Unknown signal|SIGUSR|Real-time event).*$gdb_prompt $" {
	    # It would be nice if we could catch the message that GDB prints
	    # when it first notices that the thread library doesn't support
	    # debugging, or if we could explicitly ask GDB somehow.
	    unsupported "This GDB does not support threads on this system."
	    return -1
	}
	-re "$gdb_prompt $" {
	}
    }
    if { $threads_created == 0 } {
	# Not all targets announce new threads as they are created.
	# For example, the GDB
	# remote protocol target only finds out about threads when
	# they actually report some event like a breakpoint hit,
	# or when the user types 'info threads'.
	unsupported "create philosopher: $i"
    } elseif { $threads_created == 1 } {
	if { $expect_manager < 0 } {
	    set expect_manager 0
	}
	pass "create philosopher: $i"
    } elseif { !$i && $threads_created == 2 } {
	# Two threads are created the first time in LinuxThreads,
	# where the second is the manager thread.  In NPTL, there is none.
	set expect_manager 1
	pass "create philosopher: $i"
    } else {
	fail "create philosopher: $i"
    }
    
    set threads_after {}
    gdb_test_multiple "info threads" "info threads after: $i" {
	-re "info threads\r\n" {
	    exp_continue
	}
	-re "^. +(\[0-9\]+ Thread \[-0-9a-fx\]+) \[^\n\]*\n" {
	    set name $expect_out(1,string)
	    for {set j 0} {$j != [llength $threads_before] } {incr j} {
		if {$name == [lindex $threads_before $j]} {
		    set threads_before [lreplace $threads_before $j $j]
		    set name ""
		    break
		}
	    }
	    if { $name != "" } {
		lappend threads_after $name
	    }
	    exp_continue
	}
	-re "^\[^\n\]*\n" {
	    verbose -log "skipping line" 2
	    exp_continue -continue_timer
	}
	-re "^$gdb_prompt $" {
	    if { [llength $threads_before] != 0 } {
		fail "info threads after: $i"
	    } elseif { !$i && [llength $threads_after] == 2 } {
		set expect_manager 1
		pass "info threads after: $i"
	    } elseif { [llength $threads_after] == 1 } {
		if { $expect_manager < 0 } {
		    set expect_manager 0
		}
		pass "info threads after: $i"
	    } else {
		fail "info threads after: $i"
	    }
	}
    }
}

set nthreads 6

# Run until there are some threads.
gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: info threads 2"]
gdb_continue_to_breakpoint "main thread's sleep"
set info_threads_ptn ""
for {set i $nthreads} {$i > 0} {incr i -1} {
    append info_threads_ptn "$i Thread .*"
}
append info_threads_ptn "\[\r\n\]+$gdb_prompt $"
set info_threads_manager_ptn "[expr $nthreads + 1] Thread .*$info_threads_ptn"

gdb_test_multiple "info threads" "info threads 2" {
    -re "$info_threads_manager_ptn" {
	# We did see a manager thread.  Check that against what we expected.
	switch -exact -- $expect_manager {
	    -1 {
		# We weren't sure whether to expect a manager thread.
		pass "info threads 2"
	    }
	    1 {
		# We were expecting a manager thread.
		pass "info threads 2"
	    }
	    0 {
		# We were not expecting to see the manager thread.
		fail "info threads 2"
	    }
	}
	set expect_manager 1
	incr nthreads
    }
    -re "$info_threads_ptn" {
	# We did not see a manager thread.  Check that against what we
	# expected.
	switch -exact -- $expect_manager {
	    -1 {
		# We weren't sure whether to expect a manager thread.
		# Don't expect it from here on out.
		pass "info threads 2"
	    }
	    1 {
		# We were expecting a manager thread, but we didn't see one.
		fail "info threads 2"
	    }
	    0 {
		# We were not expecting to see the manager thread.
		pass "info threads 2"
	    }
	}
	set expect_manager 0
    }
}


# Try setting a thread-specific breakpoint.
gdb_breakpoint "print_philosopher thread 5"
gdb_continue_to_breakpoint "thread 5's print"
# When there is no debugging info available for the thread library,
# the backtrace entry for philosopher's caller looks like:
#    #2  0x4001c548 in pthread_create () from /lib/libpthread.so.0
# If you do have debug info, the output obviously depends more on the
# exact library in use; under NPTL, you get:
#    #2  0x0012b7fc in start_thread (arg=0x21) at pthread_create.c:264
gdb_test "where" "print_philosopher.*philosopher.* \(from .*libpthread\|at pthread_create\|in pthread_create\).*" \
	"first thread-specific breakpoint hit"

# Make sure it's catching the right thread.  Try hitting the
# breakpoint ten times, and make sure we don't get anyone else.
set only_five 1
for {set i 0} {$only_five > 0 && $i < 10} {incr i} {
    gdb_continue_to_breakpoint "thread 5's print, pass: $i"
    gdb_test_multiple "info threads" "" {
	-re "\\* 5 Thread .*  print_philosopher .*\r\n$gdb_prompt $" {
	    # Okay this time.
	}
	-re ".*$gdb_prompt $" {
	    set only_five 0
	}
	timeout { 
	    set only_five -1
	}
    }
}

set name "thread-specific breakpoint is thread-specific"
if {$only_five ==  1} { pass $name }
if {$only_five ==  0} { fail $name }
if {$only_five == -1} { fail "$name (timeout)" }


### Select a particular thread.
proc select_thread {thread} {
    global gdb_prompt

    gdb_test "thread $thread" \
	"\\\[Switching to thread .*\\\].*" \
	"selected thread: $thread"
}

### Select THREAD, check for a plausible backtrace, and make sure
### we're actually selecting a different philosopher each time.
### Return true if the thread had a stack which was not only
### acceptable, but interesting.  SEEN should be an array in which
### SEEN(N) exists iff we have found philosopher number N before.

set main_seen 0
set manager_seen 0

proc check_philosopher_stack {thread seen_name} {
    global gdb_prompt
    upvar $seen_name seen
    global main_seen
    global expect_manager manager_seen

    set name "philosopher is distinct: $thread"
    set interesting 0

    select_thread $thread
    gdb_test_multiple "where" "$name" {
	-re ".* in philosopher \\(data=(0x\[0-9a-f\]+).*\r\n$gdb_prompt $" {
	    set data $expect_out(1,string)
	    if {[info exists seen($data)]} {
		fail $name
	    } else {
		pass $name
		set seen($data) yep
	    }
	    set interesting 1
	}
	-re ".* in __pthread_manager \\(.*$gdb_prompt $" {
	    if {$manager_seen == 1} {
		fail "manager thread is distinct: $thread"
	    } else {
		set manager_seen 1
		pass "manager thread is distinct: $thread"
	    }
	    set interesting 1
	}
	-re "pthread_start_thread.*\r\n$gdb_prompt $" {
	    ## Maybe the thread hasn't started yet.
	    pass $name
	}
	-re ".* in main \\(.*$gdb_prompt $" {
	    if {$main_seen == 1} {
		fail "main is distinct: $thread"
	    } else {
		set main_seen 1
		pass "main is distinct: $thread"
	    }
	    set interesting 1
	}
	-re " in \\?\\?.*\r\n$gdb_prompt $" {
	    ## Sometimes we can't get a backtrace.  I'm going to call
	    ## this a pass, since we do verify that at least one
	    ## thread was interesting, so we can get more consistent
	    ## test suite totals.  But in my heart, I think it should
	    ## be an xfail.
	    pass $name
	}
    }

    return $interesting
}

set any_interesting 0
array set seen {}
unset seen
for {set i 1} {$i <= $nthreads} {incr i} {
    if [check_philosopher_stack $i seen] {
	set any_interesting 1
    }
}

if {$any_interesting} {
    pass "found an interesting thread"
} else {
    fail "found an interesting thread"
}

if {$manager_seen == $expect_manager} {
    pass "manager thread found (not found) when expected"
} else {
    fail "manager thread found (not found) when expected"
}
