2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

ovs-thread: New module, initially just with pthreads wrapper functions.

The only tricky part here is that I'm throwing in annotations to allow
"sparse" to report unbalanced locking.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Ethan Jackson <ethan@nicira.com>
This commit is contained in:
Ben Pfaff
2013-06-24 11:05:10 -07:00
parent 1c3e353dbd
commit ec68790f6d
6 changed files with 278 additions and 1 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 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.
@@ -41,6 +41,40 @@
#define OVS_UNLIKELY(CONDITION) (!!(CONDITION))
#endif
#ifdef __CHECKER__
/* "sparse" annotations for mutexes and mutex-like constructs.
*
* In a function prototype, OVS_ACQUIRES(MUTEX) indicates that the function
* must be called without MUTEX acquired and that it returns with MUTEX
* acquired. OVS_RELEASES(MUTEX) indicates the reverse. OVS_MUST_HOLD
* indicates that the function must be called with MUTEX acquired by the
* caller and that the function does not release MUTEX.
*
* In practice, sparse ignores the MUTEX argument. It need not even be a
* valid expression. It is meant to indicate to human readers what mutex is
* being acquired.
*
* Since sparse ignores MUTEX, it need not be an actual mutex. It can be
* any construct on which paired acquire and release semantics make sense:
* read/write locks, temporary memory allocations, whatever.
*
* OVS_ACQUIRE, OVS_RELEASE, and OVS_HOLDS are suitable for use within macros,
* where there is no function prototype to annotate. */
#define OVS_ACQUIRES(MUTEX) __attribute__((context(MUTEX, 0, 1)))
#define OVS_RELEASES(MUTEX) __attribute__((context(MUTEX, 1, 0)))
#define OVS_MUST_HOLD(MUTEX) __attribute__((context(MUTEX, 1, 1)))
#define OVS_ACQUIRE(MUTEX) __context__(MUTEX, 0, 1)
#define OVS_RELEASE(MUTEX) __context__(MUTEX, 1, 0)
#define OVS_HOLDS(MUTEX) __context__(MUTEX, 1, 1)
#else
#define OVS_ACQUIRES(MUTEX)
#define OVS_RELEASES(MUTEX)
#define OVS_MUST_HOLD(MUTEX)
#define OVS_ACQUIRE(MUTEX)
#define OVS_RELEASE(MUTEX)
#define OVS_HOLDS(MUTEX)
#endif
/* ISO C says that a C implementation may choose any integer type for an enum
* that is sufficient to hold all of its values. Common ABIs (such as the
* System V ABI used on i386 GNU/Linux) always use a full-sized "int", even