You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by yl...@apache.org on 2016/02/10 00:38:59 UTC
svn commit: r1729507 - in /httpd/httpd/trunk/modules:
http2/mod_proxy_http2.c proxy/mod_proxy.c proxy/mod_proxy.h
proxy/mod_proxy_ajp.c proxy/mod_proxy_http.c proxy/mod_proxy_wstunnel.c
Author: ylavic
Date: Tue Feb 9 23:38:59 2016
New Revision: 1729507
URL: http://svn.apache.org/viewvc?rev=1729507&view=rev
Log:
mod_proxy: axe negative "ping" parameter setting and handling.
This used to check for the backend connection readability only (instead of
the full ping/100-continue round-trip), but the case is already handled by
ap_proxy_connect_backend() which is always called.
Modified:
httpd/httpd/trunk/modules/http2/mod_proxy_http2.c
httpd/httpd/trunk/modules/proxy/mod_proxy.c
httpd/httpd/trunk/modules/proxy/mod_proxy.h
httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c
httpd/httpd/trunk/modules/proxy/mod_proxy_http.c
httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
Modified: httpd/httpd/trunk/modules/http2/mod_proxy_http2.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/mod_proxy_http2.c?rev=1729507&r1=1729506&r2=1729507&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_proxy_http2.c (original)
+++ httpd/httpd/trunk/modules/http2/mod_proxy_http2.c Tue Feb 9 23:38:59 2016
@@ -211,9 +211,9 @@ static int proxy_http2_handler(request_r
{
const char *proxy_function;
proxy_conn_rec *backend;
- char *locurl = url, *u, *firsturl;
+ char *locurl = url, *u;
apr_size_t slen;
- int is_ssl = 0, retry = 0;
+ int is_ssl = 0;
int flushall = 0;
int status;
char server_portstr[32];
@@ -268,7 +268,7 @@ static int proxy_http2_handler(request_r
ap_proxy_ssl_connection_cleanup(backend, r);
}
- while (retry < 2) {
+ do { /* while (0): break out */
conn_rec *backconn;
/* Step One: Determine the URL to connect to (might be a proxy),
@@ -288,18 +288,6 @@ static int proxy_http2_handler(request_r
ssl_hostname = apr_pstrdup(r->pool, backend->ssl_hostname);
}
- if (!retry) {
- firsturl = locurl;
- /* http does a prefetch here, so that it immediately can start sending
- * when the backend connection comes online. This minimizes the risk of
- * reusing a connection only to experience a keepalive close.
- */
- }
- else {
- /* On a retry, we'd expect to see the same url again */
- AP_DEBUG_ASSERT(strcmp(firsturl, locurl) == 0);
- }
-
/* Step Two: Make the Connection (or check that an already existing
* socket is still usable). On success, we have a socket connected to
* backend->hostname. */
@@ -339,21 +327,6 @@ static int proxy_http2_handler(request_r
apr_table_setn(backend->connection->notes,
"proxy-request-alpn-protos", "h2");
}
-
- /* Step Three-and-a-Half: See if the socket is still connected (if
- * desired). Note: Since ap_proxy_connect_backend just above does
- * the same check (unconditionally), this step is not required when
- * backend's socket/connection is reused (ie. no Step Three).
- */
- if (worker->s->ping_timeout_set && worker->s->ping_timeout < 0 &&
- !ap_proxy_is_socket_connected(backend->sock)) {
- backend->close = 1;
- ap_log_rerror(APLOG_MARK, APLOG_INFO, status, r, APLOGNO()
- "socket check failed to %pI (%s)",
- worker->cp->addr, worker->s->hostname);
- retry++;
- continue;
- }
}
/* Step Four: Send the Request in a new HTTP/2 stream and
@@ -370,8 +343,7 @@ static int proxy_http2_handler(request_r
proxy_run_detach_backend(r, backend);
}
}
- break;
- }
+ } while (0);
/* clean up before return */
cleanup:
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1729507&r1=1729506&r2=1729507&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Tue Feb 9 23:38:59 2016
@@ -280,7 +280,7 @@ static const char *set_worker_param(apr_
*/
if (ap_timeout_parameter_parse(val, &timeout, "s") != APR_SUCCESS)
return "Ping/Pong timeout has wrong format";
- if (timeout < 1000 && timeout >= 0)
+ if (timeout < 1000)
return "Ping/Pong timeout must be at least one millisecond";
worker->s->ping_timeout = timeout;
worker->s->ping_timeout_set = 1;
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1729507&r1=1729506&r2=1729507&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Tue Feb 9 23:38:59 2016
@@ -365,7 +365,6 @@ do { \
#define PROXY_DO_100_CONTINUE(w, r) \
((w)->s->ping_timeout_set \
- && ((w)->s->ping_timeout >= 0) \
&& (PROXYREQ_REVERSE == (r)->proxyreq) \
&& !(apr_table_get((r)->subprocess_env, "force-proxy-request-1.0")) \
&& ap_request_has_body((r)))
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c?rev=1729507&r1=1729506&r2=1729507&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c Tue Feb 9 23:38:59 2016
@@ -342,8 +342,7 @@ static int ap_proxy_ajp_request(apr_pool
* but doesn't affect the whole worker.
*/
if (APR_STATUS_IS_TIMEUP(status) &&
- conn->worker->s->ping_timeout_set &&
- conn->worker->s->ping_timeout >= 0) {
+ conn->worker->s->ping_timeout_set) {
return HTTP_GATEWAY_TIME_OUT;
}
@@ -680,8 +679,7 @@ static int ap_proxy_ajp_request(apr_pool
* but doesn't affect the whole worker.
*/
if (APR_STATUS_IS_TIMEUP(status) &&
- conn->worker->s->ping_timeout_set &&
- conn->worker->s->ping_timeout >= 0) {
+ conn->worker->s->ping_timeout_set) {
apr_table_setn(r->notes, "proxy_timedout", "1");
rv = HTTP_GATEWAY_TIME_OUT;
}
@@ -791,35 +789,22 @@ static int proxy_ajp_handler(request_rec
/* Handle CPING/CPONG */
if (worker->s->ping_timeout_set) {
- if (worker->s->ping_timeout < 0) {
- if (!ap_proxy_is_socket_connected(backend->sock)) {
- backend->close = 1;
- ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, APLOGNO(02534)
- "socket check failed to %pI (%s)",
- worker->cp->addr, worker->s->hostname);
- status = HTTP_SERVICE_UNAVAILABLE;
- retry++;
- continue;
- }
- }
- else {
- status = ajp_handle_cping_cpong(backend->sock, r,
- worker->s->ping_timeout);
- /*
- * In case the CPING / CPONG failed for the first time we might be
- * just out of luck and got a faulty backend connection, but the
- * backend might be healthy nevertheless. So ensure that the backend
- * TCP connection gets closed and try it once again.
- */
- if (status != APR_SUCCESS) {
- backend->close = 1;
- ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, APLOGNO(00897)
- "cping/cpong failed to %pI (%s)",
- worker->cp->addr, worker->s->hostname);
- status = HTTP_SERVICE_UNAVAILABLE;
- retry++;
- continue;
- }
+ status = ajp_handle_cping_cpong(backend->sock, r,
+ worker->s->ping_timeout);
+ /*
+ * In case the CPING / CPONG failed for the first time we might be
+ * just out of luck and got a faulty backend connection, but the
+ * backend might be healthy nevertheless. So ensure that the backend
+ * TCP connection gets closed and try it once again.
+ */
+ if (status != APR_SUCCESS) {
+ backend->close = 1;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, APLOGNO(00897)
+ "cping/cpong failed to %pI (%s)",
+ worker->cp->addr, worker->s->hostname);
+ status = HTTP_SERVICE_UNAVAILABLE;
+ retry++;
+ continue;
}
}
/* Step Three: Process the Request */
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_http.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_http.c?rev=1729507&r1=1729506&r2=1729507&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_http.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_http.c Tue Feb 9 23:38:59 2016
@@ -2097,21 +2097,6 @@ static int proxy_http_handler(request_re
"proxy-request-hostname",
backend->ssl_hostname);
}
-
- /* Step Three-and-a-Half: See if the socket is still connected (if
- * desired). Note: Since ap_proxy_connect_backend just above does
- * the same check (unconditionally), this step is not required when
- * backend's socket/connection is reused (ie. no Step Three).
- */
- if (worker->s->ping_timeout_set && worker->s->ping_timeout < 0 &&
- !ap_proxy_is_socket_connected(backend->sock)) {
- backend->close = 1;
- ap_log_rerror(APLOG_MARK, APLOG_INFO, status, r, APLOGNO(02535)
- "socket check failed to %pI (%s)",
- worker->cp->addr, worker->s->hostname);
- retry++;
- continue;
- }
}
/* Don't recycle the connection if prefetch (above) told not to do so */
@@ -2130,8 +2115,7 @@ static int proxy_http_handler(request_re
flushall)) != OK) {
proxy_run_detach_backend(r, backend);
if ((status == HTTP_SERVICE_UNAVAILABLE) &&
- worker->s->ping_timeout_set &&
- worker->s->ping_timeout >= 0) {
+ worker->s->ping_timeout_set) {
backend->close = 1;
ap_log_rerror(APLOG_MARK, APLOG_INFO, status, r, APLOGNO(01115)
"HTTP: 100-Continue failed to %pI (%s)",
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c?rev=1729507&r1=1729506&r2=1729507&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c Tue Feb 9 23:38:59 2016
@@ -421,7 +421,6 @@ static int proxy_wstunnel_handler(reques
proxy_conn_rec *backend = NULL;
const char *upgrade;
char *scheme;
- int retry;
conn_rec *c = r->connection;
apr_pool_t *p = r->pool;
apr_uri_t *uri;
@@ -463,15 +462,13 @@ static int proxy_wstunnel_handler(reques
backend->is_ssl = is_ssl;
backend->close = 0;
- retry = 0;
- while (retry < 2) {
+ do { /* while (0): break out */
char *locurl = url;
/* Step One: Determine Who To Connect To */
status = ap_proxy_determine_connection(p, r, conf, worker, backend,
uri, &locurl, proxyname, proxyport,
server_portstr,
sizeof(server_portstr));
-
if (status != OK)
break;
@@ -495,8 +492,7 @@ static int proxy_wstunnel_handler(reques
/* Step Three: Process the Request */
status = proxy_wstunnel_request(p, r, backend, worker, conf, uri, locurl,
server_portstr, scheme);
- break;
- }
+ } while (0);
/* Do not close the socket */
if (status != SUSPENDED) {
Re: svn commit: r1729507 - in /httpd/httpd/trunk/modules:
http2/mod_proxy_http2.c proxy/mod_proxy.c proxy/mod_proxy.h
proxy/mod_proxy_ajp.c proxy/mod_proxy_http.c proxy/mod_proxy_wstunnel.c
Posted by Ruediger Pluem <rp...@apache.org>.
On 02/10/2016 09:52 PM, Yann Ylavic wrote:
> On Wed, Feb 10, 2016 at 9:19 PM, Ruediger Pluem <rp...@apache.org> wrote:
>>
>> On 02/10/2016 09:15 PM, Jim Jagielski wrote:
>>> It looks like the whole retry was removed :(
>>
>> If you look at the old code before r1729507 there wasn't any retry in the mod_proxy_wstunnel case.
>> The loop had just one iteration. Hence my comment below.
>
> Indeed, this was a fake loop, and still is..
>
>> Why do we keep a loop at all?
>
> I wanted to avoid a goto construction or early returns for the failing cases.
Interesting approach to solve this issue with a do while loop :-).
I guess we could use a goto as we do in other parts of the code for similar situations.
Regards
Rüdiger
Re: svn commit: r1729507 - in /httpd/httpd/trunk/modules:
http2/mod_proxy_http2.c proxy/mod_proxy.c proxy/mod_proxy.h
proxy/mod_proxy_ajp.c proxy/mod_proxy_http.c proxy/mod_proxy_wstunnel.c
Posted by Yann Ylavic <yl...@gmail.com>.
On Wed, Feb 10, 2016 at 9:19 PM, Ruediger Pluem <rp...@apache.org> wrote:
>
> On 02/10/2016 09:15 PM, Jim Jagielski wrote:
>> It looks like the whole retry was removed :(
>
> If you look at the old code before r1729507 there wasn't any retry in the mod_proxy_wstunnel case.
> The loop had just one iteration. Hence my comment below.
Indeed, this was a fake loop, and still is..
> Why do we keep a loop at all?
I wanted to avoid a goto construction or early returns for the failing cases.
I could have used something like:
rv = ...;
if (rv == APR_SUCCESS) {
...;
rv = ...;
if (rv == APR_SUCCESS)...
}
or:
rv = ...;
if (rv == APR_SUCCESS) {
...;
rv = ...;
}
if (rv == APR_SUCCESS)...
but this was more change on the original code.
Maybe the comment:
> + do { /* while (0): break out */
...
> + } while (0);
isn't explicit enough?
Otherwise I can change the code to whatever you/dev@ prefer.
@Jim: this was yet another attempt for a do-while in httpd :)
(http://mail-archives.apache.org/mod_mbox/httpd-dev/201511.mbox/%3CCAKQ1sVOzutUqT3M1zy51W5C8B8AeVxtNBa=eEkrXOyK1OdEdRA@mail.gmail.com%3E)
Regards,
Yann.
Re: svn commit: r1729507 - in /httpd/httpd/trunk/modules:
http2/mod_proxy_http2.c proxy/mod_proxy.c proxy/mod_proxy.h
proxy/mod_proxy_ajp.c proxy/mod_proxy_http.c proxy/mod_proxy_wstunnel.c
Posted by Ruediger Pluem <rp...@apache.org>.
On 02/10/2016 09:15 PM, Jim Jagielski wrote:
> It looks like the whole retry was removed :(
If you look at the old code before r1729507 there wasn't any retry in the mod_proxy_wstunnel case.
The loop had just one iteration. Hence my comment below. Why do we keep a loop at all?
Regards
Rüdiger
>
>> On Feb 10, 2016, at 2:21 PM, Ruediger Pluem <rp...@apache.org> wrote:
>>
>>
>>
>> On 02/10/2016 12:38 AM, ylavic@apache.org wrote:
>>> Author: ylavic
>>> Date: Tue Feb 9 23:38:59 2016
>>> New Revision: 1729507
>>>
>>> URL: http://svn.apache.org/viewvc?rev=1729507&view=rev
>>> Log:
>>> mod_proxy: axe negative "ping" parameter setting and handling.
>>> This used to check for the backend connection readability only (instead of
>>> the full ping/100-continue round-trip), but the case is already handled by
>>> ap_proxy_connect_backend() which is always called.
>>>
>>> Modified:
>>> httpd/httpd/trunk/modules/http2/mod_proxy_http2.c
>>> httpd/httpd/trunk/modules/proxy/mod_proxy.c
>>> httpd/httpd/trunk/modules/proxy/mod_proxy.h
>>> httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c
>>> httpd/httpd/trunk/modules/proxy/mod_proxy_http.c
>>> httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
>>>
>>
>>> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
>>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c?rev=1729507&r1=1729506&r2=1729507&view=diff
>>> ==============================================================================
>>> --- httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c (original)
>>> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c Tue Feb 9 23:38:59 2016
>>
>>> @@ -463,15 +462,13 @@ static int proxy_wstunnel_handler(reques
>>> backend->is_ssl = is_ssl;
>>> backend->close = 0;
>>>
>>> - retry = 0;
>>> - while (retry < 2) {
>>> + do { /* while (0): break out */
>>> char *locurl = url;
>>> /* Step One: Determine Who To Connect To */
>>> status = ap_proxy_determine_connection(p, r, conf, worker, backend,
>>> uri, &locurl, proxyname, proxyport,
>>> server_portstr,
>>> sizeof(server_portstr));
>>> -
>>> if (status != OK)
>>> break;
>>>
>>> @@ -495,8 +492,7 @@ static int proxy_wstunnel_handler(reques
>>> /* Step Three: Process the Request */
>>> status = proxy_wstunnel_request(p, r, backend, worker, conf, uri, locurl,
>>> server_portstr, scheme);
>>> - break;
>>> - }
>>> + } while (0);
>>
>> Do you keep this loop just to keep the formating?
>>
>> Regards
>>
>> Rüdiger
>>
>
>
Re: svn commit: r1729507 - in /httpd/httpd/trunk/modules: http2/mod_proxy_http2.c proxy/mod_proxy.c proxy/mod_proxy.h proxy/mod_proxy_ajp.c proxy/mod_proxy_http.c proxy/mod_proxy_wstunnel.c
Posted by Jim Jagielski <ji...@jaguNET.com>.
It looks like the whole retry was removed :(
> On Feb 10, 2016, at 2:21 PM, Ruediger Pluem <rp...@apache.org> wrote:
>
>
>
> On 02/10/2016 12:38 AM, ylavic@apache.org wrote:
>> Author: ylavic
>> Date: Tue Feb 9 23:38:59 2016
>> New Revision: 1729507
>>
>> URL: http://svn.apache.org/viewvc?rev=1729507&view=rev
>> Log:
>> mod_proxy: axe negative "ping" parameter setting and handling.
>> This used to check for the backend connection readability only (instead of
>> the full ping/100-continue round-trip), but the case is already handled by
>> ap_proxy_connect_backend() which is always called.
>>
>> Modified:
>> httpd/httpd/trunk/modules/http2/mod_proxy_http2.c
>> httpd/httpd/trunk/modules/proxy/mod_proxy.c
>> httpd/httpd/trunk/modules/proxy/mod_proxy.h
>> httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c
>> httpd/httpd/trunk/modules/proxy/mod_proxy_http.c
>> httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
>>
>
>> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c?rev=1729507&r1=1729506&r2=1729507&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c (original)
>> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c Tue Feb 9 23:38:59 2016
>
>> @@ -463,15 +462,13 @@ static int proxy_wstunnel_handler(reques
>> backend->is_ssl = is_ssl;
>> backend->close = 0;
>>
>> - retry = 0;
>> - while (retry < 2) {
>> + do { /* while (0): break out */
>> char *locurl = url;
>> /* Step One: Determine Who To Connect To */
>> status = ap_proxy_determine_connection(p, r, conf, worker, backend,
>> uri, &locurl, proxyname, proxyport,
>> server_portstr,
>> sizeof(server_portstr));
>> -
>> if (status != OK)
>> break;
>>
>> @@ -495,8 +492,7 @@ static int proxy_wstunnel_handler(reques
>> /* Step Three: Process the Request */
>> status = proxy_wstunnel_request(p, r, backend, worker, conf, uri, locurl,
>> server_portstr, scheme);
>> - break;
>> - }
>> + } while (0);
>
> Do you keep this loop just to keep the formating?
>
> Regards
>
> Rüdiger
>
Re: svn commit: r1729507 - in /httpd/httpd/trunk/modules:
http2/mod_proxy_http2.c proxy/mod_proxy.c proxy/mod_proxy.h
proxy/mod_proxy_ajp.c proxy/mod_proxy_http.c proxy/mod_proxy_wstunnel.c
Posted by Ruediger Pluem <rp...@apache.org>.
On 02/10/2016 12:38 AM, ylavic@apache.org wrote:
> Author: ylavic
> Date: Tue Feb 9 23:38:59 2016
> New Revision: 1729507
>
> URL: http://svn.apache.org/viewvc?rev=1729507&view=rev
> Log:
> mod_proxy: axe negative "ping" parameter setting and handling.
> This used to check for the backend connection readability only (instead of
> the full ping/100-continue round-trip), but the case is already handled by
> ap_proxy_connect_backend() which is always called.
>
> Modified:
> httpd/httpd/trunk/modules/http2/mod_proxy_http2.c
> httpd/httpd/trunk/modules/proxy/mod_proxy.c
> httpd/httpd/trunk/modules/proxy/mod_proxy.h
> httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c
> httpd/httpd/trunk/modules/proxy/mod_proxy_http.c
> httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
>
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c?rev=1729507&r1=1729506&r2=1729507&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_wstunnel.c Tue Feb 9 23:38:59 2016
> @@ -463,15 +462,13 @@ static int proxy_wstunnel_handler(reques
> backend->is_ssl = is_ssl;
> backend->close = 0;
>
> - retry = 0;
> - while (retry < 2) {
> + do { /* while (0): break out */
> char *locurl = url;
> /* Step One: Determine Who To Connect To */
> status = ap_proxy_determine_connection(p, r, conf, worker, backend,
> uri, &locurl, proxyname, proxyport,
> server_portstr,
> sizeof(server_portstr));
> -
> if (status != OK)
> break;
>
> @@ -495,8 +492,7 @@ static int proxy_wstunnel_handler(reques
> /* Step Three: Process the Request */
> status = proxy_wstunnel_request(p, r, backend, worker, conf, uri, locurl,
> server_portstr, scheme);
> - break;
> - }
> + } while (0);
Do you keep this loop just to keep the formating?
Regards
Rüdiger