#define DBG_FNC_SBDROP NETDBG_CODE(DBG_NETSOCK, 4)
#define DBG_FNC_SBAPPEND NETDBG_CODE(DBG_NETSOCK, 5)
+static int sbcompress(struct sockbuf *, struct mbuf *, struct mbuf *);
/*
* Primitive routines for operating on sockets and socket buffers
so->so_pgid = head->so_pgid;
so->so_uid = head->so_uid;
so->so_usecount = 1;
+ so->next_lock_lr = 0;
+ so->next_unlock_lr = 0;
#ifdef __APPLE__
so->so_rcv.sb_flags |= SB_RECV; /* XXX */
head->so_qlen++;
#ifdef __APPLE__
- /* Attach socket filters for this protocol */
- sflt_initsock(so);
+ /* Attach socket filters for this protocol */
+ sflt_initsock(so);
#endif
if (connstatus) {
so->so_state |= connstatus;
sbwait(sb)
struct sockbuf *sb;
{
- int error = 0, lr, lr_saved;
+ int error = 0, lr_saved;
struct socket *so = sb->sb_so;
lck_mtx_t *mutex_held;
struct timespec ts;
-#ifdef __ppc__
- __asm__ volatile("mflr %0" : "=r" (lr));
- lr_saved = lr;
-#endif
+ lr_saved = (unsigned int) __builtin_return_address(0);
-
if (so->so_proto->pr_getlock != NULL)
mutex_held = (*so->so_proto->pr_getlock)(so, 0);
else
{
struct socket *so = sb->sb_so;
lck_mtx_t * mutex_held;
- int error = 0, lr, lr_saved;
-
-#ifdef __ppc__
- __asm__ volatile("mflr %0" : "=r" (lr));
- lr_saved = lr;
-#endif
+ int error = 0;
if (so == NULL)
panic("sb_lock: null so back pointer sb=%x\n", sb);
mutex_held = so->so_proto->pr_domain->dom_mtx;
if (so->so_usecount < 1)
panic("sb_lock: so=%x refcount=%d\n", so, so->so_usecount);
+
error = msleep((caddr_t)&sb->sb_flags, mutex_held,
(sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, "sblock", 0);
if (so->so_usecount < 1)
int
sbappendrecord(sb, m0)
register struct sockbuf *sb;
- register struct mbuf *m0;
+ struct mbuf *m0;
{
register struct mbuf *m;
int result = 0;
sbunlock(struct sockbuf *sb, int keeplocked)
{
struct socket *so = sb->sb_so;
- int lr, lr_saved;
+ int lr_saved;
lck_mtx_t *mutex_held;
-#ifdef __ppc__
- __asm__ volatile("mflr %0" : "=r" (lr));
- lr_saved = lr;
-#endif
+
+ lr_saved = (unsigned int) __builtin_return_address(0);
+
sb->sb_flags &= ~SB_LOCK;
if (so->so_proto->pr_getlock != NULL)
so->so_usecount--;
if (so->so_usecount < 0)
panic("sbunlock: unlock on exit so=%x lr=%x sb_flags=%x\n", so, so->so_usecount,lr_saved, sb->sb_flags);
- so->reserved4= lr_saved;
+ so->unlock_lr[so->next_unlock_lr] = (void *)lr_saved;
+ so->next_unlock_lr = (so->next_unlock_lr+1) % SO_LCKDBG_MAX;
lck_mtx_unlock(mutex_held);
}
}