Addition of code to prevent multiple hangup's beign processed on the same

DCB
This commit is contained in:
Mark Riddoch
2014-09-19 11:40:16 +01:00
parent 2402d55de6
commit 2d2fc28b07
2 changed files with 23 additions and 4 deletions

View File

@ -620,8 +620,16 @@ DCB *zombies = NULL;
eno, eno,
strerror(eno)))); strerror(eno))));
atomic_add(&pollStats.n_hup, 1); atomic_add(&pollStats.n_hup, 1);
spinlock_acquire(&dcb->dcb_initlock);
if ((dcb->flags & DCBF_HUNG) == 0)
{
dcb->flags |= DCBF_HUNG;
spinlock_release(&dcb->dcb_initlock);
dcb->func.hangup(dcb); dcb->func.hangup(dcb);
} }
else
spinlock_release(&dcb->dcb_initlock);
}
if (ev & EPOLLRDHUP) if (ev & EPOLLRDHUP)
{ {
@ -639,8 +647,16 @@ DCB *zombies = NULL;
eno, eno,
strerror(eno)))); strerror(eno))));
atomic_add(&pollStats.n_hup, 1); atomic_add(&pollStats.n_hup, 1);
spinlock_acquire(&dcb->dcb_initlock);
if ((dcb->flags & DCBF_HUNG) == 0)
{
dcb->flags |= DCBF_HUNG;
spinlock_release(&dcb->dcb_initlock);
dcb->func.hangup(dcb); dcb->func.hangup(dcb);
} }
else
spinlock_release(&dcb->dcb_initlock);
}
} /*< for */ } /*< for */
no_op = FALSE; no_op = FALSE;
} }

View File

@ -317,6 +317,9 @@ void dcb_call_foreach (DCB_REASON reason);
void dcb_call_foreach ( void dcb_call_foreach (
DCB_REASON reason); DCB_REASON reason);
/* DCB flags values */ /**
#define DCBF_CLONE 0x0001 /* DCB is a clone */ * DCB flags values
*/
#define DCBF_CLONE 0x0001 /*< DCB is a clone */
#define DCBF_HUNG 0x0002 /*< Hangup has been dispatched */
#endif /* _DCB_H */ #endif /* _DCB_H */