# Copyright 2009-2012 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/>.

load_lib "ada.exp"

set testdir "tasks"
set testfile "${testdir}/foo"
set srcfile ${srcdir}/${subdir}/${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}

file mkdir ${objdir}/${subdir}/${testdir}
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
  return -1
}

clean_restart ${testfile}

set bp_location [gdb_get_line_number "STOP_HERE" ${testdir}/foo.adb]
runto "foo.adb:$bp_location"

# Make sure that all tasks appear in the "info tasks" listing, and
# that the active task is the environment task.
gdb_test "info tasks" \
         [join {" +ID +TID P-ID Pri State +Name" \
                "\\* +1 .* main_task" \
                " +2 .* task_list\\(1\\)" \
                " +3 .* task_list\\(2\\)" \
                " +4 .* task_list\\(3\\)"} \
               "\r\n"] \
         "info tasks before inserting breakpoint"

# Now, insert a breakpoint that should stop only if task 3 stops.
gdb_test "break break_me task 3" "Breakpoint .* at .*"

# Continue to that breakpoint.  Task 2 should hit it first, and GDB
# is expected to ignore that hit and resume the execution.  Only then
# task 3 will hit our breakpoint, and GDB is expected to stop at that
# point.
gdb_test "continue" \
         ".*Breakpoint.*, foo.break_me \\(\\).*" \
         "continue to breakpoint"

# Check that it is indeed task 3 that hit the breakpoint by checking
# which is the active task.
gdb_test "info tasks" \
         [join {" +ID +TID P-ID Pri State +Name" \
                " +1 .* main_task" \
                " +2 .* task_list\\(1\\)" \
                "\\* +3 .* task_list\\(2\\)" \
                " +4 .* task_list\\(3\\)"} \
               "\r\n"] \
         "info tasks after hitting breakpoint"

# Now, resume the execution and make sure that GDB does not stop when
# task 4 hits the breakpoint. Continuing thus results in our program
# running to completion.
gdb_continue_to_end "" continue 1
