hjl / source-git / glibc

Forked from source-git/glibc 3 years ago
Clone

Blame nptl/test-mutex-printers.py

Packit 6c4009
# Tests for the MutexPrinter class.
Packit 6c4009
#
Packit 6c4009
# Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit 6c4009
# This file is part of the GNU C Library.
Packit 6c4009
#
Packit 6c4009
# The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
# modify it under the terms of the GNU Lesser General Public
Packit 6c4009
# License as published by the Free Software Foundation; either
Packit 6c4009
# version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
#
Packit 6c4009
# The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
# Lesser General Public License for more details.
Packit 6c4009
#
Packit 6c4009
# You should have received a copy of the GNU Lesser General Public
Packit 6c4009
# License along with the GNU C Library; if not, see
Packit 6c4009
# <http://www.gnu.org/licenses/>.
Packit 6c4009
Packit 6c4009
import sys
Packit 6c4009
Packit 6c4009
from test_printers_common import *
Packit 6c4009
Packit 6c4009
test_source = sys.argv[1]
Packit 6c4009
test_bin = sys.argv[2]
Packit 6c4009
printer_files = sys.argv[3:]
Packit 6c4009
printer_names = ['global glibc-pthread-locks']
Packit 6c4009
Packit 6c4009
try:
Packit 6c4009
    init_test(test_bin, printer_files, printer_names)
Packit 6c4009
    go_to_main()
Packit 6c4009
Packit 6c4009
    var = 'mutex'
Packit 6c4009
    to_string = 'pthread_mutex_t'
Packit 6c4009
Packit 6c4009
    break_at(test_source, 'Test status (destroyed)')
Packit 6c4009
    continue_cmd() # Go to test_status_destroyed
Packit 6c4009
    test_printer(var, to_string, {'Status': 'Destroyed'})
Packit 6c4009
Packit 6c4009
    break_at(test_source, 'Test status (non-robust)')
Packit 6c4009
    continue_cmd() # Go to test_status_no_robust
Packit 6c4009
    test_printer(var, to_string, {'Status': 'Not acquired'})
Packit 6c4009
    next_cmd()
Packit 6c4009
    thread_id = get_current_thread_lwpid()
Packit 6c4009
    # Owner ID might be reported either as the thread ID or as "Unknown"
Packit 6c4009
    # (if e.g. lock elision is enabled).
Packit 6c4009
    test_printer(var, to_string,
Packit 6c4009
                 {'Status': 'Acquired, possibly with no waiters',
Packit 6c4009
                  'Owner ID': r'({0}|Unknown)'.format(thread_id)})
Packit 6c4009
Packit 6c4009
    break_at(test_source, 'Test status (robust)')
Packit 6c4009
    continue_cmd() # Go to test_status_robust
Packit 6c4009
    test_printer(var, to_string, {'Status': 'Not acquired'})
Packit 6c4009
Packit 6c4009
    # We'll now test the robust mutex locking states.  We'll create a new
Packit 6c4009
    # thread that will lock a robust mutex and exit without unlocking it.
Packit 6c4009
    break_at(test_source, 'Create')
Packit 6c4009
    continue_cmd() # Go to test_locking_state_robust
Packit 6c4009
    # Set a breakpoint for the new thread to hit.
Packit 6c4009
    break_at(test_source, 'Thread function')
Packit 6c4009
    continue_cmd()
Packit 6c4009
    # By now the new thread is created and has hit its breakpoint.
Packit 6c4009
    set_scheduler_locking(True)
Packit 6c4009
    parent = 1
Packit 6c4009
    child = 2
Packit 6c4009
    select_thread(child)
Packit 6c4009
    child_id = get_current_thread_lwpid()
Packit 6c4009
    # We've got the new thread's ID.
Packit 6c4009
    select_thread(parent)
Packit 6c4009
    # Make the new thread finish its function while we wait.
Packit 6c4009
    continue_cmd(thread=child)
Packit 6c4009
    # The new thread should be dead by now.
Packit 6c4009
    break_at(test_source, 'Test locking (robust)')
Packit 6c4009
    continue_cmd()
Packit 6c4009
    test_printer(var, to_string, {'Owner ID': r'{0} \(dead\)'.format(child_id)})
Packit 6c4009
    # Try to lock and unlock the mutex.
Packit 6c4009
    next_cmd()
Packit 6c4009
    test_printer(var, to_string, {'Owner ID': thread_id,
Packit 6c4009
                           'State protected by this mutex': 'Inconsistent'})
Packit 6c4009
    next_cmd()
Packit 6c4009
    test_printer(var, to_string, {'Status': 'Not acquired',
Packit 6c4009
                        'State protected by this mutex': 'Not recoverable'})
Packit 6c4009
    set_scheduler_locking(False)
Packit 6c4009
Packit 6c4009
    break_at(test_source, 'Test recursive locks')
Packit 6c4009
    continue_cmd() # Go to test_recursive_locks
Packit 6c4009
    test_printer(var, to_string, {'Times acquired by the owner': '2'})
Packit 6c4009
    next_cmd()
Packit 6c4009
    test_printer(var, to_string, {'Times acquired by the owner': '3'})
Packit 6c4009
    continue_cmd() # Exit
Packit 6c4009
Packit 6c4009
except (NoLineError, pexpect.TIMEOUT) as exception:
Packit 6c4009
    print('Error: {0}'.format(exception))
Packit 6c4009
    result = FAIL
Packit 6c4009
Packit 6c4009
else:
Packit 6c4009
    print('Test succeeded.')
Packit 6c4009
    result = PASS
Packit 6c4009
Packit 6c4009
exit(result)