There probably should be a full implementation of semaphores in php. If you
have a need for this, we should discuss exactly how it should be implemented.
I will have some free time available soon, so I can start working on this. Though I 
have
a couple other projects as well. If you would be interested in contributing a CVS 
account can be arranged. This should probably start as a separate module, and then
eventually replace the sysvsem extension as it is no long being actively maintained.

I have a great desire for php to function well as a standalone scripting language
as well as web, so I am always interested as projects like this.

Is there anyone else who would find this useful?

-Jason

----- Original Message ----- 
From: "Tom May" <[EMAIL PROTECTED]>
To: "Chris Chabot" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>
Sent: Tuesday, August 21, 2001 1:58 PM
Subject: Re: sysvsem extention question


> First off, before you get the wrong impression of my answer, let me
> say that your observation "It all seems kinda kludgy and quick-hack
> for a specific > project, and not 'sysv semaphores implimented in
> php'" is right on.
> 
> Chris Chabot <[EMAIL PROTECTED]> writes:
> 
> > I have been playing with the idea of making some application backend
> > services using pcntl (for singaling and fork)+ sysvsem's (for
> > synchronisation).
> 
> Cool.  But see below.
> 
> >     However while reading thru the sysvsem source code, i noticed the
> > behaviour of the semaphores in PHP is basicly as a 'lock' (as one would
> > use a file lock w/ flock()). From what i understand from my advanced
> > unix programming book, and the linux man pages, this is not what
> > semaphores are supposed to be (though they can be abused to be so).
> >
> >     The way one would -expect- semaphores to function on a unix platform
> > is best described in "Linux Programmers Guide" at
> > 
>http://uiarchive.uiuc.edu/mirrors/ftp/ftp.ibiblio.org/pub/Linux/docs/linux-doc-project/programmers-guide/lpg-0.4.pdf
> > (page 46 and on).
> > 
> > A short sumary would be: a semaphore is a resource counter (not an
> > absolute lock).
> 
> A lock is just a degenerate case.  A slightly less degenerate case
> (that can't be implemented with flock) is when you want to allow N
> users of the resource instead of just one.
> 
> >     The main this is that a process other then the process that acquired
> > the semaphore can decrease the semaphore count, thus releasing it for
> > another client. Another big difference is that a process can set the
> > semaphore count lower then zero (0 == locked). This sometimes can be
> > usefull for Client / Server synchonisation.
> > 
> > Example usage for a typical Client / Server program flow using
> > semaphores / signals :
> 
> I admit I haven't looked at this hard enough to understand all the
> details, but could message queues help you out here?  You could get
> higher throughput since the server fills the buffer and calls msgsnd()
> beforehand, whereas in your signalling implementation clients will
> stall between the time they signal the server and the time the server
> has filled a buffer for them.  Also, you need some additional overhead
> to manage the buffer handoff from client to server.  And doing things
> in signal handlers can get dicey.
> 
> If a message queue isn't big enough for you, you can pass references
> to shared memory in your messages.
> 
> > Server :
> >     create sem
> >     sem acquire
> >     setup envirioment
> >     fork children
> > 
> > Multiple Clients:
> >     repeat (wait for sem acquire) {
> >         send signal to Server
> >         communicate with server, get 'buffer'
> >         process buffer
> >     }
> > 
> > Server:
> > 
> >     while (Fill data into buffer) {
> >         semaphore release (!);
> >         Sleep(infinite or untill time out);
> >     }
> > 
> >     -> Sleeps untill interupted by signal (signal send by Client/Child)
> >     -> In signal handler:
> >         Send 'buffer' to client that acquired semaphore
> >         return;
> >    will cause the program to go back to main loop, sleep was interupted,
> > so goes to while (fill buffer) again. Also note that the Client -never-
> > calls semaphore release. The server does that once the resource is
> > available again.
> > 
> >     Rinse and Repeat till end of time, or end of data :-) This will
> > distribute the data to be processed over all the different clients
> > (since semaphores guarantee a linear processing of clients, so all
> > clients get there equal share).
> > 
> >     Last, i don't see why the implimentation as exists, requires 3
> > semaphores.
> 
> I don't remember why either.  I did that code somewhere around the end
> of 1998 . . .
> 
> > It all seems kinda kludgy and quick-hack for a specific
> > project, and not 'sysv semaphores implimented in php'. (please forgive
> > my rude assumptions)
> 
> Bingo.
> 
> > Does the maintainer (Tom May) want to work on this, or anyone else? I'd
> > be happy to help out, but my last C coding days are over 6 years behind
> > me, so i don't feel very confident to lead this project.. So any/all
> > help and/or comments would be apreciated.
> 
> I no longer use php or maintain any of the stuff I helped with (aside
> from answering the occaisional question, like this one.
> 
> > Also i noticed a potential security hole in the exisiting source, at
> > line 190 of sysvsem.c it uses
> > 
> >     semget(key, 3, perm|IPC_CREATE);
> > 
> > However, perm is not zero'd to 7 bits before being used, thus allowing
> > extra flags being added to the call, which presumably is unintentional,
> > since it allows nasty flags to be passed to this call. perm is gotton
> > from arg_perm, which is a lval. What i imagine you 'should' do is zero
> > out all non-relivant bits, basicly AND perm with 0x777. this will clear
> > all bits other then the (file style) permission flags.
> 
> AND with 0777.  Good catch.
> 
> >     -- Chris Chabot
> > 
> > Ps. please CC me in replies, since im not subscribed to the php lists.
> 
> Me either.
> 
> Tom.


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to