aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/luax/luax.h3
-rw-r--r--src/libjin/Thread/Thread.cpp7
-rw-r--r--src/libjin/Thread/Thread.h48
-rw-r--r--src/libjin/Utils/Log.h10
-rw-r--r--src/libjin/jin.h8
-rw-r--r--src/libjin/modules.h12
-rw-r--r--src/libjin/thread/thread.cpp7
-rw-r--r--src/libjin/thread/thread.h48
-rw-r--r--src/libjin/utils/log.h10
-rw-r--r--src/lua/luaopen_jin.cpp2
-rw-r--r--src/lua/thread/luaopen_Thread.cpp98
-rw-r--r--src/lua/thread/luaopen_thread.cpp98
-rw-r--r--src/main.cpp2
13 files changed, 253 insertions, 100 deletions
diff --git a/src/3rdparty/luax/luax.h b/src/3rdparty/luax/luax.h
index 8c9fcd8..4940f9f 100644
--- a/src/3rdparty/luax/luax.h
+++ b/src/3rdparty/luax/luax.h
@@ -32,6 +32,7 @@
#define LUAX_VERSION "0.1.0"
#define luax_newstate luaL_newstate
+#define luax_close lua_close
#define luax_openlibs luaL_openlibs
// load chunk but dont run it
#define luax_loadbuffer luaL_loadbuffer
@@ -40,7 +41,7 @@
#define luax_setglobal lua_setglobal
#define luax_pop lua_pop
#define luax_newtable lua_newtable
-
+#define luax_getglobal lua_getglobal
/**
*
*/
diff --git a/src/libjin/Thread/Thread.cpp b/src/libjin/Thread/Thread.cpp
index 374778b..064d3db 100644
--- a/src/libjin/Thread/Thread.cpp
+++ b/src/libjin/Thread/Thread.cpp
@@ -296,6 +296,13 @@ namespace thread
return v;
}
+ void Thread::remove(int slot)
+ {
+ lock();
+ common->remove(slot);
+ unlock();
+ }
+
} // thread
} // jin
diff --git a/src/libjin/Thread/Thread.h b/src/libjin/Thread/Thread.h
index aeb0d9e..37c978d 100644
--- a/src/libjin/Thread/Thread.h
+++ b/src/libjin/Thread/Thread.h
@@ -42,23 +42,36 @@ namespace thread
class Thread
{
public:
-
- union Variant
+ struct Variant
{
- int integer;
- bool boolean;
- char character;
- const char* cstring;
- void* pointer;
- float real;
-
- Variant() {};
- Variant(int i) : integer(i) {};
- Variant(float f) : real(f) {};
- Variant(bool b) : boolean(b) {};
- Variant(char c) : character(c) {};
- Variant(const char* s) : cstring(s) {};
- Variant(void* p) : pointer(p) {};
+ enum Type
+ {
+ NONE = 0,
+ INTERGER,
+ BOOLEAN,
+ CHARACTER,
+ CSTRING,
+ POINTER,
+ REAL,
+ };
+ Type type;
+ union
+ {
+ int integer;
+ bool boolean;
+ char character;
+ const char* cstring;
+ void* pointer;
+ float real;
+ };
+ Variant() :type(NONE) {};
+ Variant(const Variant& v){ memcpy(this, &v, sizeof(v)); }
+ Variant(int i) : integer(i), type(INTERGER) {};
+ Variant(float f) : real(f), type(REAL) {};
+ Variant(bool b) : boolean(b), type(BOOLEAN) {};
+ Variant(char c) : character(c), type(CHARACTER) {};
+ Variant(const char* s) : cstring(s), type(CSTRING) {};
+ Variant(void* p) : pointer(p), type(POINTER) {};
};
private:
@@ -76,6 +89,8 @@ namespace thread
static const int SLOT_ERROR = -1;
static const int SLOT_WARN = -2;
+ static const int SLOT_INFO = -3;
+ static const int SLOT_DEBUG = -4;
private:
std::map<int, Variant> share; // threads shared value
@@ -91,6 +106,7 @@ namespace thread
bool receive(int slot);
Variant fetch(int slot);
Variant demand(int slot);
+ void remove(int slot);
const char* getName();
bool isRunning();
void lock();
diff --git a/src/libjin/Utils/Log.h b/src/libjin/Utils/Log.h
index b047402..50ec3c8 100644
--- a/src/libjin/Utils/Log.h
+++ b/src/libjin/Utils/Log.h
@@ -65,19 +65,19 @@ void Loghelper::log(Level _level, const char* _fmt, ...)
switch (_level)
{
case LV_ERROR:
- levelStr = "Error: ";
+ levelStr = "[Jin Error]:";
break;
case LV_WARN:
- levelStr = "Warn: ";
+ levelStr = "[Jin Warn]:";
break;
case LV_INFO:
- levelStr = "Info: ";
+ levelStr = "[Jin Info]:";
break;
case LV_DEBUG:
- levelStr = "Debug: ";
+ levelStr = "[Jin Debug]:";
break;
default:
- levelStr = "Unknown: ";
+ levelStr = "[Jin Unknown]:";
break;
}
char buffer[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 };
diff --git a/src/libjin/jin.h b/src/libjin/jin.h
index ad83fae..239fddd 100644
--- a/src/libjin/jin.h
+++ b/src/libjin/jin.h
@@ -15,9 +15,9 @@
#include "Time/Timer.h"
#include "Thread/Thread.h"
-const char* JIN_VERSION = "Jin 0.1";
-const char* JIN_AUTHOR = "Chai";
-const char* JIN_RELEASE = "Jin 0.1.1";
-const int JIN_VERSION_NUM = 101;
+#define JIN_VERSION "Jin 0.1";
+#define JIN_AUTHOR "Chai";
+#define JIN_RELEASE "Jin 0.1.1";
+#define JIN_VERSION_NUM 101;
#endif // __JIN_H \ No newline at end of file
diff --git a/src/libjin/modules.h b/src/libjin/modules.h
index 06c14df..13e288f 100644
--- a/src/libjin/modules.h
+++ b/src/libjin/modules.h
@@ -6,7 +6,7 @@
#define JIN_MODULES_AUDIO 1
#define JIN_AUDIO_SDLAUDIO 1
-#define JIN_AUDIO_OPENAL 1
+#define JIN_AUDIO_OPENAL 0
#define JIN_MODULES_RENDER 1
@@ -21,15 +21,15 @@
#define JIN_MODULES_NET 1
-#define JIN_MODULES_PHYSICS 1
+#define JIN_MODULES_PHYSICS 0
#define JIN_PHYSICS_BOX2D 1
#define JIN_PHYSICS_NEWTON 1
-#define JIN_MODULES_TILEMAP 1
+#define JIN_MODULES_TILEMAP 0
-#define JIN_MODULES_UI 1
+#define JIN_MODULES_UI 0
-#define JIN_MODULES_TOOLS 1
+#define JIN_MODULES_TOOLS 0
#define JIN_TOOLS_COMPONENT 1
#define JIN_TOOLS_EVENTMSGCENTER 1
#define JIN_TOOLS_XML 1
@@ -48,7 +48,7 @@
* Open libjin debug
*/
-#define JIN_DEBUG 1
+#define JIN_DEBUG 0
/*
* Operating system
diff --git a/src/libjin/thread/thread.cpp b/src/libjin/thread/thread.cpp
index 374778b..064d3db 100644
--- a/src/libjin/thread/thread.cpp
+++ b/src/libjin/thread/thread.cpp
@@ -296,6 +296,13 @@ namespace thread
return v;
}
+ void Thread::remove(int slot)
+ {
+ lock();
+ common->remove(slot);
+ unlock();
+ }
+
} // thread
} // jin
diff --git a/src/libjin/thread/thread.h b/src/libjin/thread/thread.h
index aeb0d9e..37c978d 100644
--- a/src/libjin/thread/thread.h
+++ b/src/libjin/thread/thread.h
@@ -42,23 +42,36 @@ namespace thread
class Thread
{
public:
-
- union Variant
+ struct Variant
{
- int integer;
- bool boolean;
- char character;
- const char* cstring;
- void* pointer;
- float real;
-
- Variant() {};
- Variant(int i) : integer(i) {};
- Variant(float f) : real(f) {};
- Variant(bool b) : boolean(b) {};
- Variant(char c) : character(c) {};
- Variant(const char* s) : cstring(s) {};
- Variant(void* p) : pointer(p) {};
+ enum Type
+ {
+ NONE = 0,
+ INTERGER,
+ BOOLEAN,
+ CHARACTER,
+ CSTRING,
+ POINTER,
+ REAL,
+ };
+ Type type;
+ union
+ {
+ int integer;
+ bool boolean;
+ char character;
+ const char* cstring;
+ void* pointer;
+ float real;
+ };
+ Variant() :type(NONE) {};
+ Variant(const Variant& v){ memcpy(this, &v, sizeof(v)); }
+ Variant(int i) : integer(i), type(INTERGER) {};
+ Variant(float f) : real(f), type(REAL) {};
+ Variant(bool b) : boolean(b), type(BOOLEAN) {};
+ Variant(char c) : character(c), type(CHARACTER) {};
+ Variant(const char* s) : cstring(s), type(CSTRING) {};
+ Variant(void* p) : pointer(p), type(POINTER) {};
};
private:
@@ -76,6 +89,8 @@ namespace thread
static const int SLOT_ERROR = -1;
static const int SLOT_WARN = -2;
+ static const int SLOT_INFO = -3;
+ static const int SLOT_DEBUG = -4;
private:
std::map<int, Variant> share; // threads shared value
@@ -91,6 +106,7 @@ namespace thread
bool receive(int slot);
Variant fetch(int slot);
Variant demand(int slot);
+ void remove(int slot);
const char* getName();
bool isRunning();
void lock();
diff --git a/src/libjin/utils/log.h b/src/libjin/utils/log.h
index b047402..50ec3c8 100644
--- a/src/libjin/utils/log.h
+++ b/src/libjin/utils/log.h
@@ -65,19 +65,19 @@ void Loghelper::log(Level _level, const char* _fmt, ...)
switch (_level)
{
case LV_ERROR:
- levelStr = "Error: ";
+ levelStr = "[Jin Error]:";
break;
case LV_WARN:
- levelStr = "Warn: ";
+ levelStr = "[Jin Warn]:";
break;
case LV_INFO:
- levelStr = "Info: ";
+ levelStr = "[Jin Info]:";
break;
case LV_DEBUG:
- levelStr = "Debug: ";
+ levelStr = "[Jin Debug]:";
break;
default:
- levelStr = "Unknown: ";
+ levelStr = "[Jin Unknown]:";
break;
}
char buffer[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 };
diff --git a/src/lua/luaopen_jin.cpp b/src/lua/luaopen_jin.cpp
index 7f84467..4113ffe 100644
--- a/src/lua/luaopen_jin.cpp
+++ b/src/lua/luaopen_jin.cpp
@@ -18,6 +18,7 @@ namespace lua
extern int luaopen_filesystem(lua_State* L);
extern int luaopen_joypad(lua_State* L);
extern int luaopen_math(lua_State* L);
+ extern int luaopen_thread(lua_State* L);
static int l_getversion(lua_State* L)
{
@@ -70,6 +71,7 @@ namespace lua
{"audio", luaopen_audio},
{"joypad", luaopen_joypad},
{"math", luaopen_math},
+ {"thread", luaopen_thread},
{0, 0}
};
diff --git a/src/lua/thread/luaopen_Thread.cpp b/src/lua/thread/luaopen_Thread.cpp
index 99ddee1..4c38899 100644
--- a/src/lua/thread/luaopen_Thread.cpp
+++ b/src/lua/thread/luaopen_Thread.cpp
@@ -8,7 +8,7 @@ namespace jin
namespace lua
{
- static int luaopen_thread(lua_State* L);
+ int luaopen_thread(lua_State* L);
class Thread : public jin::thread::Thread
{
@@ -19,7 +19,9 @@ namespace jin
, code(_code)
{
}
+ static void threadRunner(jin::thread::Thread* t);
+ private:
const std::string name;
const std::string code;
};
@@ -32,18 +34,25 @@ namespace jin
return nullptr;
}
- static void threadRunner(jin::thread::Thread* t)
+ void Thread::threadRunner(jin::thread::Thread* t)
{
Thread* thread = (Thread*)t;
lua_State* L = lua_open();
luax_openlibs(L);
luaopen_jin(L);
+ luax_getglobal(L, MODULE_NAME);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy));
+ proxy->bind(thread);
+ luax_setfield(L, -2, "_curThread");
luax_dostring(L, thread->code.c_str());
+ luax_close(L);
}
static int l_gc(lua_State* L)
{
- return 1;
+ Thread* t = checkThread(L);
+ delete t;
+ return 0;
}
static int l_start(lua_State* L)
@@ -97,38 +106,74 @@ namespace jin
Thread* t = checkThread(L);
int slot = luax_checkinteger(L, 2);
Thread::Variant v = t->fetch(slot);
- //if (v.type == Thread::Value::INTEGER)
- //{
- // luax_pushinteger(L, v.integer);
- //}
- //else if (v.type == Thread::Value::BOOL)
- //{
- // luax_pushboolean(L, v.boolean);
- //}
- //else if (v.type == Thread::Value::STRING)
- //{
- // luax_pushstring(L, v.cstring);
- //}
- //else if (v.type == Thread::Value::POINTER)
- //{
- //}
+ switch (v.type)
+ {
+ case thread::Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case thread::Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case thread::Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case thread::Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+ }
return 1;
}
static int l_demand(lua_State* L)
{
Thread* t = checkThread(L);
-
+ int slot = luax_checkinteger(L, 2);
+ Thread::Variant v = t->demand(slot);
+ switch (v.type)
+ {
+ case thread::Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case thread::Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case thread::Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case thread::Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+ }
return 1;
}
+ static int l_remove(lua_State* L)
+ {
+ Thread* t = checkThread(L);
+ int slot = luax_checkinteger(L, 1);
+ t->remove(slot);
+ return 0;
+ }
+
static int l_getName(lua_State* L)
{
+ Thread* t = checkThread(L);
+ const char* name = t->getName();
+ luax_pushstring(L, name);
return 1;
}
static int l_isRunning(lua_State* L)
{
+ Thread* t = checkThread(L);
+ bool running = t->isRunning();
+ luax_pushboolean(L, running);
return 1;
}
@@ -140,6 +185,7 @@ namespace jin
{ "receive", l_receive },
{ "fetch", l_fetch },
{ "demand", l_demand },
+ { "remove", l_remove },
{ "getName", l_getName },
{ "isRunning", l_isRunning },
{ 0, 0 }
@@ -147,7 +193,7 @@ namespace jin
static int luaopen_Thread(lua_State* L)
{
- luax_newtype(L, TYPE_SOURCE, thread_function);
+ luax_newtype(L, TYPE_THREAD, thread_function);
return 0;
}
@@ -158,14 +204,16 @@ namespace jin
const char* name = luax_checkstring(L, 1);
const char* code = luax_checkstring(L, 2);
Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy));
- Thread* thread = new Thread(name, code, threadRunner);
+ Thread* thread = new Thread(name, code, Thread::threadRunner);
proxy->bind(thread);
return 1;
}
static int l_getThread(lua_State* L)
{
-
+ luax_getglobal(L, MODULE_NAME);
+ luax_getfield(L, -1, "_curThread");
+ return 1;
}
static const luaL_Reg f[] = {
@@ -174,9 +222,13 @@ namespace jin
{ 0, 0 }
};
- static int luaopen_thread(lua_State* L)
+ int luaopen_thread(lua_State* L)
{
+ luaopen_Thread(L);
+
+ luax_newlib(L, f);
+ return 1;
}
}
} \ No newline at end of file
diff --git a/src/lua/thread/luaopen_thread.cpp b/src/lua/thread/luaopen_thread.cpp
index 99ddee1..4c38899 100644
--- a/src/lua/thread/luaopen_thread.cpp
+++ b/src/lua/thread/luaopen_thread.cpp
@@ -8,7 +8,7 @@ namespace jin
namespace lua
{
- static int luaopen_thread(lua_State* L);
+ int luaopen_thread(lua_State* L);
class Thread : public jin::thread::Thread
{
@@ -19,7 +19,9 @@ namespace jin
, code(_code)
{
}
+ static void threadRunner(jin::thread::Thread* t);
+ private:
const std::string name;
const std::string code;
};
@@ -32,18 +34,25 @@ namespace jin
return nullptr;
}
- static void threadRunner(jin::thread::Thread* t)
+ void Thread::threadRunner(jin::thread::Thread* t)
{
Thread* thread = (Thread*)t;
lua_State* L = lua_open();
luax_openlibs(L);
luaopen_jin(L);
+ luax_getglobal(L, MODULE_NAME);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy));
+ proxy->bind(thread);
+ luax_setfield(L, -2, "_curThread");
luax_dostring(L, thread->code.c_str());
+ luax_close(L);
}
static int l_gc(lua_State* L)
{
- return 1;
+ Thread* t = checkThread(L);
+ delete t;
+ return 0;
}
static int l_start(lua_State* L)
@@ -97,38 +106,74 @@ namespace jin
Thread* t = checkThread(L);
int slot = luax_checkinteger(L, 2);
Thread::Variant v = t->fetch(slot);
- //if (v.type == Thread::Value::INTEGER)
- //{
- // luax_pushinteger(L, v.integer);
- //}
- //else if (v.type == Thread::Value::BOOL)
- //{
- // luax_pushboolean(L, v.boolean);
- //}
- //else if (v.type == Thread::Value::STRING)
- //{
- // luax_pushstring(L, v.cstring);
- //}
- //else if (v.type == Thread::Value::POINTER)
- //{
- //}
+ switch (v.type)
+ {
+ case thread::Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case thread::Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case thread::Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case thread::Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+ }
return 1;
}
static int l_demand(lua_State* L)
{
Thread* t = checkThread(L);
-
+ int slot = luax_checkinteger(L, 2);
+ Thread::Variant v = t->demand(slot);
+ switch (v.type)
+ {
+ case thread::Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case thread::Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case thread::Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case thread::Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+ }
return 1;
}
+ static int l_remove(lua_State* L)
+ {
+ Thread* t = checkThread(L);
+ int slot = luax_checkinteger(L, 1);
+ t->remove(slot);
+ return 0;
+ }
+
static int l_getName(lua_State* L)
{
+ Thread* t = checkThread(L);
+ const char* name = t->getName();
+ luax_pushstring(L, name);
return 1;
}
static int l_isRunning(lua_State* L)
{
+ Thread* t = checkThread(L);
+ bool running = t->isRunning();
+ luax_pushboolean(L, running);
return 1;
}
@@ -140,6 +185,7 @@ namespace jin
{ "receive", l_receive },
{ "fetch", l_fetch },
{ "demand", l_demand },
+ { "remove", l_remove },
{ "getName", l_getName },
{ "isRunning", l_isRunning },
{ 0, 0 }
@@ -147,7 +193,7 @@ namespace jin
static int luaopen_Thread(lua_State* L)
{
- luax_newtype(L, TYPE_SOURCE, thread_function);
+ luax_newtype(L, TYPE_THREAD, thread_function);
return 0;
}
@@ -158,14 +204,16 @@ namespace jin
const char* name = luax_checkstring(L, 1);
const char* code = luax_checkstring(L, 2);
Proxy* proxy = (Proxy*)luax_newinstance(L, TYPE_THREAD, sizeof(Proxy));
- Thread* thread = new Thread(name, code, threadRunner);
+ Thread* thread = new Thread(name, code, Thread::threadRunner);
proxy->bind(thread);
return 1;
}
static int l_getThread(lua_State* L)
{
-
+ luax_getglobal(L, MODULE_NAME);
+ luax_getfield(L, -1, "_curThread");
+ return 1;
}
static const luaL_Reg f[] = {
@@ -174,9 +222,13 @@ namespace jin
{ 0, 0 }
};
- static int luaopen_thread(lua_State* L)
+ int luaopen_thread(lua_State* L)
{
+ luaopen_Thread(L);
+
+ luax_newlib(L, f);
+ return 1;
}
}
} \ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index 256f39d..51b100f 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -42,9 +42,9 @@ int main(int argc, char* argv[])
#endif
#undef BUFFER_SIZE
luax_setfield_string(L, "_dir", buffer);
-
// boot
jin::lua::boot(L);
+ luax_close(L);
return 0;
} \ No newline at end of file