Hi Sudhanshu,
I can't spot any issues at a glance.
As for performance, perhaps you don't want to do the syscall in
signal/broadcast if there are no waiters. However it depends on you
use cases - sometimes people call signal/broadcast every here and
there, if you are going to call them iff there are waiters with high
probability, then the optimization has little sense.
You may also take a look at the mutex that I recently submitted to Go
language runtime:
http://code.google.com/p/go/source/browse/src/pkg/runtime/linux/thread.c