Hello Fred, I already tried the startup.pl file. That didn't help but I can try again.
The text you quoted from the docs is familiar to me. That is why I set PerlInterpMax to 1 in my configuration (I want it to block for testing and understanding purposes and intellectual exercise). I initially thought that since PerlInterpMax defaults to 5 that the shared variable was not shared among the interpreters (which does not make sense because that is the point of sharing, that the variable is visible to all threads in the process). Even if I only have one interpreter, the variable is not shared. As you can see in my log, some threads see the shared fruits array and others do not. Why? Is there a way to print the id or address of the interpreter so that I can be sure that only one is being used? In case anyone is wondering, I also removed PerlModule Apache2::Reload a while ago so that is not the problem either. Sincerely, Pawel On Tue, Aug 2, 2011 at 8:24 PM, Fred Moyer <f...@redhotpenguin.com> wrote: > I haven't used the worker mpm, but it looks like you might want to > preload your handler in the httpd parent process. You can do with a > startup.pl file. It looks like each thread is initializing a copy of > @fruits, which is probably happening at thread creation. > > However, your current setup will block according to the mod_perl docs, > so you may want to revisit your approach. > > If all running interpreters are in use, mod_perl will clone new > interpreters to handle the request, up until this number of > interpreters is reached. when PerlInterpMax is reached, mod_perl will > block (via COND_WAIT()) until one becomes available (signaled via > COND_SIGNAL()). > > On Tue, Aug 2, 2011 at 12:06 AM, Pawel Herman <busymeis...@gmail.com> wrote: >> Hello, >> >> I have read all the related documentation (at least those that I >> found) and I still cannot understand why the little program I wrote >> below does not share the variable as I would expect. The log file >> that I created clearly shows that we are running in a single process. >> Some threads see the shared variable and others do not. I even >> reduced the number of pooled interpreters to one and still no luck. >> >> You will need an Apache running in Ubuntu 11.04 with mod_perl 2.0. >> Then add this code: >> >> package U2D::TestSharing; >> >> use strict; >> >> use Apache2::Const -compile => qw(OK); >> use threads; >> use threads::shared; >> use APR::OS (); >> use Time::Format qw(%time); >> use Apache2::RequestRec; >> >> our @fruits :shared = (); >> >> sub handler { >> my $r = shift; >> $r->content_type('application/json'); >> >> { >> logTestMessage('Waiting for lock.'); >> lock(@fruits); >> logTestMessage('Acquired lock.'); >> if(scalar(@fruits) == 0) { >> logTestMessage('Initializing fruits.'); >> push(@fruits,'apple'); >> push(@fruits,'banana'); >> push(@fruits,'peach'); >> } >> logTestMessage('Releasing lock.'); >> } >> >> my $message = "I like to eat ".join(', ',@fruits)."."; >> >> print $message; >> logTestMessage($message); >> >> return Apache2::Const::OK; >> } >> >> sub logTestMessage { >> my $message = shift; >> my $tid = APR::OS::current_thread_id(); >> if(open(FILE,'>>/testSharing.log')) { >> print FILE $time{'dd-mm-yyyy hh:mm:ss:mmm'}.' '.$$.'-'.$tid.': >> + '.$message."\n"; >> close(FILE); >> } else { print $!."\n"; } >> } >> >> 1; >> >> Add the following lines to apache2.conf (or uncomment the specified lines): >> >> <IfModule mpm_worker_module> >> StartServers 1 >> MinSpareThreads 5 >> ThreadsPerChild 20 >> MaxRequestsPerChild 0 >> ServerLimit 1 >> PerlInterpMax 1 >> </IfModule> >> >> To the site configuration also add: >> >> <Location /testSharing> >> SetHandler perl-script >> PerlResponseHandler U2D::TestSharing >> </Location> >> >> Then write a little JavaScript that loops 100 times and calls >> http://localhost/testSharing and check the log file. Here I am posting >> the beginning of the log on my machine: >> >> 02-08-2011 07:42:27:552 2669-3063479152: Waiting for lock. >> 02-08-2011 07:42:27:565 2669-3063479152: Acquired lock. >> 02-08-2011 07:42:27:566 2669-3063479152: Initializing fruits. >> 02-08-2011 07:42:27:566 2669-3063479152: Releasing lock. >> 02-08-2011 07:42:27:566 2669-3063479152: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:578 2669-3063479152: Waiting for lock. >> 02-08-2011 07:42:27:578 2669-3063479152: Acquired lock. >> 02-08-2011 07:42:27:578 2669-3063479152: Releasing lock. >> 02-08-2011 07:42:27:578 2669-3063479152: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:578 2669-3021515632: Waiting for lock. >> 02-08-2011 07:42:27:579 2669-3021515632: Acquired lock. >> 02-08-2011 07:42:27:579 2669-3021515632: Releasing lock. >> 02-08-2011 07:42:27:579 2669-3021515632: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:574 2669-3046693744: Waiting for lock. >> 02-08-2011 07:42:27:582 2669-3046693744: Acquired lock. >> 02-08-2011 07:42:27:582 2669-3046693744: Initializing fruits. >> 02-08-2011 07:42:27:582 2669-3046693744: Releasing lock. >> 02-08-2011 07:42:27:582 2669-3046693744: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:583 2669-3063479152: Waiting for lock. >> 02-08-2011 07:42:27:583 2669-3063479152: Acquired lock. >> 02-08-2011 07:42:27:583 2669-3063479152: Releasing lock. >> 02-08-2011 07:42:27:583 2669-3063479152: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:588 2669-3063479152: Waiting for lock. >> 02-08-2011 07:42:27:588 2669-3063479152: Acquired lock. >> 02-08-2011 07:42:27:588 2669-3063479152: Releasing lock. >> 02-08-2011 07:42:27:588 2669-3063479152: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:581 2669-3055086448: Waiting for lock. >> 02-08-2011 07:42:27:589 2669-3055086448: Acquired lock. >> 02-08-2011 07:42:27:589 2669-3055086448: Initializing fruits. >> 02-08-2011 07:42:27:589 2669-3055086448: Releasing lock. >> 02-08-2011 07:42:27:589 2669-3055086448: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:582 2669-3038301040: Waiting for lock. >> 02-08-2011 07:42:27:589 2669-3038301040: Acquired lock. >> 02-08-2011 07:42:27:589 2669-3038301040: Initializing fruits. >> 02-08-2011 07:42:27:589 2669-3038301040: Releasing lock. >> 02-08-2011 07:42:27:590 2669-3038301040: I like to eat apple, banana, peach. >> 02-08-2011 07:42:27:588 2669-3013122928: Waiting for lock. >> 02-08-2011 07:42:27:594 2669-3013122928: Acquired lock. >> 02-08-2011 07:42:27:594 2669-3013122928: Initializing fruits. >> 02-08-2011 07:42:27:594 2669-3013122928: Releasing lock. >> 02-08-2011 07:42:27:594 2669-3013122928: I like to eat apple, banana, peach. >> >> The fruits array is initialized multiple times. This is not expected >> since the fruits array is shared and we are always running in the same >> process. (Note: Thread 2669-3063479152 populates the array initially. >> Then thread 2669-3021515632 uses it but thread 2669-3046693744 creates >> the array again. Just as a side note: as I was testing this, I also >> ran into situations where multiple threads acquired the lock >> simultaneously. The expected behavior is that only one thread can >> lock at a time.) Can anyone tell me why this code does not work? >> >> Thank you for your help in advance. I hope someone can shed some light >> on this problem that I am having for weeks now. >> >> Sincerely, >> >> Pawel >> >