summaryrefslogtreecommitdiff
path: root/bgpd/rfapi/rfapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/rfapi/rfapi.c')
-rw-r--r--bgpd/rfapi/rfapi.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/bgpd/rfapi/rfapi.c b/bgpd/rfapi/rfapi.c
index 15a29442f4..fa3da9c283 100644
--- a/bgpd/rfapi/rfapi.c
+++ b/bgpd/rfapi/rfapi.c
@@ -1304,18 +1304,31 @@ static int rfapi_open_inner(struct rfapi_descriptor *rfd, struct bgp *bgp,
rfd->peer = peer_new(bgp);
rfd->peer->status = Established; /* keep bgp core happy */
bgp_sync_delete(rfd->peer); /* don't need these */
- if (rfd->peer->ibuf) {
- stream_free(rfd->peer->ibuf); /* don't need it */
+
+ /*
+ * since this peer is not on the I/O thread, this lock is not strictly
+ * necessary, but serves as a reminder to those who may meddle...
+ */
+ pthread_mutex_lock(&rfd->peer->io_mtx);
+ {
+ // we don't need any I/O related facilities
+ if (rfd->peer->ibuf)
+ stream_fifo_free(rfd->peer->ibuf);
+ if (rfd->peer->obuf)
+ stream_fifo_free(rfd->peer->obuf);
+
+ if (rfd->peer->ibuf_work)
+ stream_free(rfd->peer->ibuf_work);
+ if (rfd->peer->obuf_work)
+ stream_free(rfd->peer->obuf_work);
+
rfd->peer->ibuf = NULL;
- }
- if (rfd->peer->obuf) {
- stream_fifo_free(rfd->peer->obuf); /* don't need it */
rfd->peer->obuf = NULL;
+ rfd->peer->obuf_work = NULL;
+ rfd->peer->ibuf_work = NULL;
}
- if (rfd->peer->work) {
- stream_free(rfd->peer->work); /* don't need it */
- rfd->peer->work = NULL;
- }
+ pthread_mutex_unlock(&rfd->peer->io_mtx);
+
{ /* base code assumes have valid host pointer */
char buf[BUFSIZ];
buf[0] = 0;