As far as creating the new module goes, it shouldn't be 'to much effort'. The basic 
implimentation of system v semaphores
is actualy quite simple, its the usage of sempahores that can be very confusing :-) 
sysv sem's are often refered to as the
most difficult to comprehend of the sysv standards.

I would be more then willing to donate my time and efforts to that project, and i do 
have some knowledge of how semaphores
can be used (reader-writer, resource count and lock implimentations). However as i 
mentioned before, my last C project is
some years ago, also my knowledge of Zend internals is limited to the php-usage scope

do note a locked semaphore == 0, any value above 0 allows for a 'lock', this is done 
to allow multiple client-locks
clasical example is : if the printer manager daemon has 5 printers, it creates a 
semaphore with a max_acquire of 5. (so
acquire count == 5). Every client connecting, lowers that count... untill its zero. 
Then the client blocks 'till the value
is positive again.

Proposed API of the sysvsem
-----------------------------------

* $sem = sem_get($key,$max_acquire,$perms)
   Gets or creates a semaphore id, id is returned in $sem
* $ret = sem_acquire($sem)
   Tries to lowerer the acquire count of the semaphore. If count is already 0, wait 
till it is raised (by sem_release) or
returns an error (sem_remove was called or invalid permission to get semaphore). note: 
when the client blocks 'semzcnt' is
increased (semzcnt = # of processes waiting for lock)
* $ret = sem_release($sem)
    Increases the acquire count

[proposed new function]
* $count = sem_get_waiting($sem)
    Returns the amount of processes blocking on a semaphore acquire call. I propose -1 
= error, 0 > incicates # of waiting
processes.

Man Pages
-------------
man pages in linux are avail for:
* semget
* semop
* semctl

more info can be found on the url i posted in orig email, it explains the sem api 
decently.


Documentation
------------------
I'd be happy to help write up some documentation, general how-to-use semaphores for 
usage in php docs, plus some example
implimentations..


I will see how far i can get using the existing implimentation as a template for 
implimenting a php module.. however be
sure i'll come knocking for help fairly soon :-)

    -- Chris

Jason Greene wrote:

> 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 General 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