]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/uipc_socket2.c
xnu-792.22.5.tar.gz
[apple/xnu.git] / bsd / kern / uipc_socket2.c
index 1b2ced9a906e5f7eb3d54d47042bf6feb57356d9..591ee95de733b4e01bfa9a1404e6e70f13a99b8b 100644 (file)
@@ -87,6 +87,7 @@
 #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
@@ -293,6 +294,8 @@ sonewconn_internal(head, connstatus)
        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 */
@@ -335,8 +338,8 @@ sonewconn_internal(head, connstatus)
        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;
@@ -417,17 +420,13 @@ int
 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 
@@ -465,12 +464,7 @@ sb_lock(sb)
 {
        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);
@@ -483,6 +477,7 @@ sb_lock(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)
@@ -748,7 +743,7 @@ sbcheck(sb)
 int
 sbappendrecord(sb, m0)
        register struct sockbuf *sb;
-       register struct mbuf *m0;
+       struct mbuf *m0;
 {
        register struct mbuf *m;
        int result = 0;
@@ -1472,13 +1467,12 @@ void
 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) 
@@ -1500,7 +1494,8 @@ sbunlock(struct sockbuf *sb, int keeplocked)
                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);
        }
 }