Files
love/src/modules/event/Event.cpp
T
2014-01-03 17:28:58 -04:00

123 lines
2.4 KiB
C++

/**
* Copyright (c) 2006-2014 LOVE Development Team
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
#include "Event.h"
using love::thread::Mutex;
using love::thread::Lock;
namespace love
{
namespace event
{
Message::Message(const std::string &name, Variant *a, Variant *b, Variant *c, Variant *d)
: name(name)
, nargs(0)
{
args[0] = a;
args[1] = b;
args[2] = c;
args[3] = d;
for (int i = 0; i < 4; i++)
{
if (!args[i])
break;
args[i]->retain();
nargs++;
}
}
Message::~Message()
{
for (int i = 0; i < nargs; i++)
args[i]->release();
}
int Message::toLua(lua_State *L)
{
luax_pushstring(L, name);
for (int i = 0; i < nargs; i++)
args[i]->toLua(L);
return nargs+1;
}
Message *Message::fromLua(lua_State *L, int n)
{
std::string name = luax_checkstring(L, n);
n++;
Message *m = new Message(name);
for (int i = 0; i < 4; i++)
{
if (lua_isnoneornil(L, n+i))
break;
m->args[i] = Variant::fromLua(L, n+i);
if (!m->args[i])
{
delete m;
luaL_error(L, "Argument %d can't be stored safely\nExpected boolean, number, string or userdata.", n+i);
return NULL;
}
m->nargs++;
}
return m;
}
Event::Event()
{
mutex = thread::newMutex();
}
Event::~Event()
{
delete mutex;
}
void Event::push(Message *msg)
{
Lock lock(mutex);
msg->retain();
queue.push(msg);
}
bool Event::poll(Message *&msg)
{
Lock lock(mutex);
if (queue.empty())
return false;
msg = queue.front();
queue.pop();
return true;
}
void Event::clear()
{
Lock lock(mutex);
while (!queue.empty())
{
// std::queue::pop will remove the first (front) element.
queue.front()->release();
queue.pop();
}
}
} // event
} // love