Re: ssl_die() and pool cleanup

2013-11-22 Thread Jeff Trawick
On Wed, Nov 20, 2013 at 5:19 AM, Kaspar Brand httpd-dev.2...@velox.chwrote:

 On 18.11.2013 14:59, Jeff Trawick wrote:
  Has anyone looked at making ssl_die() clean up pools on the way out
  (presumably by calling some function besides exit())?  It is rather easy
 to
  end up with a bunch of stranded IPC objects while debugging your SSL
 config.

 Oh yes, a major annoyance I'm also occasionally running into.

   * XXX: The config hooks should return errors instead of calling
 exit().

 Gave it a try, see attachment. Not yet extensively tested (*), so
 perhaps incomplete. But httpd now properly cleans up for me, e.g. when a
 SIGHUPing fails, as shown in this log extract:

  [Wed Nov 20 11:02:14.304528 2013] [mpm_worker:notice] [pid 23918:tid
 3214934016] AH00298: SIGHUP received.  Attempting to restart
  [Wed Nov 20 11:02:14.544660 2013] [ssl:info] [pid 23918:tid 3214934016]
 AH02200: Loading certificate  private key of SSL-aware server 'server:443'
  [Wed Nov 20 11:02:14.545137 2013] [ssl:emerg] [pid 23918:tid 3214934016]
 AH02241: Init: Unable to read server certificate from file /tmp/snakeoil.pem
  [Wed Nov 20 11:02:14.545240 2013] [ssl:emerg] [pid 23918:tid 3214934016]
 SSL Library Error: error:0D06B08E:asn1 encoding
 routines:ASN1_D2I_READ_BIO:not enough data
  [Wed Nov 20 11:02:14.545278 2013] [ssl:emerg] [pid 23918:tid 3214934016]
 AH02312: Fatal error initialising mod_ssl, exiting.
  [Wed Nov 20 11:02:14.545310 2013] [:emerg] [pid 23918:tid 3214934016]
 AH00020: Configuration Failed, exiting

 (Configuration Failed, exiting is the key here - this comes from
 main.c and will call destroy_and_exit_process() to clean up.)

 Kaspar

 (*) The changes related to ssl_read_pkcs7 in particular are fairly
 superficial, but I think we should drop that PKCS#7 stuff from mod_ssl
 anyway.


This is what I found:

The two calls to ssl_init_ctx() (engine_init) need to be checked for rv !=
APR_SUCCESS.

The various calls to ssl_server_import_cert() in ssl_init_server_certs()
need different rc checking than before.  (Now ssl_server_import_cert() can
return a fatal error instead of just a boolean.)

(same for ssl_server_import_key())

The call to ssl_init_server_check() (engine_init) needs to be checked for
rv != APR_SUCCESS.

call to ssl_init_ctx_protocol() also needs a check
same for ssl_init_ticket_key()

It looks like some errors in the proxy config that previously were ignored
now cause startup failures...  (shrug)

Not bad for boiling the ocean :)

-- 
Born in Roswell... married an alien...
http://emptyhammock.com/


Re: UDS Patch

2013-11-22 Thread Jim Jagielski
Any luck with generating the diff yet?

On Nov 19, 2013, at 3:08 PM, Jim Jagielski j...@jagunet.com wrote:

 The main thing is that it would be interesting to see
 the diffs between '2.4.6 w the (several) originally proposed UDS patches 
 applied in order'
 and '2.4.6 w proposed backport'...
 
 Those diffs should show just the differences between the UDS 
 implementations...
 
 On Nov 19, 2013, at 2:51 PM, Daniel Ruggeri drugg...@primary.net wrote:
 
 Yes, agreed. Not sure if I made it clear, but I did apply r1511313 for
 the tests I did today (but not the one from yesterday).
 
 Of the several emails sent, the following have been tested:
 2.4.6 w the (several) originally proposed UDS patches applied in order
 2.4.6 w proposed backport (the 2 chunks around the DNS changes fail to
 apply since they do not exist in 2.4.6)
 2.4.6 w r1511313 + proposed backport + r1543174
 
 I DID double check that the machine wasn't requesting DNS lookups for
 the socket name or anything strange against the DNS server - but that
 was only for the test I ran today.
 
 --
 Daniel Ruggeri
 
 On 11/19/2013 1:43 PM, Jim Jagielski wrote:
 OK... the DNS lookup code seems to have changed between 2.4.6 and 2.4.7:
 
 https://svn.apache.org/viewvc?view=revisionrevision=1511313
 
 So I'm wondering if there's something there.
 
 



[RESULT] Re: [VOTE] Release Apache httpd 2.4.7 as GA

2013-11-22 Thread Jim Jagielski
With +1 votes from jim,covener,trawick,gsmith,breser,noel.butler,hiding,jblond 
and h.reindl
and NO -1 votes, I call the voting closed with the
result of Releasing 2.4.7 as GA.

Thx to all testers and voters!

Will push to mirrors for announcement and release next week.

On Nov 19, 2013, at 12:45 PM, Jim Jagielski j...@jagunet.com wrote:

 The pre-release test tarballs for Apache httpd 2.4.7 can be found
 at the usual place:
 
   http://httpd.apache.org/dev/dist/
 
 I'm calling a VOTE on releasing these as Apache httpd 2.4.7 GA.
 
 [ ] +1: Good to go
 [ ] +0: meh
 [ ] -1: Danger Will Robinson. And why.
 
 Vote will last the normal 72 hrs.
 
 NOTE: The *-deps are only there for convenience.
 



Re: ssl_die() and pool cleanup

2013-11-22 Thread Yann Ylavic
Maybe sk_X509_NAME_pop_free(ca_list, X509_NAME_free) should be called too
before returning NULL in ssl_init_FindCAList() (so to avoid a leak in case
of failure).

Regards;
Yann.


On Fri, Nov 22, 2013 at 4:20 PM, Jeff Trawick traw...@gmail.com wrote:

 On Wed, Nov 20, 2013 at 5:19 AM, Kaspar Brand httpd-dev.2...@velox.chwrote:

 On 18.11.2013 14:59, Jeff Trawick wrote:
  Has anyone looked at making ssl_die() clean up pools on the way out
  (presumably by calling some function besides exit())?  It is rather
 easy to
  end up with a bunch of stranded IPC objects while debugging your SSL
 config.

 Oh yes, a major annoyance I'm also occasionally running into.

   * XXX: The config hooks should return errors instead of calling
 exit().

 Gave it a try, see attachment. Not yet extensively tested (*), so
 perhaps incomplete. But httpd now properly cleans up for me, e.g. when a
 SIGHUPing fails, as shown in this log extract:

  [Wed Nov 20 11:02:14.304528 2013] [mpm_worker:notice] [pid 23918:tid
 3214934016] AH00298: SIGHUP received.  Attempting to restart
  [Wed Nov 20 11:02:14.544660 2013] [ssl:info] [pid 23918:tid 3214934016]
 AH02200: Loading certificate  private key of SSL-aware server 'server:443'
  [Wed Nov 20 11:02:14.545137 2013] [ssl:emerg] [pid 23918:tid
 3214934016] AH02241: Init: Unable to read server certificate from file
 /tmp/snakeoil.pem
  [Wed Nov 20 11:02:14.545240 2013] [ssl:emerg] [pid 23918:tid
 3214934016] SSL Library Error: error:0D06B08E:asn1 encoding
 routines:ASN1_D2I_READ_BIO:not enough data
  [Wed Nov 20 11:02:14.545278 2013] [ssl:emerg] [pid 23918:tid
 3214934016] AH02312: Fatal error initialising mod_ssl, exiting.
  [Wed Nov 20 11:02:14.545310 2013] [:emerg] [pid 23918:tid 3214934016]
 AH00020: Configuration Failed, exiting

 (Configuration Failed, exiting is the key here - this comes from
 main.c and will call destroy_and_exit_process() to clean up.)

 Kaspar

 (*) The changes related to ssl_read_pkcs7 in particular are fairly
 superficial, but I think we should drop that PKCS#7 stuff from mod_ssl
 anyway.


 This is what I found:

 The two calls to ssl_init_ctx() (engine_init) need to be checked for rv !=
 APR_SUCCESS.

 The various calls to ssl_server_import_cert() in ssl_init_server_certs()
 need different rc checking than before.  (Now ssl_server_import_cert() can
 return a fatal error instead of just a boolean.)

 (same for ssl_server_import_key())

 The call to ssl_init_server_check() (engine_init) needs to be checked for
 rv != APR_SUCCESS.

 call to ssl_init_ctx_protocol() also needs a check
 same for ssl_init_ticket_key()

 It looks like some errors in the proxy config that previously were ignored
 now cause startup failures...  (shrug)

 Not bad for boiling the ocean :)


 --
 Born in Roswell... married an alien...
 http://emptyhammock.com/



Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org wrote:



 j...@apache.org wrote:
  Author: jim
  Date: Fri Nov 16 16:49:31 2012
  New Revision: 1410459
 
  URL: http://svn.apache.org/viewvc?rev=1410459view=rev
  Log:
  fdq expects a certain behavior from atomics... ensure that
  the event mpms check this.
 
  Modified:
  httpd/httpd/trunk/docs/log-message-tags/next-number
  httpd/httpd/trunk/server/mpm/event/event.c
  httpd/httpd/trunk/server/mpm/eventopt/eventopt.c
 

  Modified: httpd/httpd/trunk/server/mpm/event/event.c
  URL:
 http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1410459r1=1410458r2=1410459view=diff
 
 ==
  --- httpd/httpd/trunk/server/mpm/event/event.c (original)
  +++ httpd/httpd/trunk/server/mpm/event/event.c Fri Nov 16 16:49:31 2012
  @@ -2928,6 +2928,18 @@ static int event_pre_config(apr_pool_t *
   }
   ++retained-module_loads;
   if (retained-module_loads == 2) {
  +int i;
  +static apr_uint32_t foo = 0;
  +
  +apr_atomic_inc32(foo);
  +apr_atomic_dec32(foo);
  +apr_atomic_dec32(foo);
  +i = apr_atomic_dec32(foo);
  +if (i = 0) {

 Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes foo
 to become zero and it returns non zero
 otherwise. Shouldn't this behavior the same across all platforms? And if
 not should that be fixed in APR?


icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb here.

--enable-nonportable-atomics is specified for apr, though I haven't checked
what that does with icc.



  +ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL,
 APLOGNO(02405)
  + atomics not working as expected);
  +return HTTP_INTERNAL_SERVER_ERROR;
  +}
   rv = apr_pollset_create(event_pollset, 1, plog,
   APR_POLLSET_THREADSAFE |
 APR_POLLSET_NOCOPY);
   if (rv != APR_SUCCESS) {
 
 

 Regards

 RĂ¼diger




-- 
Born in Roswell... married an alien...
http://emptyhammock.com/


Re: [VOTE] Release Apache httpd 2.4.7 as GA

2013-11-22 Thread Jeff Trawick
On Wed, Nov 20, 2013 at 2:06 PM, Jeff Trawick traw...@gmail.com wrote:

 On Tue, Nov 19, 2013 at 12:45 PM, Jim Jagielski j...@jagunet.com wrote:

 The pre-release test tarballs for Apache httpd 2.4.7 can be found
 at the usual place:

 http://httpd.apache.org/dev/dist/

 I'm calling a VOTE on releasing these as Apache httpd 2.4.7 GA.

 [ ] +1: Good to go
 [ ] +0: meh
 [ ] -1: Danger Will Robinson. And why.


 [X] +1: Good to go

 Linux RHEL5-ish:

 httpd 2.4.7+apr-1.5.0+apr-util-1.5.3+mod_perl httpd24threading branch
 (current)+latest libxml2/pcre/zlib/other modules
 **but no mod_ssl**

 passes httpd test suite
 passes the same mod_perl tests that passed with httpd 2.4.6


I forgot to try this with icc at the time :(  Event no longer works with
httpd and apr built with icc.  (See r1410459 commit thread.)  More digging
on my part is needed to find out which atomic code gets used.



 Win2008 R2:

 same combination of code
 Visual Studio 2012 64-bit (cmake NMake Makefiles generator)

 passes the same httpd tests that passed with 2.4.6 (running all testcases
 cleanly on Windows is not currently possible)
 not able to try mod_perl test suite in this environment currently




-- 
Born in Roswell... married an alien...
http://emptyhammock.com/


Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jim Jagielski

On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:

 On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org wrote:
 
 
 j...@apache.org wrote:
  +i = apr_atomic_dec32(foo);
  +if (i = 0) {
 
 Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes foo to 
 become zero and it returns non zero
 otherwise. Shouldn't this behavior the same across all platforms? And if not 
 should that be fixed in APR?
 
 icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb here.
 
 --enable-nonportable-atomics is specified for apr, though I haven't checked 
 what that does with icc.
 

As noted back with the orig update, this test is due to the
fdqueue code in the new event:

apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
apr_pool_t * pool_to_recycle)
{
apr_status_t rv;
int prev_idlers;

ap_push_pool(queue_info, pool_to_recycle);

/* Atomically increment the count of idle workers */
/*
 * TODO: The atomics expect unsigned whereas we're using signed.
 *   Need to double check that they work as expected or else
 *   rework how we determine blocked.
 * UPDATE: Correct operation is performed during open_logs()
 */
prev_idlers = apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));

/* If other threads are waiting on a worker, wake one up */
if (prev_idlers  0) {


See the comments (The atomics expect unsigned whereas...) for
the reason, etc.

When you say icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb 
here.
do you mean that you get the 'atomics not working as expected' error
(and the internal server error) or that it core dumps?



Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com wrote:


 On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:

  On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org
 wrote:
 
 
  j...@apache.org wrote:
   +i = apr_atomic_dec32(foo);
   +if (i = 0) {
 
  Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes
 foo to become zero and it returns non zero
  otherwise. Shouldn't this behavior the same across all platforms? And if
 not should that be fixed in APR?
 
  icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb here.
 
  --enable-nonportable-atomics is specified for apr, though I haven't
 checked what that does with icc.
 

 As noted back with the orig update, this test is due to the
 fdqueue code in the new event:

 apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
 apr_pool_t * pool_to_recycle)
 {
 apr_status_t rv;
 int prev_idlers;

 ap_push_pool(queue_info, pool_to_recycle);

 /* Atomically increment the count of idle workers */
 /*
  * TODO: The atomics expect unsigned whereas we're using signed.
  *   Need to double check that they work as expected or else
  *   rework how we determine blocked.
  * UPDATE: Correct operation is performed during open_logs()
  */
 prev_idlers = apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));

 /* If other threads are waiting on a worker, wake one up */
 if (prev_idlers  0) {


 See the comments (The atomics expect unsigned whereas...) for
 the reason, etc.

 When you say icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0)
 bomb here.
 do you mean that you get the 'atomics not working as expected' error
 (and the internal server error) or that it core dumps?


atomics not working as expected

Let me see what code is used...

-- 
Born in Roswell... married an alien...
http://emptyhammock.com/


Re: [VOTE] Release Apache httpd 2.4.7 as GA

2013-11-22 Thread Jim Jagielski
Note, the only think changed in event now (via 
https://svn.apache.org/viewvc?view=revisionrevision=1542560)
is that event *checks* that atomics work as required for
event... if the check fails, it means that event has
been broken on that system, assuming it ever hit
blocked idlers, for a *long* time.

On Nov 22, 2013, at 2:27 PM, Jeff Trawick traw...@gmail.com wrote:

 On Wed, Nov 20, 2013 at 2:06 PM, Jeff Trawick traw...@gmail.com wrote:
 On Tue, Nov 19, 2013 at 12:45 PM, Jim Jagielski j...@jagunet.com wrote:
 The pre-release test tarballs for Apache httpd 2.4.7 can be found
 at the usual place:
 
 http://httpd.apache.org/dev/dist/
 
 I'm calling a VOTE on releasing these as Apache httpd 2.4.7 GA.
 
 [ ] +1: Good to go
 [ ] +0: meh
 [ ] -1: Danger Will Robinson. And why.
 
 [X] +1: Good to go
 
 Linux RHEL5-ish:
 
 httpd 2.4.7+apr-1.5.0+apr-util-1.5.3+mod_perl httpd24threading branch 
 (current)+latest libxml2/pcre/zlib/other modules
 **but no mod_ssl**
 
 passes httpd test suite
 passes the same mod_perl tests that passed with httpd 2.4.6
 
 I forgot to try this with icc at the time :(  Event no longer works with 
 httpd and apr built with icc.  (See r1410459 commit thread.)  More digging on 
 my part is needed to find out which atomic code gets used.
  
 
 Win2008 R2:
 
 same combination of code
 Visual Studio 2012 64-bit (cmake NMake Makefiles generator)
 
 passes the same httpd tests that passed with 2.4.6 (running all testcases 
 cleanly on Windows is not currently possible)
 not able to try mod_perl test suite in this environment currently
 
 
 
 
 -- 
 Born in Roswell... married an alien...
 http://emptyhammock.com/



Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jim Jagielski
Note, the only think changed in event now (via 
https://svn.apache.org/viewvc?view=revisionrevision=1542560)
is that event *checks* that atomics work as required for
event... if the check fails, it means that event has
been broken on that system, assuming it ever hit
blocked idlers, for a *long* time...

You should be seeing it in trunk as well...


On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com wrote:
 
 On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
  On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org wrote:
 
 
  j...@apache.org wrote:
   +i = apr_atomic_dec32(foo);
   +if (i = 0) {
 
  Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes foo 
  to become zero and it returns non zero
  otherwise. Shouldn't this behavior the same across all platforms? And if 
  not should that be fixed in APR?
 
  icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb here.
 
  --enable-nonportable-atomics is specified for apr, though I haven't checked 
  what that does with icc.
 
 
 As noted back with the orig update, this test is due to the
 fdqueue code in the new event:
 
 apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
 apr_pool_t * pool_to_recycle)
 {
 apr_status_t rv;
 int prev_idlers;
 
 ap_push_pool(queue_info, pool_to_recycle);
 
 /* Atomically increment the count of idle workers */
 /*
  * TODO: The atomics expect unsigned whereas we're using signed.
  *   Need to double check that they work as expected or else
  *   rework how we determine blocked.
  * UPDATE: Correct operation is performed during open_logs()
  */
 prev_idlers = apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));
 
 /* If other threads are waiting on a worker, wake one up */
 if (prev_idlers  0) {
 
 
 See the comments (The atomics expect unsigned whereas...) for
 the reason, etc.
 
 When you say icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) 
 bomb here.
 do you mean that you get the 'atomics not working as expected' error
 (and the internal server error) or that it core dumps?
 
 
 atomics not working as expected
 
 Let me see what code is used...
 
 -- 
 Born in Roswell... married an alien...
 http://emptyhammock.com/



Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:

 Note, the only think changed in event now (via
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
 is that event *checks* that atomics work as required for
 event... if the check fails, it means that event has
 been broken on that system, assuming it ever hit
 blocked idlers, for a *long* time...


Got it...  fdqueue.c is asking for trouble...

I'm using atomic/unix/ia32.c with icc too.

Need to compare generated code...  I hate stuff like int foo() { unsigned
char x;  ... return x;  }




 You should be seeing it in trunk as well...


 On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:

  On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com wrote:
 
  On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
   On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org
 wrote:
  
  
   j...@apache.org wrote:
+i = apr_atomic_dec32(foo);
+if (i = 0) {
  
   Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes
 foo to become zero and it returns non zero
   otherwise. Shouldn't this behavior the same across all platforms? And
 if not should that be fixed in APR?
  
   icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb here.
  
   --enable-nonportable-atomics is specified for apr, though I haven't
 checked what that does with icc.
  
 
  As noted back with the orig update, this test is due to the
  fdqueue code in the new event:
 
  apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
  apr_pool_t * pool_to_recycle)
  {
  apr_status_t rv;
  int prev_idlers;
 
  ap_push_pool(queue_info, pool_to_recycle);
 
  /* Atomically increment the count of idle workers */
  /*
   * TODO: The atomics expect unsigned whereas we're using signed.
   *   Need to double check that they work as expected or else
   *   rework how we determine blocked.
   * UPDATE: Correct operation is performed during open_logs()
   */
  prev_idlers = apr_atomic_inc32((apr_uint32_t
 *)(queue_info-idlers));
 
  /* If other threads are waiting on a worker, wake one up */
  if (prev_idlers  0) {
 
 
  See the comments (The atomics expect unsigned whereas...) for
  the reason, etc.
 
  When you say icc (Intel) builds of httpd 2.4.7 event MPM (with
 apr-1.5.0) bomb here.
  do you mean that you get the 'atomics not working as expected' error
  (and the internal server error) or that it core dumps?
 
 
  atomics not working as expected
 
  Let me see what code is used...
 
  --
  Born in Roswell... married an alien...
  http://emptyhammock.com/




-- 
Born in Roswell... married an alien...
http://emptyhammock.com/


Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jim Jagielski

On Nov 22, 2013, at 3:24 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:
 Note, the only think changed in event now (via 
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
 is that event *checks* that atomics work as required for
 event... if the check fails, it means that event has
 been broken on that system, assuming it ever hit
 blocked idlers, for a *long* time...
 
 Got it...  fdqueue.c is asking for trouble...
 

Yeah.

 I'm using atomic/unix/ia32.c with icc too.
 
 Need to compare generated code...  I hate stuff like int foo() { unsigned 
 char x;  ... return x;  }
 
  
 
 You should be seeing it in trunk as well...
 
 
 On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:
 
  On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com wrote:
 
  On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
   On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org wrote:
  
  
   j...@apache.org wrote:
+i = apr_atomic_dec32(foo);
+if (i = 0) {
  
   Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes foo 
   to become zero and it returns non zero
   otherwise. Shouldn't this behavior the same across all platforms? And if 
   not should that be fixed in APR?
  
   icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb here.
  
   --enable-nonportable-atomics is specified for apr, though I haven't 
   checked what that does with icc.
  
 
  As noted back with the orig update, this test is due to the
  fdqueue code in the new event:
 
  apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
  apr_pool_t * pool_to_recycle)
  {
  apr_status_t rv;
  int prev_idlers;
 
  ap_push_pool(queue_info, pool_to_recycle);
 
  /* Atomically increment the count of idle workers */
  /*
   * TODO: The atomics expect unsigned whereas we're using signed.
   *   Need to double check that they work as expected or else
   *   rework how we determine blocked.
   * UPDATE: Correct operation is performed during open_logs()
   */
  prev_idlers = apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));
 
  /* If other threads are waiting on a worker, wake one up */
  if (prev_idlers  0) {
 
 
  See the comments (The atomics expect unsigned whereas...) for
  the reason, etc.
 
  When you say icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) 
  bomb here.
  do you mean that you get the 'atomics not working as expected' error
  (and the internal server error) or that it core dumps?
 
 
  atomics not working as expected
 
  Let me see what code is used...
 
  --
  Born in Roswell... married an alien...
  http://emptyhammock.com/
 
 
 
 
 -- 
 Born in Roswell... married an alien...
 http://emptyhammock.com/



Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Fri, Nov 22, 2013 at 3:24 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:

 Note, the only think changed in event now (via
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
 is that event *checks* that atomics work as required for
 event... if the check fails, it means that event has
 been broken on that system, assuming it ever hit
 blocked idlers, for a *long* time...


 Got it...  fdqueue.c is asking for trouble...

 I'm using atomic/unix/ia32.c with icc too.

 Need to compare generated code...  I hate stuff like int foo() { unsigned
 char x;  ... return x;  }


APR is documented as returning zero if the value becomes zero on
decrement, otherwise non-zero.

With gcc we use get __sync_sub_and_fetch(), which returns the new value
after the decrement.

With icc we use the assembler implementation in APR.  I think that's
returning 1 instead of -1.

Here is where fdqueue needs to be able to see a negative return code:

apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
{
int prev_idlers;
prev_idlers = apr_atomic_dec32((apr_uint32_t *)(queue_info-idlers));
if (prev_idlers = 0) {
apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/* back
out dec */
return APR_EAGAIN;
}
return APR_SUCCESS;
}

(prev in the ia32.c version of apr_atomic_dec32() and prev_idlers here
is deceiving.)




 You should be seeing it in trunk as well...


 On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:

  On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com wrote:
 
  On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
   On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org
 wrote:
  
  
   j...@apache.org wrote:
+i = apr_atomic_dec32(foo);
+if (i = 0) {
  
   Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes
 foo to become zero and it returns non zero
   otherwise. Shouldn't this behavior the same across all platforms? And
 if not should that be fixed in APR?
  
   icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb
 here.
  
   --enable-nonportable-atomics is specified for apr, though I haven't
 checked what that does with icc.
  
 
  As noted back with the orig update, this test is due to the
  fdqueue code in the new event:
 
  apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
  apr_pool_t * pool_to_recycle)
  {
  apr_status_t rv;
  int prev_idlers;
 
  ap_push_pool(queue_info, pool_to_recycle);
 
  /* Atomically increment the count of idle workers */
  /*
   * TODO: The atomics expect unsigned whereas we're using signed.
   *   Need to double check that they work as expected or else
   *   rework how we determine blocked.
   * UPDATE: Correct operation is performed during open_logs()
   */
  prev_idlers = apr_atomic_inc32((apr_uint32_t
 *)(queue_info-idlers));
 
  /* If other threads are waiting on a worker, wake one up */
  if (prev_idlers  0) {
 
 
  See the comments (The atomics expect unsigned whereas...) for
  the reason, etc.
 
  When you say icc (Intel) builds of httpd 2.4.7 event MPM (with
 apr-1.5.0) bomb here.
  do you mean that you get the 'atomics not working as expected' error
  (and the internal server error) or that it core dumps?
 
 
  atomics not working as expected
 
  Let me see what code is used...
 
  --
  Born in Roswell... married an alien...
  http://emptyhammock.com/




 --
 Born in Roswell... married an alien...
 http://emptyhammock.com/




-- 
Born in Roswell... married an alien...
http://emptyhammock.com/


Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Fri, Nov 22, 2013 at 3:40 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 3:24 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:

 Note, the only think changed in event now (via
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
 is that event *checks* that atomics work as required for
 event... if the check fails, it means that event has
 been broken on that system, assuming it ever hit
 blocked idlers, for a *long* time...


 Got it...  fdqueue.c is asking for trouble...

 I'm using atomic/unix/ia32.c with icc too.

 Need to compare generated code...  I hate stuff like int foo() {
 unsigned char x;  ... return x;  }


 APR is documented as returning zero if the value becomes zero on
 decrement, otherwise non-zero.

 With gcc we use get __sync_sub_and_fetch(), which returns the new value
 after the decrement.

 With icc we use the assembler implementation in APR.  I think that's
 returning 1 instead of -1.


It does a decrement long, which sets the zero flag as appropriate.  Then it
does set-not-equal to set what becomes the return value to 0 if the result
of the decrement was 0 and 1 otherwise.

It should be easy to make it return the new value like the
__sync_sub_and_fetch() version does :)



 Here is where fdqueue needs to be able to see a negative return code:

 apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
 {
 int prev_idlers;
 prev_idlers = apr_atomic_dec32((apr_uint32_t *)(queue_info-idlers));
 if (prev_idlers = 0) {
 apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/*
 back out dec */
 return APR_EAGAIN;
 }
 return APR_SUCCESS;
 }

 (prev in the ia32.c version of apr_atomic_dec32() and prev_idlers here
 is deceiving.)




 You should be seeing it in trunk as well...


 On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:

  On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com
 wrote:
 
  On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
   On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org
 wrote:
  
  
   j...@apache.org wrote:
+i = apr_atomic_dec32(foo);
+if (i = 0) {
  
   Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec
 causes foo to become zero and it returns non zero
   otherwise. Shouldn't this behavior the same across all platforms?
 And if not should that be fixed in APR?
  
   icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb
 here.
  
   --enable-nonportable-atomics is specified for apr, though I haven't
 checked what that does with icc.
  
 
  As noted back with the orig update, this test is due to the
  fdqueue code in the new event:
 
  apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
  apr_pool_t * pool_to_recycle)
  {
  apr_status_t rv;
  int prev_idlers;
 
  ap_push_pool(queue_info, pool_to_recycle);
 
  /* Atomically increment the count of idle workers */
  /*
   * TODO: The atomics expect unsigned whereas we're using signed.
   *   Need to double check that they work as expected or else
   *   rework how we determine blocked.
   * UPDATE: Correct operation is performed during open_logs()
   */
  prev_idlers = apr_atomic_inc32((apr_uint32_t
 *)(queue_info-idlers));
 
  /* If other threads are waiting on a worker, wake one up */
  if (prev_idlers  0) {
 
 
  See the comments (The atomics expect unsigned whereas...) for
  the reason, etc.
 
  When you say icc (Intel) builds of httpd 2.4.7 event MPM (with
 apr-1.5.0) bomb here.
  do you mean that you get the 'atomics not working as expected' error
  (and the internal server error) or that it core dumps?
 
 
  atomics not working as expected
 
  Let me see what code is used...
 
  --
  Born in Roswell... married an alien...
  http://emptyhammock.com/




 --
 Born in Roswell... married an alien...
 http://emptyhammock.com/




 --
 Born in Roswell... married an alien...
 http://emptyhammock.com/




-- 
Born in Roswell... married an alien...
http://emptyhammock.com/


Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Fri, Nov 22, 2013 at 3:57 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 3:40 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 3:24 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:

 Note, the only think changed in event now (via
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
 is that event *checks* that atomics work as required for
 event... if the check fails, it means that event has
 been broken on that system, assuming it ever hit
 blocked idlers, for a *long* time...


 Got it...  fdqueue.c is asking for trouble...

 I'm using atomic/unix/ia32.c with icc too.

 Need to compare generated code...  I hate stuff like int foo() {
 unsigned char x;  ... return x;  }


 APR is documented as returning zero if the value becomes zero on
 decrement, otherwise non-zero.

 With gcc we use get __sync_sub_and_fetch(), which returns the new value
 after the decrement.

 With icc we use the assembler implementation in APR.  I think that's
 returning 1 instead of -1.


 It does a decrement long, which sets the zero flag as appropriate.  Then
 it does set-not-equal to set what becomes the return value to 0 if the
 result of the decrement was 0 and 1 otherwise.

 It should be easy to make it return the new value like the
 __sync_sub_and_fetch() version does :)


Any Intel assembly gurus out there?

 --- apr.orig/atomic/unix/ia32.c 2013-04-21 14:28:47.0 -0700
+++ apr/atomic/unix/ia32.c 2013-11-22 13:16:04.0 -0800
@@ -57,14 +57,14 @@

 APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem)
 {
-unsigned char prev;
+apr_uint32_t newvalue;

-asm volatile (lock; decl %0; setnz %1
-  : =m (*mem), =qm (prev)
+asm volatile (lock; decl %0; movl %0,%1
+  : =m (*mem), =qm (newvalue)
   : m (*mem)
   : memory);

-return prev;
+return newvalue;
 }

 APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem,
apr_uint32_t with,

It probably uses a zillion more cycles than the previous version.  I wonder
what __sync_sub_and_fetch() does exactly.

Also, maybe stdcxx has an implementation somewhere that matches
__sync_sub_and_fetch() (I see
http://svn.apache.org/repos/asf/stdcxx/branches/4.2.x/include/rw/_atomic-sync.h,
but no time to look now.




 Here is where fdqueue needs to be able to see a negative return code:

 apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
 {
 int prev_idlers;
 prev_idlers = apr_atomic_dec32((apr_uint32_t *)(queue_info-idlers));
 if (prev_idlers = 0) {
 apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/*
 back out dec */
 return APR_EAGAIN;
 }
 return APR_SUCCESS;
 }

 (prev in the ia32.c version of apr_atomic_dec32() and prev_idlers
 here is deceiving.)




 You should be seeing it in trunk as well...


 On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:

  On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com
 wrote:
 
  On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
   On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org
 wrote:
  
  
   j...@apache.org wrote:
+i = apr_atomic_dec32(foo);
+if (i = 0) {
  
   Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec
 causes foo to become zero and it returns non zero
   otherwise. Shouldn't this behavior the same across all platforms?
 And if not should that be fixed in APR?
  
   icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb
 here.
  
   --enable-nonportable-atomics is specified for apr, though I haven't
 checked what that does with icc.
  
 
  As noted back with the orig update, this test is due to the
  fdqueue code in the new event:
 
  apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
  apr_pool_t * pool_to_recycle)
  {
  apr_status_t rv;
  int prev_idlers;
 
  ap_push_pool(queue_info, pool_to_recycle);
 
  /* Atomically increment the count of idle workers */
  /*
   * TODO: The atomics expect unsigned whereas we're using signed.
   *   Need to double check that they work as expected or else
   *   rework how we determine blocked.
   * UPDATE: Correct operation is performed during open_logs()
   */
  prev_idlers = apr_atomic_inc32((apr_uint32_t
 *)(queue_info-idlers));
 
  /* If other threads are waiting on a worker, wake one up */
  if (prev_idlers  0) {
 
 
  See the comments (The atomics expect unsigned whereas...) for
  the reason, etc.
 
  When you say icc (Intel) builds of httpd 2.4.7 event MPM (with
 apr-1.5.0) bomb here.
  do you mean that you get the 'atomics not working as expected' error
  (and the internal server error) or that it core dumps?
 
 
  atomics not working as expected
 
  Let me see what code is used...
 
  

Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jim Jagielski
The thing is is not only do we worry about the return code
but also that the values we dec32 and inc32 also behave
as signed ints. Note below we worry also that queue_info-idlers
itself is signed, and can be  0 :

apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
{
int prev_idlers;
prev_idlers = apr_atomic_dec32((apr_uint32_t *)(queue_info-idlers));
if (prev_idlers = 0) {
apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/* back out 
dec */
return APR_EAGAIN;
}
return APR_SUCCESS;
}

apr_status_t ap_queue_info_wait_for_idler(fd_queue_info_t * queue_info,
  int *had_to_block)
{
apr_status_t rv;
int prev_idlers;

/* Atomically decrement the idle worker count, saving the old value */
/* See TODO in ap_queue_info_set_idle() */
prev_idlers = apr_atomic_add32((apr_uint32_t *)(queue_info-idlers), -1);

/* Block if there weren't any idle workers */
if (prev_idlers = 0) {
rv = apr_thread_mutex_lock(queue_info-idlers_mutex);
if (rv != APR_SUCCESS) {
AP_DEBUG_ASSERT(0);
/* See TODO in ap_queue_info_set_idle() */
apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/* back 
out dec */
return rv;
}
/* Re-check the idle worker count to guard against a
 * race condition.  Now that we're in the mutex-protected
 * region, one of two things may have happened:
 *   - If the idle worker count is still negative, the
 * workers are all still busy, so it's safe to
 * block on a condition variable.
 *   - If the idle worker count is non-negative, then a
 * worker has become idle since the first check
 * of queue_info-idlers above.  It's possible
 * that the worker has also signaled the condition
 * variable--and if so, the listener missed it
 * because it wasn't yet blocked on the condition
 * variable.  But if the idle worker count is
 * now non-negative, it's safe for this function to
 * return immediately.
 *
 * A negative value in queue_info-idlers tells how many
 * threads are waiting on an idle worker.
 */
if (queue_info-idlers  0) {
*had_to_block = 1;
rv = apr_thread_cond_wait(queue_info-wait_for_idler,
  queue_info-idlers_mutex);

On Nov 22, 2013, at 3:40 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 3:24 PM, Jeff Trawick traw...@gmail.com wrote:
 On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:
 Note, the only think changed in event now (via 
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
 is that event *checks* that atomics work as required for
 event... if the check fails, it means that event has
 been broken on that system, assuming it ever hit
 blocked idlers, for a *long* time...
 
 Got it...  fdqueue.c is asking for trouble...
 
 I'm using atomic/unix/ia32.c with icc too.
 
 Need to compare generated code...  I hate stuff like int foo() { unsigned 
 char x;  ... return x;  }
 
 
 APR is documented as returning zero if the value becomes zero on decrement, 
 otherwise non-zero.
 
 With gcc we use get __sync_sub_and_fetch(), which returns the new value after 
 the decrement.
 
 With icc we use the assembler implementation in APR.  I think that's 
 returning 1 instead of -1.
 
 Here is where fdqueue needs to be able to see a negative return code:
 
 apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
 {
 int prev_idlers;
 prev_idlers = apr_atomic_dec32((apr_uint32_t *)(queue_info-idlers));
 if (prev_idlers = 0) {
 apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/* back 
 out dec */
 return APR_EAGAIN;
 }
 return APR_SUCCESS;
 }
 
 (prev in the ia32.c version of apr_atomic_dec32() and prev_idlers here is 
 deceiving.)
 
  
 
 You should be seeing it in trunk as well...
 
 
 On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:
 
  On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com wrote:
 
  On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
   On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org wrote:
  
  
   j...@apache.org wrote:
+i = apr_atomic_dec32(foo);
+if (i = 0) {
  
   Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec causes foo 
   to become zero and it returns non zero
   otherwise. Shouldn't this behavior the same across all platforms? And if 
   not should that be fixed in APR?
  
   icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb here.
  
   --enable-nonportable-atomics is specified for apr, though I haven't 
   checked what that does with icc.
  
 
  As noted back with the orig update, this test is 

Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jim Jagielski
Anyone ever try OpenPA? 

https://trac.mcs.anl.gov/projects/openpa/

It's under MIT, fwiw.


Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Fri, Nov 22, 2013 at 4:27 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 3:57 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 3:40 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 3:24 PM, Jeff Trawick traw...@gmail.com wrote:

 On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:

 Note, the only think changed in event now (via
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
 is that event *checks* that atomics work as required for
 event... if the check fails, it means that event has
 been broken on that system, assuming it ever hit
 blocked idlers, for a *long* time...


 Got it...  fdqueue.c is asking for trouble...

 I'm using atomic/unix/ia32.c with icc too.

 Need to compare generated code...  I hate stuff like int foo() {
 unsigned char x;  ... return x;  }


 APR is documented as returning zero if the value becomes zero on
 decrement, otherwise non-zero.

 With gcc we use get __sync_sub_and_fetch(), which returns the new value
 after the decrement.

 With icc we use the assembler implementation in APR.  I think that's
 returning 1 instead of -1.


 It does a decrement long, which sets the zero flag as appropriate.  Then
 it does set-not-equal to set what becomes the return value to 0 if the
 result of the decrement was 0 and 1 otherwise.

 It should be easy to make it return the new value like the
 __sync_sub_and_fetch() version does :)


 Any Intel assembly gurus out there?

  --- apr.orig/atomic/unix/ia32.c 2013-04-21 14:28:47.0 -0700
 +++ apr/atomic/unix/ia32.c 2013-11-22 13:16:04.0 -0800
 @@ -57,14 +57,14 @@

  APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem)
  {
 -unsigned char prev;
 +apr_uint32_t newvalue;

 -asm volatile (lock; decl %0; setnz %1
 -  : =m (*mem), =qm (prev)
 +asm volatile (lock; decl %0; movl %0,%1
 +  : =m (*mem), =qm (newvalue)
: m (*mem)
: memory);

 -return prev;
 +return newvalue;
  }

  APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem,
 apr_uint32_t with,

 It probably uses a zillion more cycles than the previous version.  I
 wonder what __sync_sub_and_fetch() does exactly.

 Also, maybe stdcxx has an implementation somewhere that matches
 __sync_sub_and_fetch() (I see
 http://svn.apache.org/repos/asf/stdcxx/branches/4.2.x/include/rw/_atomic-sync.h,
 but no time to look now.


Most (I won't swear exactly which ones ;) ) APR implementations of
apr_atomic_dec32() return the new value.  The z/OS code in
atomic/os390/atomic.c needs an obvious fix too.  (IIUC, Event MPM should
work there because of recently added pollset support, though I guess a few
lines in configure and event need to be patched to recognize the new
pollset implementation as usable by event.)





 Here is where fdqueue needs to be able to see a negative return code:

 apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
 {
 int prev_idlers;
 prev_idlers = apr_atomic_dec32((apr_uint32_t
 *)(queue_info-idlers));
 if (prev_idlers = 0) {
 apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/*
 back out dec */
 return APR_EAGAIN;
 }
 return APR_SUCCESS;
 }

 (prev in the ia32.c version of apr_atomic_dec32() and prev_idlers
 here is deceiving.)




 You should be seeing it in trunk as well...


 On Nov 22, 2013, at 2:43 PM, Jeff Trawick traw...@gmail.com wrote:

  On Fri, Nov 22, 2013 at 2:39 PM, Jim Jagielski j...@jagunet.com
 wrote:
 
  On Nov 22, 2013, at 2:22 PM, Jeff Trawick traw...@gmail.com wrote:
 
   On Sat, Nov 17, 2012 at 6:00 AM, Ruediger Pluem rpl...@apache.org
 wrote:
  
  
   j...@apache.org wrote:
+i = apr_atomic_dec32(foo);
+if (i = 0) {
  
   Why can we expect i  0? apr_atomic_dec32 returns 0 if the dec
 causes foo to become zero and it returns non zero
   otherwise. Shouldn't this behavior the same across all platforms?
 And if not should that be fixed in APR?
  
   icc (Intel) builds of httpd 2.4.7 event MPM (with apr-1.5.0) bomb
 here.
  
   --enable-nonportable-atomics is specified for apr, though I
 haven't checked what that does with icc.
  
 
  As noted back with the orig update, this test is due to the
  fdqueue code in the new event:
 
  apr_status_t ap_queue_info_set_idle(fd_queue_info_t * queue_info,
  apr_pool_t * pool_to_recycle)
  {
  apr_status_t rv;
  int prev_idlers;
 
  ap_push_pool(queue_info, pool_to_recycle);
 
  /* Atomically increment the count of idle workers */
  /*
   * TODO: The atomics expect unsigned whereas we're using signed.
   *   Need to double check that they work as expected or else
   *   rework how we determine blocked.
   * UPDATE: Correct operation is performed during open_logs()
   */
  prev_idlers = apr_atomic_inc32((apr_uint32_t
 

Re: svn commit: r1410459 - in /httpd/httpd/trunk: docs/log-message-tags/next-number server/mpm/event/event.c server/mpm/eventopt/eventopt.c

2013-11-22 Thread Jeff Trawick
On Fri, Nov 22, 2013 at 4:32 PM, Jim Jagielski j...@jagunet.com wrote:

 The thing is is not only do we worry about the return code
 but also that the values we dec32 and inc32 also behave
 as signed ints. Note below we worry also that queue_info-idlers
 itself is signed, and can be  0 :


Okay gurus, tell me where I'm confused (maybe I'm trainable):

I guess the opportunity for failure is if one of the APR implementations of
apr_atomic_dec32() is setting the return value in C code.  But doing that
(i.e., not having the assembly code set a local variable which is returned)
is uncommon.

Imagine that this existing z/OS code is changed to simply return new_val.
 Conversion from 32-bit unsigned int to 32-bit signed int is undefined IIUC
and in the unlikely case that the compiler tried to change the bits some
trick would be needed in the code.

int apr_atomic_dec32(volatile apr_uint32_t *mem)
{
apr_uint32_t old, new_val;

old = *mem;   /* old is automatically updated on cs failure */
do {
new_val = old - 1;
} while (__cs(old, (cs_t *)mem, new_val));

return new_val != 0;
}



 apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
 {
 int prev_idlers;
 prev_idlers = apr_atomic_dec32((apr_uint32_t *)(queue_info-idlers));
 if (prev_idlers = 0) {
 apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/*
 back out dec */
 return APR_EAGAIN;
 }
 return APR_SUCCESS;
 }

 apr_status_t ap_queue_info_wait_for_idler(fd_queue_info_t * queue_info,
   int *had_to_block)
 {
 apr_status_t rv;
 int prev_idlers;

 /* Atomically decrement the idle worker count, saving the old value */
 /* See TODO in ap_queue_info_set_idle() */
 prev_idlers = apr_atomic_add32((apr_uint32_t *)(queue_info-idlers),
 -1);

 /* Block if there weren't any idle workers */
 if (prev_idlers = 0) {
 rv = apr_thread_mutex_lock(queue_info-idlers_mutex);
 if (rv != APR_SUCCESS) {
 AP_DEBUG_ASSERT(0);
 /* See TODO in ap_queue_info_set_idle() */
 apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/*
 back out dec */
 return rv;
 }
 /* Re-check the idle worker count to guard against a
  * race condition.  Now that we're in the mutex-protected
  * region, one of two things may have happened:
  *   - If the idle worker count is still negative, the
  * workers are all still busy, so it's safe to
  * block on a condition variable.
  *   - If the idle worker count is non-negative, then a
  * worker has become idle since the first check
  * of queue_info-idlers above.  It's possible
  * that the worker has also signaled the condition
  * variable--and if so, the listener missed it
  * because it wasn't yet blocked on the condition
  * variable.  But if the idle worker count is
  * now non-negative, it's safe for this function to
  * return immediately.
  *
  * A negative value in queue_info-idlers tells how many
  * threads are waiting on an idle worker.
  */
 if (queue_info-idlers  0) {
 *had_to_block = 1;
 rv = apr_thread_cond_wait(queue_info-wait_for_idler,
   queue_info-idlers_mutex);

 On Nov 22, 2013, at 3:40 PM, Jeff Trawick traw...@gmail.com wrote:

  On Fri, Nov 22, 2013 at 3:24 PM, Jeff Trawick traw...@gmail.com wrote:
  On Fri, Nov 22, 2013 at 2:52 PM, Jim Jagielski j...@jagunet.com wrote:
  Note, the only think changed in event now (via
 https://svn.apache.org/viewvc?view=revisionrevision=1542560)
  is that event *checks* that atomics work as required for
  event... if the check fails, it means that event has
  been broken on that system, assuming it ever hit
  blocked idlers, for a *long* time...
 
  Got it...  fdqueue.c is asking for trouble...
 
  I'm using atomic/unix/ia32.c with icc too.
 
  Need to compare generated code...  I hate stuff like int foo() {
 unsigned char x;  ... return x;  }
 
 
  APR is documented as returning zero if the value becomes zero on
 decrement, otherwise non-zero.
 
  With gcc we use get __sync_sub_and_fetch(), which returns the new value
 after the decrement.
 
  With icc we use the assembler implementation in APR.  I think that's
 returning 1 instead of -1.
 
  Here is where fdqueue needs to be able to see a negative return code:
 
  apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
  {
  int prev_idlers;
  prev_idlers = apr_atomic_dec32((apr_uint32_t
 *)(queue_info-idlers));
  if (prev_idlers = 0) {
  apr_atomic_inc32((apr_uint32_t *)(queue_info-idlers));/*
 back out dec */
  return APR_EAGAIN;
  }
  return APR_SUCCESS;
  }
 
  (prev in the ia32.c version of 

Re: UDS Patch

2013-11-22 Thread Daniel Ruggeri
Sorry, I thought the diffs I sent off list were good enough. I'll have
to see if I even still have the original build lying around.
Effectively, I just took the list of patches in the backport proposal
and applied them one at a time to the 2.4.6 sources. If I can't find the
build, I'll do the same over and send that instead.

--
Daniel Ruggeri

On 11/22/2013 10:38 AM, Jim Jagielski wrote:
 Any luck with generating the diff yet?

 On Nov 19, 2013, at 3:08 PM, Jim Jagielski j...@jagunet.com wrote:

 The main thing is that it would be interesting to see
 the diffs between '2.4.6 w the (several) originally proposed UDS patches 
 applied in order'
 and '2.4.6 w proposed backport'...

 Those diffs should show just the differences between the UDS 
 implementations...

 On Nov 19, 2013, at 2:51 PM, Daniel Ruggeri drugg...@primary.net wrote:

 Yes, agreed. Not sure if I made it clear, but I did apply r1511313 for
 the tests I did today (but not the one from yesterday).

 Of the several emails sent, the following have been tested:
 2.4.6 w the (several) originally proposed UDS patches applied in order
 2.4.6 w proposed backport (the 2 chunks around the DNS changes fail to
 apply since they do not exist in 2.4.6)
 2.4.6 w r1511313 + proposed backport + r1543174

 I DID double check that the machine wasn't requesting DNS lookups for
 the socket name or anything strange against the DNS server - but that
 was only for the test I ran today.

 --
 Daniel Ruggeri

 On 11/19/2013 1:43 PM, Jim Jagielski wrote:
 OK... the DNS lookup code seems to have changed between 2.4.6 and 2.4.7:

https://svn.apache.org/viewvc?view=revisionrevision=1511313

 So I'm wondering if there's something there.