Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cwd::cwd() use in File::Spec::Unix use causes unnecessary fork() #8962

Closed
p5pRT opened this issue Jul 8, 2007 · 5 comments
Closed

Cwd::cwd() use in File::Spec::Unix use causes unnecessary fork() #8962

p5pRT opened this issue Jul 8, 2007 · 5 comments

Comments

@p5pRT
Copy link

p5pRT commented Jul 8, 2007

Migrated from rt.perl.org#43633 (status was 'resolved')

Searchable as RT43633$

@p5pRT
Copy link
Author

p5pRT commented Jul 8, 2007

From steve@silug.org

This is a bug report for perl from steve@​silug.org,
generated with the help of perlbug 1.35 running under perl v5.8.8.


File​::Spec​::Unix contains the following code​:

sub _cwd {
  require Cwd;
  Cwd​::cwd();
}

I think we can safely say that getcwd() will exist on anything Unix-y
enough to run File​::Spec​::Unix, so changing the cwd() to getcwd()
would avoid a fork() to run /bin/pwd. This code can apparently end up
in a hot code path by using IO​::File, which uses File​::Spec.

In light testing, the following patch seems to work fine​:

Inline Patch
--- perl-5.8.8/lib/File/Spec/Unix.pm.orig	2005-08-27 12:14:38.000000000 -0500
+++ perl-5.8.8/lib/File/Spec/Unix.pm	2007-07-07 22:13:51.000000000 -0500
@@ -470,7 +470,7 @@
 # File::Spec subclasses use this.
 sub _cwd {
     require Cwd;
-    Cwd::cwd();
+    Cwd::getcwd();
 }
 
 

I've also verified that the above patch applies cleanly to 5.9.5.

Flags​:
  category=core
  severity=high


This perlbug was built using Perl v5.8.8 in the Red Hat build system.
It is being executed now by Perl v5.8.8 - Wed May 16 22​:56​:53 EDT 2007.

Site configuration information for perl v5.8.8​:

Configured by Red Hat, Inc. at Wed May 16 22​:56​:53 EDT 2007.

Summary of my perl5 (revision 5 version 8 subversion 8) configuration​:
  Platform​:
  osname=linux, osvers=2.6.20-1.2933.fc6xen, archname=x86_64-linux-thread-multi
  uname='linux xenbuilder3.fedora.phx.redhat.com 2.6.20-1.2933.fc6xen #1 smp mon mar 19 11​:17​:46 edt 2007 x86_64 x86_64 x86_64 gnulinux '
  config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Dversion=5.8.8 -Dmyhostname=localhost -Dperladmin=root@​localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dprivlib=/usr/lib/perl5/5.8.8 -Dsitelib=/usr/lib/perl5/site_perl/5.8.8 -Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.8 -Darchlib=/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi -Dsitearch=/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi -Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi -Darchname=x86_64-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_pro
to -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dinc_version_list=5.8.7 5.8.6 5.8.5 -Dscriptdir=/usr/bin'
  hint=recommended, useposix=true, d_sigaction=define
  usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
  useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
  use64bitint=define use64bitall=define uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
  optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic',
  cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -I/usr/include/gdbm'
  ccversion='', gccversion='4.1.2 20070502 (Red Hat 4.1.2-12)', gccosandvers=''
  intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
  d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
  ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
  alignbytes=8, prototype=define
  Linker and Libraries​:
  ld='gcc', ldflags =''
  libpth=/usr/local/lib64 /lib64 /usr/lib64
  libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
  perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
  libc=, so=so, useshrplib=true, libperl=libperl.so
  gnulibc_version='2.6'
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE'
  cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

Locally applied patches​:
 


@​INC for perl v5.8.8​:
  /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
  /usr/lib64/perl5/site_perl/5.8.7/x86_64-linux-thread-multi
  /usr/lib64/perl5/site_perl/5.8.6/x86_64-linux-thread-multi
  /usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi
  /usr/lib/perl5/site_perl/5.8.8
  /usr/lib/perl5/site_perl/5.8.7
  /usr/lib/perl5/site_perl/5.8.6
  /usr/lib/perl5/site_perl/5.8.5
  /usr/lib/perl5/site_perl
  /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
  /usr/lib64/perl5/vendor_perl/5.8.7/x86_64-linux-thread-multi
  /usr/lib64/perl5/vendor_perl/5.8.6/x86_64-linux-thread-multi
  /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi
  /usr/lib/perl5/vendor_perl/5.8.8
  /usr/lib/perl5/vendor_perl/5.8.7
  /usr/lib/perl5/vendor_perl/5.8.6
  /usr/lib/perl5/vendor_perl/5.8.5
  /usr/lib/perl5/vendor_perl
  /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
  /usr/lib/perl5/5.8.8
  .


Environment for perl v5.8.8​:
  HOME=/home/steve
  LANG=en_US.UTF-8
  LANGUAGE (unset)
  LC_COLLATE=C
  LD_LIBRARY_PATH (unset)
  LOGDIR (unset)
  PATH=/usr/lib64/ccache​:/usr/lib64/qt-3.3/bin​:/usr/bin​:/bin​:/usr/X11R6/bin​:/usr/local/bin​:/usr/games​:/home/steve/bin
  PERL_BADLANG (unset)
  SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Aug 31, 2007

From @rgs

Thanks, applied as #31686 to bleadperl.

@p5pRT
Copy link
Author

p5pRT commented Aug 31, 2007

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Aug 31, 2007

@rgs - Status changed from 'open' to 'resolved'

@p5pRT p5pRT closed this as completed Aug 31, 2007
@p5pRT
Copy link
Author

p5pRT commented Jul 7, 2009

From @schwern

Turns out this caused a bug on OS X and broke the documented interface
of File​::Spec->rel2abs() which is supposed to use cwd().

See https://rt.cpan.org/Ticket/Display.html?id=47637

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant