# Copyright (C) 1996, 1997 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Fred Fish. (fnf@cygnus.com)

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

# This only works with native configurations
if ![isnative] then {
    return
}

set testfile "pthreads"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# regexp for "horizontal" text (i.e. doesn't include newline or
# carriage return)
set horiz "\[^\n\r\]*"

set built_binfile 0
if [istarget "*-*-linux"] then {
    set target_cflags "-D_MIT_POSIX_THREADS"
} else {
    set target_cflags ""
}
set why_msg "unrecognized error"
foreach lib {-lpthreads -lpthread -lthread} {
    set options "debug"
    lappend options "incdir=${objdir}/${subdir}"
    lappend options "libs=$lib"
    set ccout [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options]
    switch -regexp -- $ccout {
	".*no posix threads support.*" {
	    set why_msg "missing threads include file"
	    break
	}
	".*cannot open -lpthread.*" {
	    set why_msg "missing runtime threads library"
	}
	".*Can't find library for -lpthread.*" {
	    set why_msg "missing runtime threads library"
	}
	{^$} {
	    pass "successfully compiled posix threads test case"
	    set built_binfile 1
	    break
	}
    }
}
if {$built_binfile == "0"} {
    unsupported "Couldn't compile ${srcfile}, ${why_msg}"
    return -1
}

# Now we can proceed with the real testing.

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "set print sevenbit-strings" ""
#gdb_test "set print address off" ""
gdb_test "set width 0" ""

# We'll need this when we send_gdb a ^C to GDB.  Need to do it before we
# run the program and gdb starts saving and restoring tty states.
# On Ultrix, we don't need it and it is really slow (because shell_escape
# doesn't use vfork).
if ![istarget "*-*-ultrix*"] then {
    gdb_test "shell stty intr '^C'" ""
}

proc all_threads_running {} {
    global gdb_prompt
    global srcfile

    # Reset all the counters to zero.
    gdb_test "set var common_routine::hits=0" ""
    gdb_test "set var common_routine::from_thread1=0" ""
    gdb_test "set var common_routine::from_thread2=0" ""
    gdb_test "set var common_routine::from_main=0" ""
    gdb_test "set var common_routine::full_coverage=0" ""

    # Disable all breakpoints.
    gdb_test "disable" ""

    # Set up a breakpoint that will cause us to stop when we have
    # been called 15 times.  This should be plenty of time to allow
    # every thread to run at least once, since each thread sleeps for
    # one second between calls to common_routine.
    gdb_test "tbreak common_routine if hits >= 15" ""

    # Start all the threads running again and wait for the inferior
    # to stop.  Since no other breakpoints are set at this time
    # we should stop only when we have been previously called 15 times.

    send_gdb "continue\n"
    gdb_expect {
	-re "Continuing.*common_routine.*at.*$srcfile.*$gdb_prompt $" {}
	default {
	    fail "continue until common routine run 15 times"
	    return 0
	}
	timeout {
	    fail "continue until common routine run 15 times (timeout)"
	    return 0
	}
    }

    # Check that we stopped when we actually expected to stop, by
    # verifying that there have been 15 previous hits.

    # NOTE: Because of synchronization behavior, it is possible for
    # more than one thread to increment "hits" between one breakpoint
    # trap and the next.  So stopping after 16 or 17 hits should be
    # considered acceptable.

    send_gdb "p common_routine::hits\n"
    gdb_expect {
	-re ".*= 15\r\n$gdb_prompt $" {
	    pass "stopped before calling common_routine 15 times"
	}
	-re ".*= 16\r\n$gdb_prompt $" {
	    pass "stopped before calling common_routine 15 times (16 times)"
	}
	-re ".*= 17\r\n$gdb_prompt $" {
	    pass "stopped before calling common_routine 15 times (17 times)"
	}
	default {
	    fail "stopped before calling common_routine 15 times"
	    return 0
	}
	-re ".*$gdb_prompt $" {
	    fail "stopped before calling common_routine 15 times"
	    return 0
	}
	timeout {
	    fail "stopped before calling common_routine 15 times (timeout)"
	    return 0
	}
    }

    # Also check that all of the threads have run, which will only be true
    # if the full_coverage variable is set.

    send_gdb "p common_routine::full_coverage\n"
    gdb_expect {
	-re ".* = 1.*$gdb_prompt $" {}
	-re ".* = 0.*$gdb_prompt $" {
	    fail "some threads didn't run"
	    return 0
	}
	default {
	    fail "some threads didn't run"
	    return 0
	}
	timeout {
	    fail "some threads didn't run (timeout)"
	    return 0
	}
    }

    # Looks fine, return success.
    return 1
}

proc test_startup {} {
    global srcdir srcfile gdb_prompt expect_out
    global horiz
    global main_id thread1_id thread2_id

    # We should be able to do an info threads before starting any others.
    send_gdb "info threads\n"
    gdb_expect {
	-re ".*Thread.*main.*$gdb_prompt $" {
	    pass "info threads"
	}
	-re "\r\n$gdb_prompt $" {
	    unsupported "gdb does not support pthreads for this machine"
	    return 0
	}
    }

    # Extract the thread id number of main thread from "info threads" output.
    send_gdb "info threads\n"
    gdb_expect -re "(\[0-9\]+)(${horiz}Thread${horiz}main.*)($gdb_prompt $)"
    set main_id $expect_out(1,string)

    # Check that we can continue and create the first thread.
    gdb_test "break thread1" "Breakpoint .* file .*$srcdir.*"
    gdb_test "continue" \
	    "Continuing.*Breakpoint .*, thread1 \\(arg=0xfeedface\\).*at.*$srcfile.*" \
	    "Continue to creation of first thread"
    gdb_test "disable" ""

    # Extract the thread id number of thread 1 from "info threads" output.
    send_gdb "info threads\n"
    gdb_expect -re "(\[0-9\]+)(${horiz}Thread${horiz}thread1.*)($gdb_prompt $)"
    set thread1_id $expect_out(1,string)

    # Check that we can continue and create the second thread,
    # ignoring the first thread for the moment.
    gdb_test "break thread2" "Breakpoint .* file .*$srcdir.*"
    gdb_test "continue" \
	    "Continuing.*Breakpoint .*, thread2 \\(arg=0xdeadbeef\\).*at.*$srcfile.*" \
	    "Continue to creation of second thread"

    # Extract the thread id number of thread 2 from "info threads" output.
    send_gdb "info threads\n"
    gdb_expect -re "(\[0-9\]+)(${horiz}Thread${horiz}thread2.*)($gdb_prompt $)"
    set thread2_id $expect_out(1,string)

    return 1
}

proc check_control_c {} {
    global gdb_prompt

    # Verify that all threads are running.
    if [all_threads_running] then {
	pass "All threads running after startup"
    }

    # Send a continue followed by ^C to the process to stop it.
    send_gdb "continue\n"
    gdb_expect {
	-re "Continuing." {
	    pass "Continue with all threads running"
	}
	timeout {
	    fail "Continue with all threads running (timeout)"
	}
    }
    sleep 1
    set description "Stopped with a ^C"
    after 1000 [send_gdb "\003"]
    gdb_expect {
	-re "Program received signal SIGINT.*$gdb_prompt $" {
	    pass $description
	}
	-re "Quit.*$gdb_prompt $" {
	    pass $description
	}
	timeout {
	    fail "$description (timeout)"
	    return 1;
	}
    }
    gdb_test "bt" ""

    # Verify that all threads can be run again after a ^C stop.
    if [all_threads_running] then {
	pass "All threads running after continuing from ^C stop"
    }
    return 0;
}

proc check_backtraces {} {
    global gdb_prompt main_id thread1_id thread2_id

    # Check that the "thread apply N backtrace" command works

    gdb_test "thread apply $main_id backtrace" \
	    ".* in main \\(argc=.*, argv=.*\\).*" \
	    "check backtrace from main thread"
    gdb_test "thread apply $thread1_id backtrace" \
	    ".* in thread1 \\(arg=0xfeedface\\).*" \
	    "check backtrace from thread 1"
    gdb_test "thread apply $thread2_id backtrace" \
	    ".* in thread2 \\(arg=0xdeadbeef\\).*" \
	    "check backtrace from thread 2"

    # Check that we can apply the backtrace command to all
    # three threads with a single gdb command

    gdb_test "thread apply $main_id $thread1_id $thread2_id bt" \
	    ".* in main .* in thread1 .* in thread2.*" \
	    "apply backtrace command to all three threads"

    # Check that we can do thread specific backtraces
    # This also tests that we can do thread specific breakpoints.

    gdb_test "break common_routine thread $thread2_id" \
	    "Breakpoint .* at 0x.* file .* line .*" \
	    "set break at common_routine in thread 2"

    send_gdb "continue\n"
    gdb_expect {
	-re "Breakpoint .* common_routine \\(arg=2\\).*" {
	    pass "continue to bkpt at common_routine in thread 2"
	    send_gdb "backtrace\n"
	    gdb_expect {
		-re "#0.*common_routine \\(arg=2\\).*#1.*thread2.*" {
		    pass "backtrace from thread 2 bkpt in common_routine"
		}
		default {
		    fail "backtrace from thread 2 bkpt in common_routine"
		}
		timeout {
		    fail "backtrace from thread 2 bkpt in common_routine (timeout)"
		}
	    }
	}
	-re "Breakpoint .* common_routine \\(arg=0\\).*" {
	    fail "continue to bkpt at common_routine in thread 2 (arg=0)"
	}
	-re "Breakpoint .* common_routine \\(arg=1\\).*" {
	    fail "continue to bkpt at common_routine in thread 2 (arg=1)"
	}
	-re ".*$gdb_prompt" {
	    fail "continue to bkpt at common_routine in thread 2"
	}
	default {
	    fail "continue to bkpt at common_routine in thread 2 (default)"
	}
	timeout {
	    fail "continue to bkpt at common_routine in thread 2 (timeout)"
	}
    }
}

setup_xfail "alpha-*-osf*"
if [runto_main] then {
    clear_xfail "alpha-*-osf*"
    if [test_startup] then {
	if [check_control_c] then {
	    warning "Could not stop child with ^C; skipping rest of tests.\n"
	    return;
	}
	check_backtraces
    }
}
clear_xfail "alpha-*-osf*"
