mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-18 06:47:13 +00:00
[bgpd] simplify peer refcounts, squash slow peer leak
2006-09-14 Paul Jakma <paul.jakma@sun.com> * (general) fix the peer refcount issue exposed by previous, by just removing refcounting of peer threads, which is mostly senseless as they're references leading from struct peer, which peer_free cancels anyway. No need to muck around.. * bgp_fsm.h: Just remove the refcounting from the various TIMER/READ/WRITE/EVENT ON/OFF/ADD macros. * bgp_fsm.c: (bgp_stop) use BGP_EVENT_FLUSH, no refcounts attached to events anymore. (bgp_event) remove peer_unlock, events not refcounted. * bgpd.c: (peer_free) flush events before free.
This commit is contained in:
parent
ca058a30b1
commit
9fde6624fc
@ -1,3 +1,16 @@
|
|||||||
|
2006-09-14 Paul Jakma <paul.jakma@sun.com>
|
||||||
|
|
||||||
|
* (general) fix the peer refcount issue exposed by previous, by
|
||||||
|
just removing refcounting of peer threads, which is mostly
|
||||||
|
senseless as they're references leading from struct peer,
|
||||||
|
which peer_free cancels anyway. No need to muck around..
|
||||||
|
* bgp_fsm.h: Just remove the refcounting from the various
|
||||||
|
TIMER/READ/WRITE/EVENT ON/OFF/ADD macros.
|
||||||
|
* bgp_fsm.c: (bgp_stop) use BGP_EVENT_FLUSH, no refcounts attached
|
||||||
|
to events anymore.
|
||||||
|
(bgp_event) remove peer_unlock, events not refcounted.
|
||||||
|
* bgpd.c: (peer_free) flush events before free.
|
||||||
|
|
||||||
2006-09-14 Paul Jakma <paul.jakma@sun.com>
|
2006-09-14 Paul Jakma <paul.jakma@sun.com>
|
||||||
|
|
||||||
* (general) Fix some niggly issues around 'shutdown' and clearing
|
* (general) Fix some niggly issues around 'shutdown' and clearing
|
||||||
|
@ -426,7 +426,6 @@ bgp_stop (struct peer *peer)
|
|||||||
{
|
{
|
||||||
afi_t afi;
|
afi_t afi;
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
unsigned int i;
|
|
||||||
char orf_name[BUFSIZ];
|
char orf_name[BUFSIZ];
|
||||||
|
|
||||||
/* Increment Dropped count. */
|
/* Increment Dropped count. */
|
||||||
@ -500,10 +499,8 @@ bgp_stop (struct peer *peer)
|
|||||||
BGP_TIMER_OFF (peer->t_asorig);
|
BGP_TIMER_OFF (peer->t_asorig);
|
||||||
BGP_TIMER_OFF (peer->t_routeadv);
|
BGP_TIMER_OFF (peer->t_routeadv);
|
||||||
|
|
||||||
/* Delete all existing events of the peer,
|
/* Delete all existing events of the peer */
|
||||||
and corresponding peer ref-count */
|
BGP_EVENT_FLUSH (peer);
|
||||||
for (i = thread_cancel_event (master, peer); i > 0; i--)
|
|
||||||
peer_unlock (peer); /* thread event reference */
|
|
||||||
|
|
||||||
/* Stream reset. */
|
/* Stream reset. */
|
||||||
peer->packet_size = 0;
|
peer->packet_size = 0;
|
||||||
@ -1101,6 +1098,5 @@ bgp_event (struct thread *thread)
|
|||||||
bgp_timer_set (peer);
|
bgp_timer_set (peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
peer_unlock (peer); /* bgp-event peer reference */
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -25,77 +25,55 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|||||||
/* Macro for BGP read, write and timer thread. */
|
/* Macro for BGP read, write and timer thread. */
|
||||||
#define BGP_READ_ON(T,F,V) \
|
#define BGP_READ_ON(T,F,V) \
|
||||||
do { \
|
do { \
|
||||||
if (!T) \
|
if (!(T) && (peer->status != Deleted)) \
|
||||||
{ \
|
|
||||||
peer_lock (peer); \
|
|
||||||
THREAD_READ_ON(master,T,F,peer,V); \
|
THREAD_READ_ON(master,T,F,peer,V); \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_READ_OFF(T) \
|
#define BGP_READ_OFF(T) \
|
||||||
do { \
|
do { \
|
||||||
if (T) \
|
if (T) \
|
||||||
{ \
|
|
||||||
peer_unlock (peer); \
|
|
||||||
THREAD_READ_OFF(T); \
|
THREAD_READ_OFF(T); \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_WRITE_ON(T,F,V) \
|
#define BGP_WRITE_ON(T,F,V) \
|
||||||
do { \
|
do { \
|
||||||
if (!(T) && (peer->status != Deleted)) \
|
if (!(T) && (peer->status != Deleted)) \
|
||||||
{ \
|
|
||||||
peer_lock (peer); \
|
|
||||||
THREAD_WRITE_ON(master,(T),(F),peer,(V)); \
|
THREAD_WRITE_ON(master,(T),(F),peer,(V)); \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_WRITE_OFF(T) \
|
#define BGP_WRITE_OFF(T) \
|
||||||
do { \
|
do { \
|
||||||
if (T) \
|
if (T) \
|
||||||
{ \
|
|
||||||
peer_unlock (peer); \
|
|
||||||
THREAD_WRITE_OFF(T); \
|
THREAD_WRITE_OFF(T); \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_TIMER_ON(T,F,V) \
|
#define BGP_TIMER_ON(T,F,V) \
|
||||||
do { \
|
do { \
|
||||||
if (!(T) && (peer->status != Deleted)) \
|
if (!(T) && (peer->status != Deleted)) \
|
||||||
{ \
|
|
||||||
peer_lock (peer); \
|
|
||||||
THREAD_TIMER_ON(master,(T),(F),peer,(V)); \
|
THREAD_TIMER_ON(master,(T),(F),peer,(V)); \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_TIMER_OFF(T) \
|
#define BGP_TIMER_OFF(T) \
|
||||||
do { \
|
do { \
|
||||||
if (T) \
|
if (T) \
|
||||||
{ \
|
|
||||||
peer_unlock (peer); \
|
|
||||||
THREAD_TIMER_OFF(T); \
|
THREAD_TIMER_OFF(T); \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_EVENT_ADD(P,E) \
|
#define BGP_EVENT_ADD(P,E) \
|
||||||
do { \
|
do { \
|
||||||
if ((P)->status != Deleted) \
|
if ((P)->status != Deleted) \
|
||||||
{ \
|
|
||||||
peer_lock (peer); /* bgp event reference */ \
|
|
||||||
thread_add_event (master, bgp_event, (P), (E)); \
|
thread_add_event (master, bgp_event, (P), (E)); \
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_EVENT_DELETE(P) \
|
#define BGP_EVENT_FLUSH(P) \
|
||||||
do { \
|
do { \
|
||||||
peer_unlock (peer); /* bgp event peer reference */ \
|
|
||||||
assert (peer); \
|
assert (peer); \
|
||||||
thread_cancel_event (master, (P)); \
|
thread_cancel_event (master, (P)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BGP_EVENT_FLUSH_ADD(P,E) \
|
#define BGP_EVENT_FLUSH_ADD(P,E) \
|
||||||
do { \
|
do { \
|
||||||
BGP_EVENT_DELETE(P); \
|
BGP_EVENT_FLUSH(P); \
|
||||||
BGP_EVENT_ADD(P,E); \
|
BGP_EVENT_ADD(P,E); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -695,6 +695,7 @@ peer_free (struct peer *peer)
|
|||||||
bgp_timer_set (peer);
|
bgp_timer_set (peer);
|
||||||
BGP_READ_OFF (peer->t_read);
|
BGP_READ_OFF (peer->t_read);
|
||||||
BGP_WRITE_OFF (peer->t_write);
|
BGP_WRITE_OFF (peer->t_write);
|
||||||
|
BGP_EVENT_FLUSH (peer);
|
||||||
|
|
||||||
if (peer->desc)
|
if (peer->desc)
|
||||||
XFREE (MTYPE_PEER_DESC, peer->desc);
|
XFREE (MTYPE_PEER_DESC, peer->desc);
|
||||||
|
Loading…
Reference in New Issue
Block a user