stas 2004/07/02 15:43:17
Modified: src/modules/perl modperl_io_apache.c
xs/Apache/RequestIO Apache__RequestIO.h
xs/maps modperl_functions.map
xs/tables/current/ModPerl FunctionTable.pm
. Changes
Log:
- polishing Apache::RequestIO API and implementation
- $r->read()/READ now throw exceptions
- $r->rflush now returns nothing (was always returning APR::SUCCESS
before)
Revision Changes Path
1.22 +15 -39 modperl-2.0/src/modules/perl/modperl_io_apache.c
Index: modperl_io_apache.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_io_apache.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -u -r1.21 -r1.22
--- modperl_io_apache.c 2 Jun 2004 21:35:58 -0000 1.21
+++ modperl_io_apache.c 2 Jul 2004 22:43:16 -0000 1.22
@@ -110,21 +110,13 @@
{
PerlIOApache *st = PerlIOSelf(f, PerlIOApache);
request_rec *r = st->r;
- long total = 0;
if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) ||
PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) {
return 0;
}
- total = modperl_request_read(aTHX_ r, (char*)vbuf, count);
-
- if (total < 0) {
- PerlIOBase(f)->flags |= PERLIO_F_ERROR;
- /* modperl_request_read takes care of setting ERRSV */
- }
-
- return total;
+ return modperl_request_read(aTHX_ r, (char*)vbuf, count);
}
static SSize_t
@@ -259,8 +251,8 @@
MP_INLINE SSize_t modperl_request_read(pTHX_ request_rec *r,
char *buffer, Size_t len)
{
- long total = 0;
- int wanted = len;
+ SSize_t total = 0;
+ Size_t wanted = len;
int seen_eos = 0;
char *tmp = buffer;
apr_bucket_brigade *bb;
@@ -272,35 +264,22 @@
bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
if (bb == NULL) {
r->connection->keepalive = AP_CONN_CLOSE;
- return -1;
+ Perl_croak(aTHX_ "failed to create bucket brigade");
}
do {
apr_size_t read;
- int rc;
+ apr_status_t rc;
rc = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES,
APR_BLOCK_READ, len);
if (rc != APR_SUCCESS) {
- char *error;
- /* if we fail here, we want to just return and stop trying
- * to read data from the client.
+ /* if we fail here, we want to stop trying to read data
+ * from the client.
*/
r->connection->keepalive = AP_CONN_CLOSE;
apr_brigade_destroy(bb);
-
- if (SvTRUE(ERRSV)) {
- STRLEN n_a;
- error = SvPV(ERRSV, n_a);
- }
- else {
- error = modperl_error_strerror(aTHX_ rc);
- }
- sv_setpv(ERRSV,
- (char *)apr_psprintf(r->pool,
- "failed to get bucket brigade: %s",
- error));
- return -1;
+ modperl_croak(aTHX_ rc, "Apache::RequestIO::read");
}
/* If this fails, it means that a filter is written
@@ -312,11 +291,11 @@
apr_brigade_destroy(bb);
/* we can't tell which filter is broken, since others may
* just pass data through */
- sv_setpv(ERRSV, "Aborting read from client. "
- "One of the input filters is broken. "
- "It returned an empty bucket brigade for "
- "the APR_BLOCK_READ mode request");
- return -1;
+ Perl_croak(aTHX_ "Apache::RequestIO::read: "
+ "Aborting read from client. "
+ "One of the input filters is broken. "
+ "It returned an empty bucket brigade for "
+ "the APR_BLOCK_READ mode request");
}
if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) {
@@ -327,12 +306,9 @@
rc = apr_brigade_flatten(bb, tmp, &read);
if (rc != APR_SUCCESS) {
apr_brigade_destroy(bb);
- sv_setpv(ERRSV,
- (char *)apr_psprintf(r->pool,
- "failed to read: %s",
- modperl_error_strerror(aTHX_ rc)));
- return -1;
+ modperl_croak(aTHX_ rc, "Apache::RequestIO::read");
}
+
total += read;
tmp += read;
len -= read;
1.51 +15 -20 modperl-2.0/xs/Apache/RequestIO/Apache__RequestIO.h
Index: Apache__RequestIO.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/Apache/RequestIO/Apache__RequestIO.h,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -u -r1.50 -r1.51
--- Apache__RequestIO.h 1 Jul 2004 21:19:19 -0000 1.50
+++ Apache__RequestIO.h 2 Jul 2004 22:43:17 -0000 1.51
@@ -131,26 +131,26 @@
}
/* alias */
-#define mpxs_Apache__RequestRec_WRITE(r, buffer, bufsiz, offset) \
- mpxs_Apache__RequestRec_write(aTHX_ r, buffer, bufsiz, offset)
+#define mpxs_Apache__RequestRec_WRITE(r, buffer, len, offset) \
+ mpxs_Apache__RequestRec_write(aTHX_ r, buffer, len, offset)
static MP_INLINE
apr_size_t mpxs_Apache__RequestRec_write(pTHX_ request_rec *r,
- SV *buffer, apr_size_t bufsiz,
- int offset)
+ SV *buffer, apr_size_t len,
+ apr_off_t offset)
{
- apr_size_t wlen = bufsiz;
+ apr_size_t wlen;
const char *buf;
- STRLEN svlen;
+ STRLEN avail;
MP_dRCFG;
- buf = (const char *)SvPV(buffer, svlen);
+ buf = (const char *)SvPV(buffer, avail);
- if (bufsiz == -1) {
- wlen = offset ? svlen - offset : svlen;
+ if (len == -1) {
+ wlen = offset ? avail - offset : avail;
}
else {
- wlen = bufsiz;
+ wlen = len;
}
MP_CHECK_WBUCKET_INIT("$r->write");
@@ -162,7 +162,7 @@
}
static MP_INLINE
-int mpxs_Apache__RequestRec_rflush(pTHX_ I32 items,
+void mpxs_Apache__RequestRec_rflush(pTHX_ I32 items,
SV **MARK, SV **SP)
{
modperl_config_req_t *rcfg;
@@ -180,8 +180,6 @@
rcfg->wbucket->outcnt));
MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, TRUE),
"Apache::RequestIO::rflush");
-
- return APR_SUCCESS;
}
static MP_INLINE long mpxs_ap_get_client_block(pTHX_ request_rec *r,
@@ -229,10 +227,10 @@
mpxs_Apache__RequestRec_read(aTHX_ r, bufsv, len, offset)
static SV *mpxs_Apache__RequestRec_read(pTHX_ request_rec *r,
- SV *bufsv, int len,
- int offset)
+ SV *bufsv, apr_size_t len,
+ apr_off_t offset)
{
- long total;
+ SSize_t total;
if (!SvOK(bufsv)) {
sv_setpvn(bufsv, "", 0);
@@ -252,11 +250,8 @@
mpxs_sv_cur_set(bufsv, offset+total);
SvTAINTED_on(bufsv);
}
- else if (total == 0) {
- sv_setpvn(bufsv, "", 0);
- }
else {
- return &PL_sv_undef;
+ sv_setpvn(bufsv, "", 0);
}
return newSViv(total);
1.75 +5 -5 modperl-2.0/xs/maps/modperl_functions.map
Index: modperl_functions.map
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/maps/modperl_functions.map,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -u -r1.74 -r1.75
--- modperl_functions.map 4 Jun 2004 03:20:46 -0000 1.74
+++ modperl_functions.map 2 Jul 2004 22:43:17 -0000 1.75
@@ -55,11 +55,11 @@
SV *:DEFINE_UNTIE | | request_rec *:r, int:refcnt
mpxs_Apache__RequestRec_sendfile | | r, filename=r->filename, offset=0, len=0
mpxs_Apache__RequestRec_read | | r, bufsv, len, offset=0
- SV *:DEFINE_READ | | request_rec *:r, SV *:bufsv, int:len, int:offset=0
- mpxs_Apache__RequestRec_write | | r, buffer, bufsiz=-1, offset=0
+ SV *:DEFINE_READ | | request_rec *:r, SV *:bufsv, apr_size_t:len,
apr_off_t:offset=0
+ mpxs_Apache__RequestRec_write | | r, buffer, len=-1, offset=0
mpxs_Apache__RequestRec_print | | ...
- apr_ssize_t:DEFINE_WRITE | | \
- request_rec *:r, SV *:buffer, apr_ssize_t:bufsiz=-1, int:offset=0
+ apr_size_t:DEFINE_WRITE | | \
+ request_rec *:r, SV *:buffer, apr_size_t:len=-1, apr_off_t:offset=0
mpxs_Apache__RequestRec_rflush | | ...
mpxs_Apache__RequestRec_GETC
mpxs_Apache__RequestRec_OPEN | | SV *:self, SV *:arg1, SV *:arg2=Nullsv
@@ -99,7 +99,7 @@
mpxs_Apache__Filter_remove | | ...
SV *:DEFINE_TIEHANDLE | | SV *:stashsv, SV *:sv=Nullsv
- int:DEFINE_PRINT | | ...
+ apr_size_t:DEFINE_PRINT | | ...
MODULE=Apache::Filter PACKAGE=Apache::RequestRec
mpxs_Apache__RequestRec_add_input_filter
1.167 +6 -6 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm
Index: FunctionTable.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.166
retrieving revision 1.167
diff -u -u -r1.166 -r1.167
--- FunctionTable.pm 29 Jun 2004 22:56:17 -0000 1.166
+++ FunctionTable.pm 2 Jul 2004 22:43:17 -0000 1.167
@@ -2,7 +2,7 @@
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# ! WARNING: generated by ModPerl::ParseSource/0.01
-# ! Sun Jun 13 07:53:14 2004
+# ! Fri Jul 2 15:05:46 2004
# ! do NOT edit, any changes will be lost !
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -6514,17 +6514,17 @@
'name' => 'bufsv'
},
{
- 'type' => 'int',
+ 'type' => 'apr_size_t',
'name' => 'len'
},
{
- 'type' => 'int',
+ 'type' => 'apr_off_t',
'name' => 'offset'
}
]
},
{
- 'return_type' => 'int',
+ 'return_type' => 'void',
'name' => 'mpxs_Apache__RequestRec_rflush',
'args' => [
{
@@ -6665,10 +6665,10 @@
},
{
'type' => 'apr_size_t',
- 'name' => 'bufsiz'
+ 'name' => 'len'
},
{
- 'type' => 'int',
+ 'type' => 'apr_off_t',
'name' => 'offset'
}
]
1.398 +5 -0 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.397
retrieving revision 1.398
diff -u -u -r1.397 -r1.398
--- Changes 2 Jul 2004 01:25:52 -0000 1.397
+++ Changes 2 Jul 2004 22:43:17 -0000 1.398
@@ -12,6 +12,11 @@
=item 1.99_15-dev
+$r->read()/READ now throw exceptions [Stas]
+
+$r->rflush now returns nothing (was always returning APR::SUCCESS
+before) [Stas]
+
bug reports generating code: [Stas]
- add (apr|apu)-config linking info
- show the full path to the config file used to get the data for the