Date: Wed, 12 Feb 2003 03:25:17 -0800 (PST) From: David Schultz <dschultz@uclink.Berkeley.EDU> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/48205: [PATCH] sys/$arch/include/critical.h: fix gccisms Message-ID: <200302121125.h1CBPHZ7007869@HAL9000.homeunix.com>
next in thread | raw e-mail | index | archive | help
>Number: 48205
>Category: kern
>Synopsis: [PATCH] sys/$arch/include/critical.h: fix gccisms
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Feb 12 03:30:08 PST 2003
>Closed-Date:
>Last-Modified:
>Originator: David Schultz
>Release: 5.0-CURRENT
>Organization:
>Environment:
>Description:
All of the sys/$arch/include/critical.h files have a !__GNUC__ case that
is not syntactically or logically valid. This patch eliminates the need
for a !__GNUC__ case by macroifying some simple inline functions.
This patch has been compile tested on i386. It should introduce no
functional changes.
>How-To-Repeat:
>Fix:
Index: alpha/include/critical.h
===================================================================
RCS file: /home/ncvs/src/sys/alpha/include/critical.h,v
retrieving revision 1.1
diff -u -r1.1 critical.h
--- alpha/include/critical.h 1 Apr 2002 23:51:22 -0000 1.1
+++ alpha/include/critical.h 10 Feb 2003 16:25:55 -0000
@@ -26,22 +26,15 @@
void cpu_critical_fork_exit(void);
void cpu_thread_link(struct thread *td);
-#ifdef __GNUC__
-
/*
* cpu_critical_enter:
*
* This routine is called from critical_enter() on the 0->1 transition
* of td_critnest, prior to it being incremented to 1.
*/
-static __inline void
-cpu_critical_enter(void)
-{
- struct thread *td;
-
- td = curthread;
- td->td_md.md_savecrit = intr_disable();
-}
+#define cpu_critical_enter() do { \
+ curthread->td_md.md_savecrit = intr_disable(); \
+} while (0)
/*
* cpu_critical_exit:
@@ -50,21 +43,7 @@
* of td_critnest, after it has been decremented to 0. We are
* exiting the last critical section.
*/
-static __inline void
-cpu_critical_exit(void)
-{
- struct thread *td;
-
- td = curthread;
- intr_restore(td->td_md.md_savecrit);
-}
-
-#else /* !__GNUC__ */
-
-void cpu_critical_enter(void)
-void cpu_critical_exit(void)
-
-#endif /* __GNUC__ */
+#define cpu_critical_exit() (void)intr_restore(curthread->td_md.md_savecrit)
__END_DECLS
Index: i386/include/critical.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/critical.h,v
retrieving revision 1.2
diff -u -r1.2 critical.h
--- i386/include/critical.h 10 Jul 2002 20:15:58 -0000 1.2
+++ i386/include/critical.h 10 Feb 2003 16:26:01 -0000
@@ -27,8 +27,6 @@
void cpu_critical_fork_exit(void);
void cpu_thread_link(struct thread *td);
-#ifdef __GNUC__
-
/*
* cpu_critical_enter:
*
@@ -51,31 +49,19 @@
* Note that the td->critnest (1->0) transition interrupt race against
* our int_pending/unpend() check below is handled by the interrupt
* code for us, so we do not have to do anything fancy.
+ *
+ * We may have to schedule pending interrupts. Create conditions
+ * similar to an interrupt context and call unpend().
+ *
+ * note: we do this even if we are in an interrupt nesting level.
+ * Deep nesting is protected by critical_*() and if we
+ * conditionalized it then we would have to check int_pending
+ * again whenever we decrement td_intr_nesting_level to 0.
*/
-static __inline void
-cpu_critical_exit(void)
-{
- /*
- * We may have to schedule pending interrupts. Create
- * conditions similar to an interrupt context and call
- * unpend().
- *
- * note: we do this even if we are in an interrupt
- * nesting level. Deep nesting is protected by
- * critical_*() and if we conditionalized it then we
- * would have to check int_pending again whenever
- * we decrement td_intr_nesting_level to 0.
- */
- if (PCPU_GET(int_pending))
- cpu_unpend();
-}
-
-#else /* !__GNUC__ */
-
-void cpu_critical_enter(void)
-void cpu_critical_exit(void)
-
-#endif /* __GNUC__ */
+#define cpu_critical_exit() do { \
+ if (PCPU_GET(int_pending)) \
+ cpu_unpend(); \
+} while (0)
__END_DECLS
Index: ia64/include/critical.h
===================================================================
RCS file: /home/ncvs/src/sys/ia64/include/critical.h,v
retrieving revision 1.1
diff -u -r1.1 critical.h
--- ia64/include/critical.h 1 Apr 2002 23:51:22 -0000 1.1
+++ ia64/include/critical.h 10 Feb 2003 16:26:02 -0000
@@ -26,22 +26,15 @@
void cpu_critical_fork_exit(void);
void cpu_thread_link(struct thread *td);
-#ifdef __GNUC__
-
/*
* cpu_critical_enter:
*
* This routine is called from critical_enter() on the 0->1 transition
* of td_critnest, prior to it being incremented to 1.
*/
-static __inline void
-cpu_critical_enter(void)
-{
- struct thread *td;
-
- td = curthread;
- td->td_md.md_savecrit = intr_disable();
-}
+#define cpu_critical_enter() do { \
+ curthread->td_md.md_savecrit = intr_disable(); \
+} while (0)
/*
* cpu_critical_exit:
@@ -50,22 +43,7 @@
* of td_critnest, after it has been decremented to 0. We are
* exiting the last critical section.
*/
-static __inline void
-cpu_critical_exit(void)
-{
- struct thread *td;
-
- td = curthread;
- intr_restore(td->td_md.md_savecrit);
-}
-
-
-#else /* !__GNUC__ */
-
-void cpu_critical_enter(void)
-void cpu_critical_exit(void)
-
-#endif /* __GNUC__ */
+#define cpu_critical_exit() (void)intr_restore(curthread->td_md.md_savecrit)
__END_DECLS
Index: powerpc/include/critical.h
===================================================================
RCS file: /home/ncvs/src/sys/powerpc/include/critical.h,v
retrieving revision 1.2
diff -u -r1.2 critical.h
--- powerpc/include/critical.h 29 Jun 2002 09:55:57 -0000 1.2
+++ powerpc/include/critical.h 10 Feb 2003 16:26:10 -0000
@@ -26,8 +26,6 @@
void cpu_critical_fork_exit(void);
void cpu_thread_link(struct thread *td);
-#ifdef __GNUC__
-
/*
* cpu_critical_enter:
*
@@ -35,17 +33,12 @@
* of td_critnest, prior to it being incremented to 1.
*/
-static __inline void
-cpu_critical_enter(void)
-{
- u_int msr;
- struct thread *td = curthread;
-
- msr = mfmsr();
- td->td_md.md_savecrit = msr;
- msr &= ~PSL_EE;
- mtmsr(msr);
-}
+#define cpu_critical_enter() do { \
+ u_int _msr = mfmsr(); \
+ curthread->td_md.md_savecrit = _msr; \
+ _msr &= ~PSL_EE; \
+ _mtmsr(_msr); \
+} while (0)
/*
* cpu_critical_exit:
@@ -54,21 +47,7 @@
* of td_critnest, after it has been decremented to 0. We are
* exiting the last critical section.
*/
-static __inline void
-cpu_critical_exit(void)
-{
- struct thread *td = curthread;
-
- mtmsr(td->td_md.md_savecrit);
-}
-
-
-#else /* !__GNUC__ */
-
-void cpu_critical_enter(void)
-void cpu_critical_exit(void)
-
-#endif /* __GNUC__ */
+#define cpu_critical_exit() (void)mtmsr(curthread->td_md.md_savecrit)
__END_DECLS
Index: sparc64/include/critical.h
===================================================================
RCS file: /home/ncvs/src/sys/sparc64/include/critical.h,v
retrieving revision 1.1
diff -u -r1.1 critical.h
--- sparc64/include/critical.h 1 Apr 2002 23:51:23 -0000 1.1
+++ sparc64/include/critical.h 10 Feb 2003 16:26:10 -0000
@@ -26,25 +26,18 @@
void cpu_critical_fork_exit(void);
void cpu_thread_link(struct thread *td);
-#ifdef __GNUC__
-
/*
* cpu_critical_enter:
*
* This routine is called from critical_enter() on the 0->1 transition
* of td_critnest, prior to it being incremented to 1.
*/
-static __inline void
-cpu_critical_enter(void)
-{
- struct thread *td;
- critical_t pil;
-
- td = curthread;
- pil = rdpr(pil);
- wrpr(pil, 0, 14);
- td->td_md.md_savecrit = pil;
-}
+#define cpu_critical_enter() do { \
+ struct thread *_td = curthread; \
+ critical_t _pil = rdpr(pil); \
+ wrpr(pil, 0, 14); \
+ _td->td_md.md_savecrit = _pil; \
+} while (0)
/*
@@ -54,21 +47,7 @@
* of td_critnest, after it has been decremented to 0. We are
* exiting the last critical section.
*/
-static __inline void
-cpu_critical_exit(void)
-{
- struct thread *td;
-
- td = curthread;
- wrpr(pil, td->td_md.md_savecrit, 0);
-}
-
-#else /* !__GNUC__ */
-
-void cpu_critical_enter(void)
-void cpu_critical_exit(void)
-
-#endif /* __GNUC__ */
+#define cpu_critical_exit() (void)wrpr(pil, curthread->td_md.md_savecrit, 0)
__END_DECLS
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200302121125.h1CBPHZ7007869>
