@@ -37,6 +37,20 @@ char *modperl_error_strerror(pTHX_ apr_status_t rc);
37
37
38
38
void modperl_croak (pTHX_ apr_status_t rc , const char * func );
39
39
40
+ #define MP_PUTBACK_IF_USED () STMT_START \
41
+ { \
42
+ modperl_interp_t *interp = modperl_thx_interp_get(aTHX); \
43
+ if (interp && interp->refcnt > 1) { \
44
+ modperl_interp_unselect(interp); \
45
+ } \
46
+ } STMT_END
47
+
48
+ #define MP_CROAK_PUTBACK (rc , func ) STMT_START \
49
+ { \
50
+ MP_PUTBACK_IF_USED(); \
51
+ modperl_croak(aTHX_ rc, func); \
52
+ } STMT_END
53
+
40
54
#define MP_RUN_CROAK (rc_run , func ) STMT_START \
41
55
{ \
42
56
apr_status_t rc = rc_run; \
@@ -45,6 +59,15 @@ void modperl_croak(pTHX_ apr_status_t rc, const char* func);
45
59
} \
46
60
} STMT_END
47
61
62
+ #define MP_RUN_CROAK_PUTBACK (rc_run , func ) STMT_START \
63
+ { \
64
+ apr_status_t rc = rc_run; \
65
+ if (rc != APR_SUCCESS) { \
66
+ MP_PUTBACK_IF_USED(); \
67
+ modperl_croak(aTHX_ rc, func); \
68
+ } \
69
+ } STMT_END
70
+
48
71
#define MP_RUN_CROAK_RESET_OK (s , rc_run , func ) STMT_START \
49
72
{ \
50
73
apr_status_t rc = rc_run; \
@@ -61,6 +84,23 @@ void modperl_croak(pTHX_ apr_status_t rc, const char* func);
61
84
} \
62
85
} STMT_END
63
86
87
+ #define MP_RUN_CROAK_RESET_OK_PUTBACK (s , rc_run , func ) STMT_START \
88
+ { \
89
+ apr_status_t rc = rc_run; \
90
+ if (rc != APR_SUCCESS) { \
91
+ if (APR_STATUS_IS_ECONNRESET(rc) || \
92
+ APR_STATUS_IS_ECONNABORTED(rc)) { \
93
+ ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, \
94
+ "%s got: %s", func, \
95
+ modperl_error_strerror(aTHX_ rc)); \
96
+ } \
97
+ else { \
98
+ MP_PUTBACK_IF_USED(); \
99
+ modperl_croak(aTHX_ rc, func); \
100
+ } \
101
+ } \
102
+ } STMT_END
103
+
64
104
#endif /* MODPERL_ERROR_H */
65
105
66
106
/*
0 commit comments