Fix circular issues with event headers (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 17 May 2016 14:59:49 +0000 (10:59 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 17 May 2016 14:59:49 +0000 (10:59 -0400)
The mailbox headers (e.g. ucq.h) needed parts of event.h, but later parts
of event.h needed the mailbox headers.  Previously we dealt with this by
being careful with where we #included.  Commit df786ca456cb ("Replace
 #include guards with #pragma once.") broke that for evbitmap.h.

The right fix is to split out the parts of the header that the mailboxes
need into it's own header.  This should help avoid future issues with other
mailboxes.  FWIW, I don't know if we could keep the old style (even if I
wanted to) with the #pragma once, which is probably why that one was left
as an ifndef.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ros/ceq.h
kern/include/ros/evbitmap.h
kern/include/ros/event.h
kern/include/ros/event_bits.h [new file with mode: 0644]
kern/include/ros/ucq.h

index d7e3f27..52ace6d 100644 (file)
@@ -34,6 +34,7 @@
 
 #pragma once
 
+#include <ros/event_bits.h>
 #include <ros/atomic.h>
 #include <ros/ring_buffer.h>
 
index 4451653..3b0220f 100644 (file)
@@ -7,8 +7,7 @@
 
 #pragma once
 
-/* Include this outside the ifndef, due to circular include concerns. */
-#include <ros/event.h>
+#include <ros/event_bits.h>
 
 struct evbitmap {
        bool                                            check_bits;
index 8719916..0afb63a 100644 (file)
@@ -6,57 +6,10 @@
 
 #pragma once
 
-#include <ros/common.h>
+#include <ros/event_bits.h>
 #include <ros/atomic.h>
 #include <ros/trapframe.h>
-/* #include <ros/ucq.h> included below */
-/* #include <ros/evbitmap.h> included below */
 
-/* Event Delivery Flags from the process to the kernel */
-#define EVENT_IPI                              0x00001 /* IPI the vcore (usually with INDIR) */
-#define EVENT_SPAM_PUBLIC              0x00002 /* spam the msg to public vcpd mboxes */
-#define EVENT_INDIR                            0x00004 /* send an indirection event to vcore */
-#define EVENT_VCORE_PRIVATE            0x00008 /* Will go to the private VCPD mbox */
-#define EVENT_SPAM_INDIR               0x00010 /* spam INDIRs if the vcore's offline */
-#define EVENT_VCORE_MUST_RUN   0x00020 /* spams go to a vcore that will run */
-#define EVENT_NOTHROTTLE               0x00040 /* send all INDIRs (no throttling) */
-#define EVENT_ROUNDROBIN               0x00080 /* pick a vcore, RR style */
-#define EVENT_VCORE_APPRO              0x00100 /* send to where the kernel wants */
-#define EVENT_WAKEUP                   0x00200 /* wake up the process after sending */
-
-/* Event Message Types */
-#define EV_NONE                                         0
-#define EV_PREEMPT_PENDING              1
-#define EV_GANG_PREMPT_PENDING  2
-#define EV_VCORE_PREEMPT                3
-#define EV_GANG_RETURN                  4
-#define EV_USER_IPI                             5
-#define EV_PAGE_FAULT                   6
-#define EV_ALARM                                7
-#define EV_EVENT                                8
-#define EV_FREE_APPLE_PIE               9
-#define EV_SYSCALL                             10
-#define EV_CHECK_MSGS                  11
-#define EV_POSIX_SIGNAL                        12
-#define NR_EVENT_TYPES                 25 /* keep me last (and 1 > the last one) */
-
-/* Will probably have dynamic notifications later */
-#define MAX_NR_DYN_EVENT               25
-#define MAX_NR_EVENT                   (NR_EVENT_TYPES + MAX_NR_DYN_EVENT)
-
-/* Want to keep this small and generic, but add items as you need them.  One
- * item some will need is an expiration time, which ought to be put in the 64
- * bit arg.  Will need tweaking / thought as we come up with events.  These are
- * what get put on the per-core queue in procdata. */
-struct event_msg {
-       uint16_t                                        ev_type;
-       uint16_t                                        ev_arg1;
-       uint32_t                                        ev_arg2;
-       void                                            *ev_arg3;
-       uint64_t                                        ev_arg4;
-};
-
-/* Include here since the mboxes need to know event.h basics (e.g. event_msg) */
 #include <ros/ucq.h>
 #include <ros/evbitmap.h>
 #include <ros/ceq.h>
diff --git a/kern/include/ros/event_bits.h b/kern/include/ros/event_bits.h
new file mode 100644 (file)
index 0000000..5a67cee
--- /dev/null
@@ -0,0 +1,53 @@
+/* Copyright (c) 2010-2011 The Regents of the University of California
+ * Barret Rhoden <brho@cs.berkeley.edu>
+ * See LICENSE for details.
+ *
+ * Bits for the kernel interface for event. */
+
+#pragma once
+
+#include <ros/common.h>
+
+/* Event Delivery Flags from the process to the kernel */
+#define EVENT_IPI                              0x00001 /* IPI the vcore (usually with INDIR) */
+#define EVENT_SPAM_PUBLIC              0x00002 /* spam the msg to public vcpd mboxes */
+#define EVENT_INDIR                            0x00004 /* send an indirection event to vcore */
+#define EVENT_VCORE_PRIVATE            0x00008 /* Will go to the private VCPD mbox */
+#define EVENT_SPAM_INDIR               0x00010 /* spam INDIRs if the vcore's offline */
+#define EVENT_VCORE_MUST_RUN   0x00020 /* spams go to a vcore that will run */
+#define EVENT_NOTHROTTLE               0x00040 /* send all INDIRs (no throttling) */
+#define EVENT_ROUNDROBIN               0x00080 /* pick a vcore, RR style */
+#define EVENT_VCORE_APPRO              0x00100 /* send to where the kernel wants */
+#define EVENT_WAKEUP                   0x00200 /* wake up the process after sending */
+
+/* Event Message Types */
+#define EV_NONE                                         0
+#define EV_PREEMPT_PENDING              1
+#define EV_GANG_PREMPT_PENDING  2
+#define EV_VCORE_PREEMPT                3
+#define EV_GANG_RETURN                  4
+#define EV_USER_IPI                             5
+#define EV_PAGE_FAULT                   6
+#define EV_ALARM                                7
+#define EV_EVENT                                8
+#define EV_FREE_APPLE_PIE               9
+#define EV_SYSCALL                             10
+#define EV_CHECK_MSGS                  11
+#define EV_POSIX_SIGNAL                        12
+#define NR_EVENT_TYPES                 25 /* keep me last (and 1 > the last one) */
+
+/* Will probably have dynamic notifications later */
+#define MAX_NR_DYN_EVENT               25
+#define MAX_NR_EVENT                   (NR_EVENT_TYPES + MAX_NR_DYN_EVENT)
+
+/* Want to keep this small and generic, but add items as you need them.  One
+ * item some will need is an expiration time, which ought to be put in the 64
+ * bit arg.  Will need tweaking / thought as we come up with events.  These are
+ * what get put on the per-core queue in procdata. */
+struct event_msg {
+       uint16_t                                        ev_type;
+       uint16_t                                        ev_arg1;
+       uint32_t                                        ev_arg2;
+       void                                            *ev_arg3;
+       uint64_t                                        ev_arg4;
+};
index 199c139..3b76585 100644 (file)
@@ -17,7 +17,7 @@
 
 #pragma once
 
-#include <ros/common.h>
+#include <ros/event_bits.h>
 #include <ros/atomic.h>
 #include <ros/arch/mmu.h>
 
@@ -49,9 +49,6 @@ struct ucq_page_header {
        atomic_t                                        nr_cons;                /* like an inverted refcnt */
 };
 
-/* Including here since event.h needs to know about struct ucq */
-#include <ros/event.h>
-
 struct msg_container {
        struct event_msg                        ev_msg;
        bool                                            ready;                  /* kernel has written */