dougm 00/04/20 22:25:32
Modified: src/modules/perl mod_perl.c mod_perl.h modperl_callback.c
modperl_config.c modperl_config.h modperl_interp.c
modperl_interp.h modperl_types.h
Log:
integrate with generated register_hooks and command_rec entries
stash selected interpreter in r->per_request_config
Perl*Handlers are now hooked up and run!
some indenting fixups
Revision Changes Path
1.10 +4 -3 modperl-2.0/src/modules/perl/mod_perl.c
Index: mod_perl.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- mod_perl.c 2000/04/18 22:59:14 1.9
+++ mod_perl.c 2000/04/21 05:25:30 1.10
@@ -15,6 +15,8 @@
);
#endif
+ argv = modperl_srv_config_argv_init(scfg, &argc);
+
if (!(perl = perl_alloc())) {
perror("perl_alloc");
exit(1);
@@ -22,8 +24,6 @@
perl_construct(perl);
- argv = modperl_srv_config_argv_init(scfg, &argc);
-
status = perl_parse(perl, xs_init, argc, argv, NULL);
if (status) {
@@ -62,6 +62,7 @@
{
/* XXX: should be pre_config hook or 1.xx logic */
ap_hook_open_logs(modperl_hook_init, NULL, NULL, HOOK_MIDDLE);
+ modperl_register_handler_hooks();
}
static command_rec modperl_cmds[] = {
@@ -79,7 +80,7 @@
MP_SRV_CMD_TAKE1("PerlInterpMinSpare", interp_min_spare,
"Min number of spare Perl interpreters"),
#endif
- MP_CMD_POST_READ_REQUEST_ENTRY,
+ MP_CMD_ENTRIES,
{ NULL },
};
1.10 +1 -0 modperl-2.0/src/modules/perl/mod_perl.h
Index: mod_perl.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- mod_perl.h 2000/04/17 21:29:41 1.9
+++ mod_perl.h 2000/04/21 05:25:30 1.10
@@ -19,6 +19,7 @@
#include "http_log.h"
#include "http_protocol.h"
#include "http_main.h"
+#include "http_request.h"
#include "apr_lock.h"
1.2 +101 -16 modperl-2.0/src/modules/perl/modperl_callback.c
Index: modperl_callback.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- modperl_callback.c 2000/04/18 22:58:10 1.1
+++ modperl_callback.c 2000/04/21 05:25:31 1.2
@@ -59,8 +59,8 @@
GvNAME(CvGV(cv)));
}
MP_TRACE_h(MP_FUNC, "caching %s::%s\n",
- HvNAME(GvSTASH(CvGV(cv))),
- GvNAME(CvGV(cv)));
+ HvNAME(GvSTASH(CvGV(cv))),
+ GvNAME(CvGV(cv)));
}
int modperl_handler_lookup(pTHX_ modperl_handler_t *handler,
@@ -72,7 +72,7 @@
if (!stash) {
MP_TRACE_h(MP_FUNC, "class %s not defined, attempting to load\n",
- class);
+ class);
require_module(aTHX_ class);
if (SvTRUE(ERRSV)) {
MP_TRACE_h(MP_FUNC, "failed to load %s class\n", class);
@@ -82,7 +82,7 @@
MP_TRACE_h(MP_FUNC, "loaded %s class\n", class);
if (!(stash = gv_stashpv(class, FALSE))) {
MP_TRACE_h(MP_FUNC, "%s package still does not exist\n",
- class);
+ class);
return 0;
}
}
@@ -100,14 +100,14 @@
MpHandlerPARSED_On(handler);
MP_TRACE_h(MP_FUNC, "found `%s' in class `%s' as a %s\n",
- name, HvNAME(stash),
- MpHandlerMETHOD(handler) ? "method" : "function");
+ name, HvNAME(stash),
+ MpHandlerMETHOD(handler) ? "method" : "function");
return 1;
}
MP_TRACE_h(MP_FUNC, "`%s' not found in class `%s'\n",
- name, HvNAME(stash));
+ name, HvNAME(stash));
return 0;
}
@@ -119,7 +119,7 @@
if (!MpHandlerPARSED(handler)) {
if (was_parsed) {
MP_TRACE_h(MP_FUNC, "handler %s was parsed, but not flagged\n",
- handler->name);
+ handler->name);
}
else {
MP_TRACE_h(MP_FUNC, "handler %s was never parsed\n", handler->name);
@@ -170,8 +170,7 @@
if ((tmp = strstr(name, "->"))) {
char class[256]; /*XXX*/
int class_len = strlen(name) - strlen(tmp);
- strncpy(class, name, class_len+1);
- class[class_len] = '\0';
+ ap_cpystrn(class, name, class_len+1);
MpHandlerMETHOD_On(handler);
handler->cv = newSVpv(&tmp[2], 0);
@@ -184,11 +183,11 @@
if (SvROK(obj) && sv_isobject(obj)) {
MpHandlerOBJECT_On(handler);
MP_TRACE_h(MP_FUNC, "handler object %s isa %s\n",
- class, HvNAME(SvSTASH((SV*)SvRV(obj))));
+ class, HvNAME(SvSTASH((SV*)SvRV(obj))));
}
else {
MP_TRACE_h(MP_FUNC, "%s is not an object, pv=%s\n",
- class, SvPV_nolen(obj));
+ class, SvPV_nolen(obj));
}
}
else {
@@ -200,7 +199,7 @@
if (!handler->obj) {
handler->obj = newSVpv(class, class_len);
MP_TRACE_h(MP_FUNC, "handler method %s isa %s\n",
- SvPVX(handler->cv), class);
+ SvPVX(handler->cv), class);
}
MpHandlerPARSED_On(handler);
@@ -228,13 +227,13 @@
if (!MpHandlerPARSED(handler)) {
if (!modperl_handler_parse(aTHX_ handler)) {
MP_TRACE_h(MP_FUNC, "failed to parse handler `%s'\n",
- handler->name);
+ handler->name);
return HTTP_INTERNAL_SERVER_ERROR;
}
}
ENTER;SAVETMPS;
- PUSHMARK(sp);
+ PUSHMARK(SP);
if (MpHandlerMETHOD(handler)) {
XPUSHs(handler->obj);
@@ -242,7 +241,8 @@
if (handler->args) {
I32 i, len = AvFILL(handler->args);
- EXTEND(sp, len);
+
+ EXTEND(SP, len);
for (i=0; i<=len; i++) {
PUSHs(sv_2mortal(*av_fetch(handler->args, i, FALSE)));
}
@@ -275,4 +275,89 @@
}
return status;
+}
+
+#define MP_HANDLER_TYPE_DIR 1
+#define MP_HANDLER_TYPE_SRV 2
+
+int modperl_run_handlers(int idx, request_rec *r, server_rec *s, int type)
+{
+ pTHX;
+ MP_dSCFG(s);
+ modperl_handler_t **handlers;
+ MpAV *av;
+ int i, status;
+#ifdef MP_TRACE
+ const char *desc;
+#endif
+
+ if (type == MP_HANDLER_TYPE_DIR) {
+ MP_dDCFG;
+ av = dcfg->handlers[idx];
+ MP_TRACE_a_do(desc = modperl_per_dir_handler_desc(idx));
+ }
+ else {
+ av = scfg->handlers[idx];
+ MP_TRACE_a_do(desc = modperl_per_srv_handler_desc(idx));
+ }
+
+ if (!av) {
+ MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)\n",
+ desc, r ? r->uri : "");
+ return DECLINED;
+ }
+
+ if (r) {
+ MP_dRCFG;
+ if (!rcfg) {
+ rcfg = modperl_request_config_new(r);
+ ap_set_module_config(r->request_config, &perl_module, rcfg);
+ }
+#ifdef USE_ITHREADS
+ aTHX = rcfg->interp->perl;
+#endif
+ }
+#ifdef USE_ITHREADS
+ else if (s) {
+ /* Child{Init,Exit} */
+ aTHX = scfg->mip->parent->perl;
+ }
+#endif
+
+ MP_TRACE_h(MP_FUNC, "running %d %s handlers\n",
+ av->nelts, desc);
+ handlers = (modperl_handler_t **)av->elts;
+
+ for (i=0; i<av->nelts; i++) {
+ status = modperl_callback(aTHX_ handlers[i]);
+ MP_TRACE_h(MP_FUNC, "%s returned %d\n",
+ handlers[i]->name, status);
+ }
+
+ return status;
+}
+
+int modperl_per_dir_callback(int idx, request_rec *r)
+{
+ return modperl_run_handlers(idx, r, r->server, MP_HANDLER_TYPE_DIR);
+}
+
+int modperl_per_srv_callback(int idx, request_rec *r)
+{
+ return modperl_run_handlers(idx, r, r->server, MP_HANDLER_TYPE_SRV);
+}
+
+int modperl_connection_callback(int idx, conn_rec *c)
+{
+ return DECLINED;
+}
+
+void modperl_process_callback(int idx, ap_pool_t *p, server_rec *s)
+{
+}
+
+void modperl_files_callback(int idx,
+ ap_pool_t *pconf, ap_pool_t *plog,
+ ap_pool_t *ptemp, server_rec *s)
+{
}
1.8 +46 -7 modperl-2.0/src/modules/perl/modperl_config.c
Index: modperl_config.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- modperl_config.c 2000/04/18 22:59:15 1.7
+++ modperl_config.c 2000/04/21 05:25:31 1.8
@@ -19,14 +19,40 @@
void *modperl_create_dir_config(ap_pool_t *p, char *dir)
{
- return NULL;
+ modperl_dir_config_t *dcfg = modperl_dir_config_new(p);
+ return dcfg;
}
-void *modperl_merge_dir_config(ap_pool_t *p, void *base, void *add)
+void *modperl_merge_dir_config(ap_pool_t *p, void *basev, void *addv)
{
- return NULL;
+#if 0
+ modperl_dir_config_t
+ *base = (modperl_dir_config_t *)basev,
+ *add = (modperl_dir_config_t *)addv,
+ *mrg = modperl_dir_config_new(p);
+#endif
+
+ MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n",
+ (unsigned long)basev, (unsigned long)addv);
+
+ return addv;
}
+modperl_request_config_t *modperl_request_config_new(request_rec *r)
+{
+ modperl_request_config_t *rcfg =
+ (modperl_request_config_t *)ap_pcalloc(r->pool, sizeof(*rcfg));
+
+#ifdef USE_ITHREADS
+ rcfg->interp = modperl_interp_select(r);
+ PERL_SET_INTERP(rcfg->interp->perl);
+#endif
+
+ MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)rcfg);
+
+ return rcfg;
+}
+
#define scfg_push_argv(arg) \
*(char **)ap_push_array(scfg->argv) = arg
@@ -39,9 +65,21 @@
scfg_push_argv((char *)ap_server_argv0);
+ MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)scfg);
+
return scfg;
}
+modperl_dir_config_t *modperl_dir_config_new(ap_pool_t *p)
+{
+ modperl_dir_config_t *dcfg = (modperl_dir_config_t *)
+ ap_pcalloc(p, sizeof(modperl_dir_config_t));
+
+ MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)dcfg);
+
+ return dcfg;
+}
+
#ifdef MP_TRACE
static void dump_argv(modperl_srv_config_t *scfg)
{
@@ -95,11 +133,12 @@
*base = (modperl_srv_config_t *)basev,
*add = (modperl_srv_config_t *)addv,
*mrg = modperl_srv_config_new(p);
-
- return mrg;
-#else
- return basev;
#endif
+
+ MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n",
+ (unsigned long)basev, (unsigned long)addv);
+
+ return addv;
}
#define MP_CONFIG_BOOTSTRAP(parms) \
1.8 +5 -1 modperl-2.0/src/modules/perl/modperl_config.h
Index: modperl_config.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- modperl_config.h 2000/04/18 22:59:15 1.7
+++ modperl_config.h 2000/04/21 05:25:31 1.8
@@ -3,9 +3,13 @@
void *modperl_create_dir_config(ap_pool_t *p, char *dir);
-void *modperl_merge_dir_config(ap_pool_t *p, void *base, void *add);
+void *modperl_merge_dir_config(ap_pool_t *p, void *basev, void *addv);
modperl_srv_config_t *modperl_srv_config_new(ap_pool_t *p);
+
+modperl_dir_config_t *modperl_dir_config_new(ap_pool_t *p);
+
+modperl_request_config_t *modperl_request_config_new(request_rec *r);
void *modperl_create_srv_config(ap_pool_t *p, server_rec *s);
1.8 +7 -24 modperl-2.0/src/modules/perl/modperl_interp.c
Index: modperl_interp.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- modperl_interp.c 2000/04/17 07:10:55 1.7
+++ modperl_interp.c 2000/04/21 05:25:31 1.8
@@ -102,8 +102,9 @@
while (head) {
if (!MpInterpIN_USE(head)) {
interp = head;
- MP_TRACE_i(MP_FUNC, "selected 0x%lx\n",
- (unsigned long)interp);
+ MP_TRACE_i(MP_FUNC, "selected 0x%lx (perl==0x%lx)\n",
+ (unsigned long)interp,
+ (unsigned long)interp->perl);
#ifdef _PTHREAD_H
MP_TRACE_i(MP_FUNC, "pthread_self == 0x%lx\n",
(unsigned long)pthread_self());
@@ -247,12 +248,6 @@
ap_register_cleanup(p, (void*)mip,
modperl_interp_pool_destroy, ap_null_cleanup);
-
- /* XXX: should only bother selecting an interpreter
- * if one is needed for the request
- */
- ap_hook_post_read_request(modperl_interp_select, NULL, NULL, HOOK_FIRST);
-
scfg->mip = mip;
}
@@ -288,26 +283,14 @@
return APR_SUCCESS;
}
-int modperl_interp_select(request_rec *r)
+modperl_interp_t *modperl_interp_select(request_rec *r)
{
modperl_interp_t *interp = modperl_interp_get(r->server);
-
- /* XXX: stash interp pointer in r->per_request */
- if (MpInterpPUTBACK(interp)) {
- ap_register_cleanup(r->pool, (void*)interp,
- modperl_interp_unselect, ap_null_cleanup);
- }
-
- if (1) { /* testing concurrent callbacks into the Perl runtime(s) */
- dTHXa(interp->perl);
- SV *sv = get_sv("Apache::Server::Perl", TRUE);
- sv_setref_pv(sv, Nullch, (void*)interp->perl);
- eval_pv("printf STDERR qq(Perl == 0x%lx\n), "
- "$$Apache::Server::Perl", TRUE);
- }
+ ap_register_cleanup(r->pool, (void*)interp,
+ modperl_interp_unselect, ap_null_cleanup);
- return OK;
+ return interp;
}
#else
1.5 +1 -1 modperl-2.0/src/modules/perl/modperl_interp.h
Index: modperl_interp.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- modperl_interp.h 2000/04/16 01:33:56 1.4
+++ modperl_interp.h 2000/04/21 05:25:31 1.5
@@ -18,7 +18,7 @@
ap_status_t modperl_interp_unselect(void *data);
-int modperl_interp_select(request_rec *r);
+modperl_interp_t *modperl_interp_select(request_rec *r);
ap_status_t modperl_interp_pool_destroy(void *data);
1.9 +4 -1 modperl-2.0/src/modules/perl/modperl_types.h
Index: modperl_types.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_types.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- modperl_types.h 2000/04/18 22:59:15 1.8
+++ modperl_types.h 2000/04/21 05:25:31 1.9
@@ -98,8 +98,11 @@
} modperl_dir_config_t;
typedef struct {
+#ifdef USE_ITHREADS
+ modperl_interp_t *interp;
+#endif
HV *pnotes;
-} modperl_per_request_config_t;
+} modperl_request_config_t;
typedef struct {
SV *obj; /* object or classname if cv is a method */