OpenSS7
SS7 for the
Common Man

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified:

Home Overview Status News Documentation Resources About
   
 Overview
 Status
 News
 Documentation
 Resources
 About

   
Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/allocb.h


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__ */


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/allocb.h

OpenSS7
SS7 for the
Common Man
Home Overview Status News Documentation Resources About

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified: