FreeBSD Bugzilla – Attachment 153487 Details for
Bug 198014
Signals can lead to an inconsistency in PI mutex ownership
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
Test case for r277970
kern_umtx_inf_loop.c (text/x-c), 3.83 KB, created by
eric
on 2015-02-24 22:58:15 UTC
(
hide
)
Description:
Test case for r277970
Filename:
MIME Type:
Creator:
eric
Created:
2015-02-24 22:58:15 UTC
Size:
3.83 KB
patch
obsolete
>/*- > * Copyright (c) 2015 Eric van Gyzen > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions > * are met: > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * 2. Redistributions in binary form must reproduce the above copyright > * notice, this list of conditions and the following disclaimer in the > * documentation and/or other materials provided with the distribution. > * > * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > * SUCH DAMAGE. > */ > >/* > * This is a test case for the bug fixed by r277970. > * https://svnweb.freebsd.org/base?view=revision&revision=277970 > */ > >#include <sys/cdefs.h> >#include <sys/types.h> > >#include <machine/cpufunc.h> >#include <machine/cpu.h> > >#include <err.h> >#include <pthread.h> >#include <pthread_np.h> >#include <signal.h> >#include <stdio.h> >#include <stdlib.h> >#include <unistd.h> > >pthread_mutex_t the_mutex = PTHREAD_MUTEX_INITIALIZER; > >pthread_t contender; > >static void * >contender_func(void *arg) >{ > int error; > > (void) arg; > > error = pthread_mutex_lock(&the_mutex); > if (error) errc(1, error, "pthread_mutex_lock contender"); > > fprintf(stderr, "contender lock succeeded\n"); > > error = pthread_mutex_unlock(&the_mutex); > if (error) errc(1, error, "pthread_mutex_unlock contender"); > > fprintf(stderr, "contender unlock succeeded; exiting\n"); > > return (NULL); >} > >static void * >signaler_func(void *arg) >{ > int error; > > // Wait for the main thread to sleep. > usleep(100000); > > error = pthread_kill(contender, SIGHUP); > if (error) errc(1, error, "pthread_kill"); > > // Wait for the contender to lock umtx_lock > // in umtx_repropagate_priority. > usleep(100000); > > error = pthread_mutex_lock(&the_mutex); > if (error) errc(1, error, "pthread_mutex_lock signaler"); > > return (NULL); >} > >static void >usage() >{ > err(1, "usage: test [thread_count]"); >} > >int >main(int argc, char **argv) >{ > size_t thread_count; > int error; > > pthread_mutexattr_t mattr; > > error = pthread_mutexattr_init(&mattr); > if (error) errc(1, error, "pthread_mutexattr_init"); > > error = pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT); > if (error) errc(1, error, "pthread_mutexattr_setprotocol"); > > error = pthread_mutex_init(&the_mutex, &mattr); > if (error) errc(1, error, "pthread_mutex_init"); > > error = pthread_mutexattr_destroy(&mattr); > if (error) errc(1, error, "pthread_mutexattr_destroy"); > > //error = pthread_mutex_lock(&the_mutex); > //if (error) errc(1, error, "pthread_mutex_lock"); > > // Hack lock. > *(int *)the_mutex = pthread_getthreadid_np(); > > error = pthread_create(&contender, NULL, contender_func, NULL); > if (error) errc(1, error, "pthread_create"); > > // Wait for the contender to sleep. > usleep(100000); > > pthread_t signaler; > error = pthread_create(&signaler, NULL, signaler_func, NULL); > if (error) errc(1, error, "pthread_create"); > > error = pthread_mutex_lock(&the_mutex); > if (error) errc(1, error, "pthread_mutex_lock recurse"); > > return (0); >}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 198014
:
153475
|
153476
|
153477
|
153485
|
153486
| 153487 |
153524