Merge remote-tracking branch 'origin/stable-2.0'
[bpt/guile.git] / libguile / ioext.c
index b542664..94b0f4f 100644 (file)
@@ -1,18 +1,19 @@
-/*     Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2006 Free Software Foundation, Inc.
+/*     Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2006, 2011 Free Software Foundation, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * 
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
  *
  *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
  */
 
 
  */
 
 
@@ -48,7 +49,7 @@
 SCM_DEFINE (scm_ftell, "ftell", 1, 0, 0, 
             (SCM fd_port),
            "Return an integer representing the current position of\n"
 SCM_DEFINE (scm_ftell, "ftell", 1, 0, 0, 
             (SCM fd_port),
            "Return an integer representing the current position of\n"
-           "@var{fd/port}, measured from the beginning.  Equivalent to:\n"
+           "@var{fd_port}, measured from the beginning.  Equivalent to:\n"
            "\n"
            "@lisp\n"
            "(seek port 0 SEEK_CUR)\n"
            "\n"
            "@lisp\n"
            "(seek port 0 SEEK_CUR)\n"
@@ -62,8 +63,8 @@ SCM_DEFINE (scm_ftell, "ftell", 1, 0, 0,
 SCM_DEFINE (scm_redirect_port, "redirect-port", 2, 0, 0,
             (SCM old, SCM new),
            "This procedure takes two ports and duplicates the underlying file\n"
 SCM_DEFINE (scm_redirect_port, "redirect-port", 2, 0, 0,
             (SCM old, SCM new),
            "This procedure takes two ports and duplicates the underlying file\n"
-           "descriptor from @var{old-port} into @var{new-port}.  The\n"
-           "current file descriptor in @var{new-port} will be closed.\n"
+           "descriptor from @var{old} into @var{new}.  The\n"
+           "current file descriptor in @var{new} will be closed.\n"
            "After the redirection the two ports will share a file position\n"
            "and file status flags.\n\n"
            "The return value is unspecified.\n\n"
            "After the redirection the two ports will share a file position\n"
            "and file status flags.\n\n"
            "The return value is unspecified.\n\n"
@@ -88,13 +89,13 @@ SCM_DEFINE (scm_redirect_port, "redirect-port", 2, 0, 0,
     {
       scm_t_port *pt = SCM_PTAB_ENTRY (new);
       scm_t_port *old_pt = SCM_PTAB_ENTRY (old);
     {
       scm_t_port *pt = SCM_PTAB_ENTRY (new);
       scm_t_port *old_pt = SCM_PTAB_ENTRY (old);
-      scm_t_ptob_descriptor *ptob = &scm_ptobs[SCM_PTOBNUM (new)];
+      scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (new);
 
       /* must flush to old fdes.  */
       if (pt->rw_active == SCM_PORT_WRITE)
        ptob->flush (new);
       else if (pt->rw_active == SCM_PORT_READ)
 
       /* must flush to old fdes.  */
       if (pt->rw_active == SCM_PORT_WRITE)
        ptob->flush (new);
       else if (pt->rw_active == SCM_PORT_READ)
-       scm_end_input (new);
+       scm_end_input_unlocked (new);
       ans = dup2 (oldfd, newfd);
       if (ans == -1)
        SCM_SYSERROR;
       ans = dup2 (oldfd, newfd);
       if (ans == -1)
        SCM_SYSERROR;
@@ -235,7 +236,7 @@ SCM_DEFINE (scm_fdopen, "fdopen", 2, 0, 0,
 SCM_DEFINE (scm_primitive_move_to_fdes, "primitive-move->fdes", 2, 0, 0,
             (SCM port, SCM fd),
            "Moves the underlying file descriptor for @var{port} to the integer\n"
 SCM_DEFINE (scm_primitive_move_to_fdes, "primitive-move->fdes", 2, 0, 0,
             (SCM port, SCM fd),
            "Moves the underlying file descriptor for @var{port} to the integer\n"
-           "value @var{fdes} without changing the revealed count of @var{port}.\n"
+           "value @var{fd} without changing the revealed count of @var{port}.\n"
            "Any other ports already using this descriptor will be automatically\n"
            "shifted to new descriptors and their revealed counts reset to zero.\n"
            "The return value is @code{#f} if the file descriptor already had the\n"
            "Any other ports already using this descriptor will be automatically\n"
            "shifted to new descriptors and their revealed counts reset to zero.\n"
            "The return value is @code{#f} if the file descriptor already had the\n"
@@ -268,7 +269,7 @@ SCM_DEFINE (scm_primitive_move_to_fdes, "primitive-move->fdes", 2, 0, 0,
 #undef FUNC_NAME
 
 static SCM
 #undef FUNC_NAME
 
 static SCM
-get_matching_port (void *closure, SCM port, SCM val, SCM result)
+get_matching_port (void *closure, SCM port, SCM result)
 {
   int fd = * (int *) closure;
   scm_t_port *entry = SCM_PTAB_ENTRY (port);
 {
   int fd = * (int *) closure;
   scm_t_port *entry = SCM_PTAB_ENTRY (port);
@@ -283,7 +284,7 @@ get_matching_port (void *closure, SCM port, SCM val, SCM result)
 /* Return a list of ports using a given file descriptor.  */
 SCM_DEFINE (scm_fdes_to_ports, "fdes->ports", 1, 0, 0, 
            (SCM fd),
 /* Return a list of ports using a given file descriptor.  */
 SCM_DEFINE (scm_fdes_to_ports, "fdes->ports", 1, 0, 0, 
            (SCM fd),
-           "Return a list of existing ports which have @var{fdes} as an\n"
+           "Return a list of existing ports which have @var{fd} as an\n"
            "underlying file descriptor, without changing their revealed\n"
            "counts.")
 #define FUNC_NAME s_scm_fdes_to_ports
            "underlying file descriptor, without changing their revealed\n"
            "counts.")
 #define FUNC_NAME s_scm_fdes_to_ports
@@ -291,11 +292,9 @@ SCM_DEFINE (scm_fdes_to_ports, "fdes->ports", 1, 0, 0,
   SCM result = SCM_EOL;
   int int_fd = scm_to_int (fd);
 
   SCM result = SCM_EOL;
   int int_fd = scm_to_int (fd);
 
-  scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex);
-  result = scm_internal_hash_fold (get_matching_port,
-                                  (void*) &int_fd, result, 
-                                  scm_i_port_weak_hash);
-  scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex);
+  result = scm_c_weak_set_fold (get_matching_port,
+                                (void*) &int_fd, result, 
+                                scm_i_port_weak_set);
   return result;
 }
 #undef FUNC_NAME    
   return result;
 }
 #undef FUNC_NAME