dougm 01/12/17 19:40:02
Modified: xs/Apache/SubProcess Apache__SubProcess.h
Log:
avoid calling av_len() more than once.
switch from using av_len() to AvFILLp
add av_items variable to avoid (-1 + 2) when there is no av_argv
Revision Changes Path
1.4 +9 -6 modperl-2.0/xs/Apache/SubProcess/Apache__SubProcess.h
Index: Apache__SubProcess.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/Apache/SubProcess/Apache__SubProcess.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Apache__SubProcess.h 2001/12/18 03:24:49 1.3
+++ Apache__SubProcess.h 2001/12/18 03:40:02 1.4
@@ -115,12 +115,15 @@
const char **argv;
int i;
AV *av_argv;
+ I32 len=-1, av_items=0;
request_rec *r = modperl_xs_sv2request_rec(aTHX_ ST(0), NULL, cv);
const char *command = (const char *)SvPV_nolen(ST(1));
if (items == 3) {
if (SvROK(ST(2)) && SvTYPE(SvRV(ST(2))) == SVt_PVAV) {
av_argv = (AV*)SvREFCNT_inc(SvRV(ST(2)));
+ len = AvFILLp(av_argv);
+ av_items = len+1;
}
else {
Perl_croak(aTHX_ usage);
@@ -129,21 +132,21 @@
else {
av_argv = newAV();
}
-
+
/* ap_os_create_privileged_process expects ARGV as char
* **argv, with terminating NULL and the program itself as a
* first item.
*/
- argv = apr_palloc(r->pool,
- (3 + av_len(av_argv)) * sizeof(char *));
+ argv = apr_palloc(r->pool, (av_items + 2) * sizeof(char *));
argv[0] = command;
- for (i = 0; i <= av_len(av_argv); i++) {
+ for (i = 0; i <= len; i++) {
argv[i+1] = (const char *)SvPV_nolen(AvARRAY(av_argv)[i]);
}
argv[i+1] = NULL;
#if 0
- for (i=0; i<=av_len(av_argv)+2; i++) {
- Perl_warn(aTHX_ "arg: %d %s\n", i, argv[i]);
+ for (i=0; i<=len+2; i++) {
+ Perl_warn(aTHX_ "arg: %d %s\n",
+ i, argv[i] ? argv[i] : "NULL");
}
#endif
rc = modperl_spawn_proc_prog(r, command, &argv,