Mercurial > love-experiments
diff src/modules/thread/Channel.cpp @ 1104:fc7143cc0818 minor
Also mutex lock in Channel::retain
| author | Bart van Strien <bart.bes+projects@gmail.com> |
|---|---|
| date | Thu, 05 Jul 2012 17:25:41 +0200 |
| parents | 025c67973ad4 |
| children | 1a59c21cd2f3 |
line wrap: on
line diff
--- a/src/modules/thread/Channel.cpp Wed Jul 04 20:22:54 2012 +0200 +++ b/src/modules/thread/Channel.cpp Thu Jul 05 17:25:41 2012 +0200 @@ -26,136 +26,147 @@ { namespace thread { - static std::map<std::string, Channel*> namedChannels; - static Mutex *namedChannelMutex; - Channel *Channel::getChannel(const std::string &name) - { - if (!namedChannelMutex) - namedChannelMutex = newMutex(); - Lock l(namedChannelMutex); - if (!namedChannels.count(name)) - namedChannels[name] = new Channel(name); - else - namedChannels[name]->retain(); - return namedChannels[name]; - } +static std::map<std::string, Channel*> namedChannels; +static Mutex *namedChannelMutex; +Channel *Channel::getChannel(const std::string &name) +{ + if (!namedChannelMutex) + namedChannelMutex = newMutex(); + Lock l(namedChannelMutex); + if (!namedChannels.count(name)) + namedChannels[name] = new Channel(name); + else + namedChannels[name]->retain(); + return namedChannels[name]; +} - Channel::Channel() - : named(false) - { - mutex = newMutex(); - cond = newConditional(); - } +Channel::Channel() + : named(false) +{ + mutex = newMutex(); + cond = newConditional(); +} - Channel::Channel(const std::string &name) - : named(true), name(name) +Channel::Channel(const std::string &name) + : named(true), name(name) +{ + mutex = newMutex(); + cond = newConditional(); +} + +Channel::~Channel() +{ + while (!queue.empty()) { - mutex = newMutex(); - cond = newConditional(); - } - - Channel::~Channel() - { - while (!queue.empty()) - { - queue.front()->release(); - queue.pop(); - } - - delete mutex; - delete cond; - if (named) - namedChannels.erase(name); - } - - void Channel::push(Variant *var) - { - if (!var) - return; - Lock l(mutex); - var->retain(); - // Keep a reference to ourselves - // if we're non-empty and named. - if (named && queue.empty()) - retain(); - queue.push(var); - cond->signal(); + queue.front()->release(); + queue.pop(); } - Variant *Channel::pop() - { - Lock l(mutex); - if (queue.empty()) - return 0; + delete mutex; + delete cond; + if (named) + namedChannels.erase(name); +} - Variant *var = queue.front(); - queue.pop(); +void Channel::push(Variant *var) +{ + if (!var) + return; + Lock l(mutex); + var->retain(); + // Keep a reference to ourselves + // if we're non-empty and named. + if (named && queue.empty()) + retain(); + queue.push(var); + cond->signal(); +} - // Release our reference to ourselves - // if we're empty and named. - if (named && queue.empty()) - release(); - return var; - } // NOTE: Returns a retained Variant +Variant *Channel::pop() +{ + Lock l(mutex); + if (queue.empty()) + return 0; + + Variant *var = queue.front(); + queue.pop(); - Variant *Channel::demand() + // Release our reference to ourselves + // if we're empty and named. + if (named && queue.empty()) + release(); + return var; +} // NOTE: Returns a retained Variant + +Variant *Channel::demand() +{ + Variant *var; + while (!(var = pop())) { - Variant *var; - while (!(var = pop())) - { - mutex->lock(); - cond->wait(mutex); - mutex->unlock(); - } - return var; + mutex->lock(); + cond->wait(mutex); + mutex->unlock(); } + return var; +} + +Variant *Channel::peek() +{ + Lock l(mutex); + if (queue.empty()) + return 0; + + Variant *var = queue.front(); + var->retain(); + return var; +} - Variant *Channel::peek() +int Channel::count() +{ + Lock l(mutex); + return queue.size(); +} + +void Channel::clear() +{ + Lock l(mutex); + + // We're already empty. + if (queue.empty()) + return; + + while (!queue.empty()) { - Lock l(mutex); - if (queue.empty()) - return 0; - - Variant *var = queue.front(); - var->retain(); - return var; + queue.front()->release(); + queue.pop(); } - int Channel::count() - { - Lock l(mutex); - return queue.size(); - } + // Once again, release our own + // reference if we're named. + if (named) + release(); +} - void Channel::clear() - { - Lock l(mutex); +void Channel::retain() +{ + if (named) + namedChannelMutex->lock(); - // We're already empty. - if (queue.empty()) - return; + Object::retain(); - while (!queue.empty()) - { - queue.front()->release(); - queue.pop(); - } + if (named) + namedChannelMutex->unlock(); +} - // Once again, release our own - // reference if we're named. - if (named) - release(); - } +void Channel::release() +{ + if (named) + namedChannelMutex->lock(); - void Channel::release() - { - if (named) - namedChannelMutex->lock(); + Object::release(); - Object::release(); - - if (named) - namedChannelMutex->unlock(); - } + if (named) + namedChannelMutex->unlock(); +} } // thread } // love
