OpenSS7 SS7 for the Common Man |
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
||||||||||||||||||||||||||
Home | Overview | Status | News | Documentation | Resources | About | |||||||||||||||||||||
File /code/strss7/drivers/allocb.h#ifndef __ALLOCB_H__ #define __ALLOCB_H__ /* * ========================================================================= * * BUFFER Allocation * * ========================================================================= */ typedef void (*bufcall_fnc_t) (long); /* * BUFSRV call service routine * ------------------------------------------------------------------------- */ STATIC void ss7_bufsrv(long data) { queue_t *q = (queue_t *) data; if (q) { str_t *s = STR_PRIV(q); if (q == s->iq) { if (s->ibid) { s->ibid = 0; atomic_dec(&s->refcnt); } if (q->q_qinfo && q->q_qinfo->qi_srvp) qenable(q); else ss7_isrv(q); } if (q == s->oq) { if (s->obid) { s->obid = 0; atomic_dec(&s->refcnt); } if (q->q_qinfo && q->q_qinfo->qi_srvp) qenable(q); else ss7_osrv(q); } } } /* * UNBUFCALL * ------------------------------------------------------------------------- */ STATIC void ss7_unbufcall(str_t * s) { if (s->ibid) { unbufcall(xchg(&s->ibid, 0)); atomic_dec(&s->refcnt); } if (s->obid) { unbufcall(xchg(&s->obid, 0)); atomic_dec(&s->refcnt); } } /* * BUFCALL * ------------------------------------------------------------------------- */ STATIC void ss7_bufcall(queue_t *q, size_t size, int prior) { if (q) { str_t *s = STR_PRIV(q); if (q == s->iq) { if (!s->ibid) { s->ibid = bufcall(size, prior, &ss7_bufsrv, (long) q); atomic_inc(&s->refcnt); } return; } if (q == s->oq) { if (!s->obid) { s->obid = bufcall(size, prior, &ss7_bufsrv, (long) q); atomic_inc(&s->refcnt); } return; } swerr(); return; } } /* * ESBBCALL * ------------------------------------------------------------------------- */ STATIC void ss7_esbbcall(queue_t *q, int prior) { if (q) { str_t *s = STR_PRIV(q); if (q == s->iq) { if (!s->ibid) { s->ibid = esbbcall(prior, &ss7_bufsrv, (long) q); atomic_inc(&s->refcnt); } return; } if (q == s->oq) { if (!s->obid) { s->obid = esbbcall(prior, &ss7_bufsrv, (long) q); atomic_inc(&s->refcnt); } return; } swerr(); return; } } /* * ALLOCB * ------------------------------------------------------------------------- */ STATIC INLINE mblk_t *ss7_allocb(queue_t *q, size_t size, int prior) { mblk_t *mp; if ((mp = allocb(size, prior))) return (mp); rare(); ss7_bufcall(q, size, prior); return (mp); } /* * ESBALLOC * ------------------------------------------------------------------------- */ STATIC INLINE mblk_t *ss7_esballoc(queue_t *q, unsigned char *base, size_t size, int prior, frtn_t * frtn) { mblk_t *mp; if ((mp = esballoc(base, size, prior, frtn))) return (mp); rare(); ss7_esbbcall(q, prior); return (mp); } /* * PULLUPMSG * ------------------------------------------------------------------------- */ STATIC INLINE int ss7_pullupmsg(queue_t *q, mblk_t *mp, int size) { if (pullupmsg(mp, size) != 0) return (QR_DONE); ss7_bufcall(q, size, BPRI_MED); return (-ENOBUFS); } /* * DUPB * ------------------------------------------------------------------------- */ STATIC INLINE mblk_t *ss7_dupb(queue_t *q, mblk_t *bp) { mblk_t *mp; if (!(mp = dupb(bp))) ss7_bufcall(q, bp->b_wptr - bp->b_rptr, BPRI_MED); return (mp); } /* * DUPMSG * ------------------------------------------------------------------------- */ STATIC INLINE mblk_t *ss7_dupmsg(queue_t *q, mblk_t *bp) { mblk_t *mp; if (!(mp = dupmsg(bp))) ss7_bufcall(q, msgsize(bp), BPRI_MED); return (mp); } /* * COPYB * ------------------------------------------------------------------------- */ STATIC INLINE mblk_t *ss7_copyb(queue_t *q, mblk_t *bp) { mblk_t *mp; if (!(mp = copyb(bp))) ss7_bufcall(q, bp->b_wptr - bp->b_rptr, BPRI_MED); return (mp); } /* * COPYMSG * ------------------------------------------------------------------------- */ STATIC INLINE mblk_t *ss7_copymsg(queue_t *q, mblk_t *bp) { mblk_t *mp; if (!(mp = copymsg(bp))) ss7_bufcall(q, msgsize(bp), BPRI_MED); return (mp); } #endif /* __ALLOCB_H__ */
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |