libthr & atomic_xxx ops

Craig Rodrigues rodrigc at crodrigues.org
Fri Jul 29 02:36:16 GMT 2005


On Fri, Jul 29, 2005 at 12:38:39AM +0300, Giorgos Keramidas wrote:
> Recently, libpthread and libthr grew the following warnings in
> CURRENT:
> 
> # 2005-07-28 04:37:43.704726 - /usr/src/lib/libpthread/sys/lock.c:183: warning: passing arg 1 of `atomic_store_rel_int' from incompatible pointer type

This is similar to what I posted for sched_ule.c due to
changes to the macros in <machine/atomic.h>:
http://lists.freebsd.org/pipermail/freebsd-current/2005-July/052894.html


Can you try this patch, and see if the warnings go away?

--- lib/libthr/thread/thr_umtx.h.orig	Thu Jul 28 21:10:15 2005
+++ lib/libthr/thread/thr_umtx.h	Thu Jul 28 21:13:52 2005
@@ -53,7 +53,7 @@
 static inline int
 _thr_umtx_lock(volatile umtx_t *mtx, long id)
 {
-    if (atomic_cmpset_acq_ptr(mtx, (void *)UMTX_UNOWNED, (void *)id))
+    if (atomic_cmpset_acq_ptr((volatile uintptr_t *)mtx, (uintptr_t)UMTX_UNOWNED, (uintptr_t)id))
 	return (0);
     return __thr_umtx_lock(mtx, id);
 }
@@ -62,7 +62,7 @@
 _thr_umtx_timedlock(volatile umtx_t *mtx, long id,
 	const struct timespec *timeout)
 {
-    if (atomic_cmpset_acq_ptr(mtx, (void *)UMTX_UNOWNED, (void *)id))
+    if (atomic_cmpset_acq_ptr((volatile uintptr_t *)mtx, (uintptr_t)UMTX_UNOWNED, (uintptr_t)id))
 	return (0);
     return __thr_umtx_timedlock(mtx, id, timeout);
 }
@@ -70,7 +70,7 @@
 static inline int
 _thr_umtx_unlock(volatile umtx_t *mtx, long id)
 {
-    if (atomic_cmpset_rel_ptr(mtx, (void *)id, (void *)UMTX_UNOWNED))
+    if (atomic_cmpset_rel_ptr((volatile uintptr_t *)mtx, (uintptr_t)id, (uintptr_t)UMTX_UNOWNED))
 	return (0);
     return __thr_umtx_unlock(mtx, id);
 }
--- lib/libpthread/sys/lock.c.orig	Thu Jul 28 21:18:48 2005
+++ lib/libpthread/sys/lock.c	Thu Jul 28 21:24:47 2005
@@ -180,7 +180,7 @@
 	atomic_swap_ptr(&lck->l_head, lu->lu_myreq, &lu->lu_watchreq);
 
 	if (lu->lu_watchreq->lr_locked != 0) {
-		atomic_store_rel_ptr(&lu->lu_watchreq->lr_watcher, lu);
+		atomic_store_rel_ptr((volatile uintptr_t *)&lu->lu_watchreq->lr_watcher, (uintptr_t)lu);
 		if ((lck->l_wait == NULL) ||
 		    ((lck->l_type & LCK_ADAPTIVE) == 0)) {
 			while (lu->lu_watchreq->lr_locked != 0)
@@ -250,14 +250,14 @@
 
 		/* Update tail if our request is last. */
 		if (lu->lu_watchreq->lr_owner == NULL) {
-			atomic_store_rel_ptr(&lck->l_tail, lu->lu_myreq);
-			atomic_store_rel_ptr(&lu->lu_myreq->lr_owner, NULL);
+			atomic_store_rel_ptr((volatile uintptr_t *)&lck->l_tail, (uintptr_t)lu->lu_myreq);
+			atomic_store_rel_ptr((volatile uintptr_t *)&lu->lu_myreq->lr_owner, (uintptr_t)NULL);
 		} else {
 			/* Remove ourselves from the list. */
-			atomic_store_rel_ptr(&lu->lu_myreq->lr_owner,
-			    lu->lu_watchreq->lr_owner);
+			atomic_store_rel_ptr((volatile uintptr_t *)&lu->lu_myreq->lr_owner,
+			    (uintptr_t)lu->lu_watchreq->lr_owner);
 			atomic_store_rel_ptr(
-			    &lu->lu_watchreq->lr_owner->lu_myreq, lu->lu_myreq);
+			    (volatile uintptr_t *)&lu->lu_watchreq->lr_owner->lu_myreq, (uintptr_t)lu->lu_myreq);
 		}
 		/*
 		 * The watch request now becomes our own because we've




-- 
Craig Rodrigues        
rodrigc at crodrigues.org


More information about the freebsd-current mailing list