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

p5pRT opened this issue Jul 8, 2007 · 5 comments

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

p5pRT opened this issue Jul 8, 2007 · 5 comments


Copy link

p5pRT commented Jul 8, 2007

Migrated from (status was 'resolved')

Searchable as RT43633$

Copy link

p5pRT commented Jul 8, 2007


This is a bug report for perl from steve@​,
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;

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/	2005-08-27 12:14:38.000000000 -0500
+++ perl-5.8.8/lib/File/Spec/	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.


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​:
  osname=linux, osvers=2.6.20-1.2933.fc6xen, archname=x86_64-linux-thread-multi
  uname='linux 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
  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,
  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​:

Environment for perl v5.8.8​:
  LANGUAGE (unset)
  LOGDIR (unset)
  PERL_BADLANG (unset)

Copy link

p5pRT commented Aug 31, 2007

From @rgs

Thanks, applied as #31686 to bleadperl.

Copy link

p5pRT commented Aug 31, 2007

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

Copy link

p5pRT commented Aug 31, 2007

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

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

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().


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

No branches or pull requests

1 participant