semaphores

Discuss the development of software, tools, libraries and anything else that helps make ps2dev happen.

Moderators: cheriff, Herben

Post Reply
radad
Posts: 246
Joined: Wed May 19, 2004 4:54 pm
Location: Melbourne, Australia

semaphores

Post by radad »

Could someone explain to me how semaphores work?

They seem to have an initial count and a max count.
I am guessing the SignalSema increments the count by 1 (unless it is already at max) and WaitSema blocks until the count reaches max. But what happens to the count after it has unblocked?
radad
Posts: 246
Joined: Wed May 19, 2004 4:54 pm
Location: Melbourne, Australia

Post by radad »

After some testing last night, here are my findings:

SignalSema - increases the count by 1
PollSema - decrease the count by 1
WaitSema - decreases the count by 1 but blocks if it is currently 0.

Interestingly, PollSema will decrease the count past 0 into negative values.

More interestingly, SignalSema increases the count beyond maxcount.

Does anybody understand the purpose of maxcount?
User avatar
Lukasz
Posts: 248
Joined: Mon Jan 19, 2004 8:37 pm
Location: Denmark
Contact:

Post by Lukasz »

The bottomline is that semaphores are to make threads wait for each other. A good example of this is the npmputs.c source available with naplink from www.napalm-x.com. Because all printfs to host go through SIF ( basically the DMA channel(s) between EE and IOP), only one thread can do a printf at a time, to make this thread-safe npmput implements a semaphore.

If the sema value is 0, then Wait (it also decreaes the value as you mentioned) will put the calling thread into wait-state and it will be awoken when the value is 1 or greater. Signal increaes the value. So you Signal to allow one thread to go pass a Wait, but if a thread calls the same function before the sema has be signaled again, it will wait. Rule of thumb, Signal at init, Wait a beginning of your single-threaded function and Signal when function is done with its single-thread work, this will make it threadsafe.

As for the details of maxCount I would assume this is the max value of the semaphore aswell, why it doesn't work as expected only the coders at Sony know. I havn't seen any code on the PS2 which allows more than 1 thread to enter and maxCount also allows less-clever thread code to work, eg. you could do unnecessary Signals.
Post Reply