summaryrefslogtreecommitdiff
path: root/bgpd/bgp_fsm.h
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_fsm.h')
-rw-r--r--bgpd/bgp_fsm.h72
1 files changed, 62 insertions, 10 deletions
diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h
index db4a915a..e90f3b43 100644
--- a/bgpd/bgp_fsm.h
+++ b/bgpd/bgp_fsm.h
@@ -23,20 +23,72 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
#define _QUAGGA_BGP_FSM_H
/* Macro for BGP read, write and timer thread. */
-#define BGP_READ_ON(T,F,V) THREAD_READ_ON(master,T,F,peer,V)
-#define BGP_READ_OFF(X) THREAD_READ_OFF(X)
+#define BGP_READ_ON(T,F,V) \
+ do { \
+ if (!T) \
+ { \
+ peer_lock (peer); \
+ THREAD_READ_ON(master,T,F,peer,V); \
+ } \
+ } while (0)
-#define BGP_WRITE_ON(T,F,V) THREAD_WRITE_ON(master,T,F,peer,V)
-#define BGP_WRITE_OFF(X) THREAD_WRITE_OFF(X)
+#define BGP_READ_OFF(T) \
+ do { \
+ if (T) \
+ { \
+ peer_unlock (peer); \
+ THREAD_READ_OFF(T); \
+ } \
+ } while (0)
-#define BGP_TIMER_ON(T,F,V) THREAD_TIMER_ON(master,T,F,peer,V)
-#define BGP_TIMER_OFF(X) THREAD_TIMER_OFF(X)
+#define BGP_WRITE_ON(T,F,V) \
+ do { \
+ if (!T) \
+ { \
+ peer_lock (peer); \
+ THREAD_WRITE_ON(master,(T),(F),peer,(V)); \
+ } \
+ } while (0)
+
+#define BGP_WRITE_OFF(T) \
+ do { \
+ if (T) \
+ { \
+ peer_unlock (peer); \
+ THREAD_WRITE_OFF(T); \
+ } \
+ } while (0)
-#define BGP_EVENT_ADD(P,E) \
- thread_add_event (master, bgp_event, (P), (E))
+#define BGP_TIMER_ON(T,F,V) \
+ do { \
+ if (!T) \
+ { \
+ peer_lock (peer); \
+ THREAD_TIMER_ON(master,(T),(F),peer,(V)); \
+ } \
+ } while (0)
-#define BGP_EVENT_DELETE(P) \
- thread_cancel_event (master, (P))
+#define BGP_TIMER_OFF(T) \
+ do { \
+ if (T) \
+ { \
+ peer_unlock (peer); \
+ THREAD_TIMER_OFF(T); \
+ } \
+ } while (0)
+
+#define BGP_EVENT_ADD(P,E) \
+ do { \
+ peer_lock (peer); /* bgp event reference */ \
+ thread_add_event (master, bgp_event, (P), (E)); \
+ } while (0)
+
+#define BGP_EVENT_DELETE(P) \
+ do { \
+ peer_unlock (peer); /* bgp event peer reference */ \
+ assert (peer); \
+ thread_cancel_event (master, (P)); \
+ } while (0)
/* Prototypes. */
extern int bgp_event (struct thread *);