various fixes for race conditions under threads: mutex locks based
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index 96ecd58..b3de2f8 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -1422,7 +1422,17 @@ PP(pp_sysread)
        Zero(buffer+bufsize, offset-bufsize, char);
     }
     if (PL_op->op_type == OP_SYSREAD) {
-       length = PerlLIO_read(PerlIO_fileno(IoIFP(io)), buffer+offset, length);
+#ifdef PERL_SOCK_SYSREAD_IS_RECV
+       if (IoTYPE(io) == 's') {
+           length = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
+                                  buffer+offset, length, 0);
+       }
+       else
+#endif
+       {
+           length = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
+                                 buffer+offset, length);
+       }
     }
     else
 #ifdef HAS_SOCKET__bad_code_maybe
@@ -1467,8 +1477,10 @@ PP(pp_syswrite)
     djSP;
     int items = (SP - PL_stack_base) - TOPMARK;
     if (items == 2) {
+       SV *sv;
         EXTEND(SP, 1);
-        PUSHs(sv_2mortal(newSViv(sv_len(*SP))));
+       sv = sv_2mortal(newSViv(sv_len(*SP)));
+       PUSHs(sv);
         PUTBACK;
     }
     return pp_send(ARGS);
@@ -1532,7 +1544,17 @@ PP(pp_send)
            offset = 0;
        if (length > blen - offset)
            length = blen - offset;
-       length = PerlLIO_write(PerlIO_fileno(IoIFP(io)), buffer+offset, length);
+#ifdef PERL_SOCK_SYSWRITE_IS_SEND
+       if (IoTYPE(io) == 's') {
+           length = PerlSock_send(PerlIO_fileno(IoIFP(io)),
+                                  buffer+offset, length, 0);
+       }
+       else
+#endif
+       {
+           length = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
+                                  buffer+offset, length);
+       }
     }
 #ifdef HAS_SOCKET
     else if (SP > MARK) {