summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.mi/mi-nsintrall.exp
blob: b0d7b711269afaf1770fd2b479fc52d1a05b85f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Copyright 2008, 2009 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/>.

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

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if {[mi_gdb_start]} {
    continue
}

#
# Start here
#
set testfile "nsintrall"
set srcfile "$testfile.c"
set binfile "$objdir/$subdir/mi-$testfile"

set options [list debug incdir=$objdir]
if {[gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile executable $options] != "" } {
    return -1
}

mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load $binfile

set supported 0
send_gdb "-gdb-show non-stop\n"
gdb_expect {
    -re ".*\\^done,value=\"off\",supported=\"(\[^\"\]+)\"\r\n$mi_gdb_prompt$" {
	if { $expect_out(1,string) == "1" } {
	    set supported 1
	}
    }
    -re ".$mi_gdb_prompt$" {
    }
}

mi_gdb_test "-gdb-set non-stop 1" ".*"
mi_gdb_test "-gdb-set target-async 1" ".*"
detect_async

mi_gdb_test "200-break-insert -t main" ".*"

set created "=thread-created,id=\"$decimal\"\r\n"
set running "\\*running,thread-id=\"$decimal\"\r\n"

set notifs "($created)*($running)*"

# Note: presently, we skip this test on non-native targets,
# so 'run' is OK.  As soon as we start to run this on remote
# target, the logic from mi_run_cmd will have to be refactored.
send_gdb "-exec-run\n"
gdb_expect {
    -re "\\^running\r\n$notifs$mi_gdb_prompt" {
    }
    -re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
	verbose -log "Non-stop mode not supported, skipping all tests"
	return
    }
    -re "\r\n$mi_gdb_prompt" {
	perror "Cannot start target (unknown output after running)"
	return -1
    }
    timeout {
	perror "Cannot start target (timeout)"
	return -1
    }
}
mi_expect_stop "breakpoint-hit" main ".*" ".*" "\[0-9\]+" \
    { "" "disp=\"del\"" } "run to main"

mi_create_breakpoint thread_function 2 keep thread_function .* .* .* \
    "breakpoint at thread_function"

mi_send_resuming_command "exec-continue --all" "resume all"
for {set i 0} {$i < 6} {incr i} {
    mi_expect_stop "breakpoint-hit" "thread_function" "\[^\n\]*" "$srcfile" \
	"\[0-9\]*" {"" "disp=\"keep\""} "stop $i"
}

mi_check_thread_states \
    {"stopped" "stopped" "stopped" "stopped" "stopped" "stopped"} \
    "thread state, all stopped"

# now that we know about all the threads, we can get rid of the breakpoints
mi_delete_breakpoints

set running_re ""
for {set i 6} {$i > 0} {incr i -1} {
    set running_re "$running_re\\*running,thread-id=\"$i\"\r\n"
}

send_gdb "-exec-continue --all\n"
gdb_expect {
    -re ".*$running_re$mi_gdb_prompt" {
	pass "resume all, no breakpoint"
    }
    timeout {
	fail "resume all, no breakpoint (timeout)"
    }
}
mi_check_thread_states \
    {"running" "running" "running" "running" "running" "running"} \
    "thread state, resume all"

mi_gdb_test "200-exec-interrupt --all" "200\\^done" "interrupt all threads"

for {set i 0} {$i < 6} {incr i} {
    mi_expect_interrupt "interrupt $i"
}
mi_check_thread_states \
    {"stopped" "stopped" "stopped" "stopped" "stopped" "stopped"} \
    "thread state, all interrupted"

# resume all threads, and check that no thread is spuriously left interrupted
send_gdb "-exec-continue --all\n"
gdb_expect {
    -re ".*$running_re$mi_gdb_prompt" {
	pass "resume all after interrupting"
    }
    timeout {
	fail "resume all after interrupting (timeout)"
    }
}

sleep 1
mi_check_thread_states \
    {"running" "running" "running" "running" "running" "running"} \
    "thread state, resume all after interrupting"

mi_gdb_exit