Change 19042 by [EMAIL PROTECTED] on 2003/03/21 07:45:54

        Subject: [PATCH] readdir_r for VMS (was Re: [PATCH] configure.com: sig_num, 
etc.)
        From: "Craig A. Berry" <[EMAIL PROTECTED]>
        Date: Thu, 20 Mar 2003 23:03:36 -0600
        Message-ID: <[EMAIL PROTECTED]>

Affected files ...

... //depot/perl/configure.com#174 edit
... //depot/perl/vms/vms.c#121 edit
... //depot/perl/vms/vmsish.h#56 edit

Differences ...

==== //depot/perl/configure.com#174 (text) ====
Index: perl/configure.com
--- perl/configure.com#173~19023~       Tue Mar 18 13:22:03 2003
+++ perl/configure.com  Thu Mar 20 23:45:54 2003
@@ -5919,7 +5919,7 @@
 $ WC "d_gmtime_r='undef'"      ! leave undef'd; we use my_gmtime
 $ WC "d_localtime_r='undef'"   ! leave undef'd; we use my_localtime
 $ WC "d_random_r='undef'"
-$ WC "d_readdir_r='undef'"     ! leave undef'd; we use Perl_readdir
+$ WC "d_readdir_r='define'"    ! always defined; we roll our own
 $ WC "d_readdir64_r='undef'"
 $ WC "d_setgrent_r='undef'"
 $ WC "d_sethostent_r='undef'"
@@ -5965,7 +5965,7 @@
 $ WC "gmtime_r_proto='0'"
 $ WC "localtime_r_proto='0'"
 $ WC "random_r_proto='0'"
-$ WC "readdir_r_proto='0'"     ! leave undef'd; we use Perl_readdir
+$ WC "readdir_r_proto='REENTRANT_PROTO_I_TSR'"  ! always defined; we roll our own
 $ WC "readdir64_r_proto='0'"
 $ WC "setgrent_r_proto='0'"
 $ WC "sethostent_r_proto='0'"

==== //depot/perl/vms/vms.c#121 (text) ====
Index: perl/vms/vms.c
--- perl/vms/vms.c#120~18927~   Tue Mar 11 12:04:33 2003
+++ perl/vms/vms.c      Thu Mar 20 23:45:54 2003
@@ -4791,6 +4791,18 @@
  *  Minor modifications to original routines.
  */
 
+/* readdir may have been redefined by reentr.h, so make sure we get
+ * the local version for what we do here.
+ */
+#ifdef readdir
+# undef readdir
+#endif
+#if !defined(PERL_IMPLICIT_CONTEXT)
+# define readdir Perl_readdir
+#else
+# define readdir(a) Perl_readdir(aTHX_ a)
+#endif
+
     /* Number of elements in vms_versions array */
 #define VERSIZE(e)     (sizeof e->vms_versions / sizeof e->vms_versions[0])
 
@@ -4833,6 +4845,12 @@
     dd->pat.dsc$w_length = strlen(dd->pattern);
     dd->pat.dsc$b_dtype = DSC$K_DTYPE_T;
     dd->pat.dsc$b_class = DSC$K_CLASS_S;
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+    New(1308,dd->mutex,1,perl_mutex);
+    MUTEX_INIT( (perl_mutex *) dd->mutex );
+#else
+    dd->mutex = NULL;
+#endif
 
     return dd;
 }  /* end of opendir() */
@@ -4858,6 +4876,10 @@
 {
     (void)lib$find_file_end(&dd->context);
     Safefree(dd->pattern);
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+    MUTEX_DESTROY( (perl_mutex *) dd->mutex );
+    Safefree(dd->mutex);
+#endif
     Safefree((char *)dd);
 }
 /*}}}*/
@@ -4969,6 +4991,28 @@
     return &dd->entry;
 
 }  /* end of readdir() */
+/*}}}*/
+
+/*
+ *  Read the next entry from the directory -- thread-safe version.
+ */
+/*{{{ int readdir_r(DIR *dd, struct dirent *entry, struct dirent **result)*/
+int
+Perl_readdir_r(pTHX_ DIR *dd, struct dirent *entry, struct dirent **result)
+{
+    int retval;
+
+    MUTEX_LOCK( (perl_mutex *) dd->mutex );
+
+    entry = readdir(dd);
+    *result = entry;
+    retval = ( *result == NULL ? errno : 0 );
+
+    MUTEX_UNLOCK( (perl_mutex *) dd->mutex );
+
+    return retval;
+
+}  /* end of readdir_r() */
 /*}}}*/
 
 /*

==== //depot/perl/vms/vmsish.h#56 (text) ====
Index: perl/vms/vmsish.h
--- perl/vms/vmsish.h#55~16701~ Sun May 19 19:23:03 2002
+++ perl/vms/vmsish.h   Thu Mar 20 23:45:54 2003
@@ -146,6 +146,7 @@
 #define my_getpwuid            Perl_my_getpwuid
 #define my_flush               Perl_my_flush
 #define readdir                        Perl_readdir
+#define readdir_r              Perl_readdir_r
 #else
 #define my_getenv_len(a,b,c)   Perl_my_getenv_len(aTHX_ a,b,c)
 #define vmssetenv(a,b,c)       Perl_vmssetenv(aTHX_ a,b,c)
@@ -191,6 +192,7 @@
 #define my_getpwuid(a)         Perl_my_getpwuid(aTHX_ a)
 #define my_flush(a)            Perl_my_flush(aTHX_ a)
 #define readdir(a)             Perl_readdir(aTHX_ a)
+#define readdir_r(a,b,c)       Perl_readdir_r(aTHX_ a,b,c)
 #endif
 #define my_gconvert            Perl_my_gconvert
 #define telldir                Perl_telldir
@@ -563,6 +565,7 @@
     char                       *pattern;
     struct dirent              entry;
     struct dsc$descriptor_s    pat;
+    void                       *mutex;
 } DIR;
 
 #define rewinddir(dirp)                seekdir((dirp), 0)
@@ -778,6 +781,7 @@
 int    Perl_my_utime (pTHX_ char *, struct utimbuf *);
 void   Perl_vms_image_init (int *, char ***);
 struct dirent *        Perl_readdir (pTHX_ DIR *);
+int    Perl_readdir_r(pTHX_ DIR *, struct dirent *, struct dirent **);
 long   telldir (DIR *);
 void   Perl_seekdir (pTHX_ DIR *, long);
 void   closedir (DIR *);
End of Patch.

Reply via email to