mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 09:58:01 +00:00
We've seen a number of deadlocks in the tree since thread safety was introduced. So far, all of these are self-deadlocks, that is, a single thread acquiring a lock and then attempting to re-acquire the same lock recursively. When this has happened, the process simply hung, and it was somewhat difficult to find the cause. POSIX "error-checking" mutexes check for this specific problem (and others). This commit switches from other types of mutexes to error-checking mutexes everywhere that we can, that is, everywhere that we're not using recursive mutexes. This ought to help find problems more quickly in the future. There might be performance advantages to other kinds of mutexes in some cases. However, the existing mutex type choices were just guesses, so I'd rather go for easy detection of errors until we know that other mutex types actually perform better in specific cases. Also, I did a quick microbenchmark of glibc mutex types on my host and found that the error checking mutexes weren't any slower than the other types, at least when the mutex is uncontended. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
35 lines
1.2 KiB
C
35 lines
1.2 KiB
C
/*
|
|
* Copyright (c) 2013 Nicira, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef __CHECKER__
|
|
#error "Use this header only with sparse. It is not a correct implementation."
|
|
#endif
|
|
|
|
/* Get actual <pthread.h> definitions for us to annotate and build on. */
|
|
#include_next <pthread.h>
|
|
|
|
/* Sparse complains about the proper PTHREAD_*_INITIALIZER definitions.
|
|
* Luckily, it's not a real compiler so we can overwrite it with something
|
|
* simple. */
|
|
#undef PTHREAD_MUTEX_INITIALIZER
|
|
#define PTHREAD_MUTEX_INITIALIZER {}
|
|
|
|
#undef PTHREAD_RWLOCK_INITIALIZER
|
|
#define PTHREAD_RWLOCK_INITIALIZER {}
|
|
|
|
#undef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
|
|
#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP {}
|