]>
Commit | Line | Data |
---|---|---|
23b5cae1 MG |
1 | # Tests for the MutexPrinter class. |
2 | # | |
2b778ceb | 3 | # Copyright (C) 2016-2021 Free Software Foundation, Inc. |
23b5cae1 MG |
4 | # This file is part of the GNU C Library. |
5 | # | |
6 | # The GNU C Library is free software; you can redistribute it and/or | |
7 | # modify it under the terms of the GNU Lesser General Public | |
8 | # License as published by the Free Software Foundation; either | |
9 | # version 2.1 of the License, or (at your option) any later version. | |
10 | # | |
11 | # The GNU C Library is distributed in the hope that it will be useful, | |
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | # Lesser General Public License for more details. | |
15 | # | |
16 | # You should have received a copy of the GNU Lesser General Public | |
17 | # License along with the GNU C Library; if not, see | |
5a82c748 | 18 | # <https://www.gnu.org/licenses/>. |
23b5cae1 MG |
19 | |
20 | import sys | |
21 | ||
22 | from test_printers_common import * | |
23 | ||
24 | test_source = sys.argv[1] | |
25 | test_bin = sys.argv[2] | |
26 | printer_files = sys.argv[3:] | |
27 | printer_names = ['global glibc-pthread-locks'] | |
28 | ||
29 | try: | |
30 | init_test(test_bin, printer_files, printer_names) | |
31 | go_to_main() | |
32 | ||
33 | var = 'mutex' | |
34 | to_string = 'pthread_mutex_t' | |
35 | ||
36 | break_at(test_source, 'Test status (destroyed)') | |
37 | continue_cmd() # Go to test_status_destroyed | |
38 | test_printer(var, to_string, {'Status': 'Destroyed'}) | |
39 | ||
40 | break_at(test_source, 'Test status (non-robust)') | |
41 | continue_cmd() # Go to test_status_no_robust | |
6d523660 | 42 | test_printer(var, to_string, {'Status': 'Not acquired'}) |
23b5cae1 MG |
43 | next_cmd() |
44 | thread_id = get_current_thread_lwpid() | |
6d523660 TR |
45 | # Owner ID might be reported either as the thread ID or as "Unknown" |
46 | # (if e.g. lock elision is enabled). | |
47 | test_printer(var, to_string, | |
48 | {'Status': 'Acquired, possibly with no waiters', | |
49 | 'Owner ID': r'({0}|Unknown)'.format(thread_id)}) | |
23b5cae1 MG |
50 | |
51 | break_at(test_source, 'Test status (robust)') | |
52 | continue_cmd() # Go to test_status_robust | |
6d523660 | 53 | test_printer(var, to_string, {'Status': 'Not acquired'}) |
23b5cae1 MG |
54 | |
55 | # We'll now test the robust mutex locking states. We'll create a new | |
56 | # thread that will lock a robust mutex and exit without unlocking it. | |
57 | break_at(test_source, 'Create') | |
58 | continue_cmd() # Go to test_locking_state_robust | |
59 | # Set a breakpoint for the new thread to hit. | |
60 | break_at(test_source, 'Thread function') | |
61 | continue_cmd() | |
62 | # By now the new thread is created and has hit its breakpoint. | |
63 | set_scheduler_locking(True) | |
64 | parent = 1 | |
65 | child = 2 | |
66 | select_thread(child) | |
67 | child_id = get_current_thread_lwpid() | |
68 | # We've got the new thread's ID. | |
69 | select_thread(parent) | |
70 | # Make the new thread finish its function while we wait. | |
71 | continue_cmd(thread=child) | |
72 | # The new thread should be dead by now. | |
73 | break_at(test_source, 'Test locking (robust)') | |
74 | continue_cmd() | |
75 | test_printer(var, to_string, {'Owner ID': r'{0} \(dead\)'.format(child_id)}) | |
76 | # Try to lock and unlock the mutex. | |
77 | next_cmd() | |
78 | test_printer(var, to_string, {'Owner ID': thread_id, | |
79 | 'State protected by this mutex': 'Inconsistent'}) | |
80 | next_cmd() | |
6d523660 | 81 | test_printer(var, to_string, {'Status': 'Not acquired', |
23b5cae1 MG |
82 | 'State protected by this mutex': 'Not recoverable'}) |
83 | set_scheduler_locking(False) | |
84 | ||
85 | break_at(test_source, 'Test recursive locks') | |
86 | continue_cmd() # Go to test_recursive_locks | |
6d523660 | 87 | test_printer(var, to_string, {'Times acquired by the owner': '2'}) |
23b5cae1 | 88 | next_cmd() |
6d523660 | 89 | test_printer(var, to_string, {'Times acquired by the owner': '3'}) |
23b5cae1 MG |
90 | continue_cmd() # Exit |
91 | ||
92 | except (NoLineError, pexpect.TIMEOUT) as exception: | |
93 | print('Error: {0}'.format(exception)) | |
94 | result = FAIL | |
95 | ||
96 | else: | |
97 | print('Test succeeded.') | |
98 | result = PASS | |
99 | ||
100 | exit(result) |