diff --git a/Makefile b/Makefile index de696c7..513b323 100644 --- a/Makefile +++ b/Makefile @@ -1,41 +1,40 @@ -# $FreeBSD$ - -PACKAGE=lib${LIB} LIB= stdthreads -SHLIB_MAJOR= 0 +PACKAGE_VERSION?= 0.3.2 +PREFIX?= /usr -INCS= threads.h +HDR= threads.h SRCS= threads.h call_once.c cnd.c mtx.c thrd.c tss.c MAN= thrd_create.3 -MLINKS= thrd_create.3 call_once.3 \ - thrd_create.3 cnd_broadcast.3 \ - thrd_create.3 cnd_destroy.3 \ - thrd_create.3 cnd_init.3 \ - thrd_create.3 cnd_signal.3 \ - thrd_create.3 cnd_timedwait.3 \ - thrd_create.3 cnd_wait.3 \ - thrd_create.3 mtx_destroy.3 \ - thrd_create.3 mtx_init.3 \ - thrd_create.3 mtx_lock.3 \ - thrd_create.3 mtx_timedlock.3 \ - thrd_create.3 mtx_trylock.3 \ - thrd_create.3 mtx_unlock.3 \ - thrd_create.3 thrd_current.3 \ - thrd_create.3 thrd_detach.3 \ - thrd_create.3 thrd_equal.3 \ - thrd_create.3 thrd_exit.3 \ - thrd_create.3 thrd_join.3 \ - thrd_create.3 thrd_sleep.3 \ - thrd_create.3 thrd_yield.3 \ - thrd_create.3 tss_create.3 \ - thrd_create.3 tss_delete.3 \ - thrd_create.3 tss_get.3 \ - thrd_create.3 tss_set.3 -LIBADD= pthread +CPPFLAGS+= -Wno-incompatible-pointer-types-discards-qualifiers +LDADD= -L${BSDOBJDIR}/lib/librthread -lpthread -VERSION_DEF= ${SRCTOP}/lib/libc/Versions.def -SYMBOL_MAPS= ${.CURDIR}/Symbol.map +VERSION_SCRIPT= ${.CURDIR}/Symbol.map + +includes: + @cd ${.CURDIR}; j="cmp -s ${HDR} ${DESTDIR}/usr/include/${HDR} || \ + ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} \ + -m 444 ${HDR} ${DESTDIR}/usr/include"; \ + echo $$j; \ + eval "$$j"; \ + +stdthreads.pc: stdthreads.pc.in + @sed -e 's#@prefix@#${PREFIX}#g' \ + -e 's#@exec_prefix@#$${prefix}#g' \ + -e 's#@libdir@#$${exec_prefix}/lib#g' \ + -e 's#@includedir@#$${prefix}/include#g' \ + -e 's#@PACKAGE_VERSION@#'${PACKAGE_VERSION}'#g' \ + < ${.CURDIR}/stdthreads.pc.in > $@ + +all: stdthreads.pc + +CLEANFILES+= stdthreads.pc + +install-pc: stdthreads.pc + ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} -m 444 \ + stdthreads.pc ${DESTDIR}${LIBDIR}/pkgconfig + +realinstall: install-pc .include diff --git a/Makefile.depend b/Makefile.depend deleted file mode 100644 index 25b26ea..0000000 --- a/Makefile.depend +++ /dev/null @@ -1,17 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - include \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - lib/libthr \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/Symbol.map b/Symbol.map index 0fe6eac..ade78da 100644 --- a/Symbol.map +++ b/Symbol.map @@ -1,31 +1,30 @@ -/* - * $FreeBSD$ - */ - -FBSD_1.3 { - call_once; - cnd_broadcast; - cnd_destroy; - cnd_init; - cnd_signal; - cnd_timedwait; - cnd_wait; - mtx_destroy; - mtx_init; - mtx_lock; - mtx_timedlock; - mtx_trylock; - mtx_unlock; - thrd_create; - thrd_current; - thrd_detach; - thrd_equal; - thrd_exit; - thrd_join; - thrd_sleep; - thrd_yield; - tss_create; - tss_delete; - tss_get; - tss_set; +{ + global: + call_once; + cnd_broadcast; + cnd_destroy; + cnd_init; + cnd_signal; + cnd_timedwait; + cnd_wait; + mtx_destroy; + mtx_init; + mtx_lock; + mtx_timedlock; + mtx_trylock; + mtx_unlock; + thrd_create; + thrd_current; + thrd_detach; + thrd_equal; + thrd_exit; + thrd_join; + thrd_sleep; + thrd_yield; + tss_create; + tss_delete; + tss_get; + tss_set; + local: + *; }; diff --git a/call_once.c b/call_once.c index f00e308..0f32bb5 100644 --- a/call_once.c +++ b/call_once.c @@ -25,11 +25,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ */ #include -__FBSDID("$FreeBSD$"); #include diff --git a/cnd.c b/cnd.c index 0c3cbdd..462c7df 100644 --- a/cnd.c +++ b/cnd.c @@ -25,11 +25,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ */ #include -__FBSDID("$FreeBSD$"); #include #include diff --git a/mtx.c b/mtx.c index 124ddd6..1e04187 100644 --- a/mtx.c +++ b/mtx.c @@ -25,11 +25,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ */ #include -__FBSDID("$FreeBSD$"); #include #include diff --git a/shlib_version b/shlib_version new file mode 100644 index 0000000..97c9f92 --- /dev/null +++ b/shlib_version @@ -0,0 +1,2 @@ +major=0 +minor=0 diff --git a/stdthreads.pc.in b/stdthreads.pc.in new file mode 100644 index 0000000..6e06247 --- /dev/null +++ b/stdthreads.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: stdthreads +Description: The C11 standard threads library +Version: @PACKAGE_VERSION@ + +Cflags: -I${includedir} +Libs: -L${libdir} -lstdthreads -lpthread diff --git a/thrd.c b/thrd.c index 5ecfb91..15e0269 100644 --- a/thrd.c +++ b/thrd.c @@ -25,11 +25,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ */ #include -__FBSDID("$FreeBSD$"); #include #include diff --git a/thrd_create.3 b/thrd_create.3 index df3bd4f..79026ee 100644 --- a/thrd_create.3 +++ b/thrd_create.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 26, 2011 .Dt THRD_CREATE 3 .Os diff --git a/threads.h b/threads.h index fdf56bb..0d2fd3d 100644 --- a/threads.h +++ b/threads.h @@ -33,6 +33,60 @@ #include +/* + * Lock annotations. + * + * Clang provides support for doing basic thread-safety tests at + * compile-time, by marking which locks will/should be held when + * entering/leaving a functions. + * + * Furthermore, it is also possible to annotate variables and structure + * members to enforce that they are only accessed when certain locks are + * held. + */ + +#if __has_extension(c_thread_safety_attributes) +#define __lock_annotate(x) __attribute__((x)) +#else +#define __lock_annotate(x) +#endif + +/* Structure implements a lock. */ +#define __lockable __lock_annotate(lockable) + +/* Function acquires an exclusive or shared lock. */ +#define __locks_exclusive(...) \ + __lock_annotate(exclusive_lock_function(__VA_ARGS__)) +#define __locks_shared(...) \ + __lock_annotate(shared_lock_function(__VA_ARGS__)) + +/* Function attempts to acquire an exclusive or shared lock. */ +#define __trylocks_exclusive(...) \ + __lock_annotate(exclusive_trylock_function(__VA_ARGS__)) +#define __trylocks_shared(...) \ + __lock_annotate(shared_trylock_function(__VA_ARGS__)) + +/* Function releases a lock. */ +#define __unlocks(...) __lock_annotate(unlock_function(__VA_ARGS__)) + +/* Function asserts that an exclusive or shared lock is held. */ +#define __asserts_exclusive(...) \ + __lock_annotate(assert_exclusive_lock(__VA_ARGS__)) +#define __asserts_shared(...) \ + __lock_annotate(assert_shared_lock(__VA_ARGS__)) + + +/* Function requires that an exclusive or shared lock is or is not held. */ +#define __requires_exclusive(...) \ + __lock_annotate(exclusive_locks_required(__VA_ARGS__)) +#define __requires_shared(...) \ + __lock_annotate(shared_locks_required(__VA_ARGS__)) +#define __requires_unlocked(...) \ + __lock_annotate(locks_excluded(__VA_ARGS__)) + +/* Function should not be analyzed. */ +#define __no_lock_analysis __lock_annotate(no_thread_safety_analysis) + /* * The C11 threads interface. * diff --git a/tss.c b/tss.c index a7e085b..6ffa8e4 100644 --- a/tss.c +++ b/tss.c @@ -25,11 +25,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ */ #include -__FBSDID("$FreeBSD$"); #include