sq_osthreads.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #include "squirrel.h"
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include "sqstdblobimpl.h"
  6. SQ_OPT_STRING_STRLEN();
  7. #include "ThreadObjectThreadClass.h"
  8. static const SQChar *ThreadMutexObject_TAG = _SC("ThreadMutexObject");
  9. #define GET_thread_mutex_INSTANCE_AT(idx) \
  10. CMutexClass *self=NULL; \
  11. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)&self,(void*)ThreadMutexObject_TAG)) < 0) return _rc_;
  12. #define GET_thread_mutex_INSTANCE() GET_thread_mutex_INSTANCE_AT(1)
  13. static SQRESULT sq_thread_mutex_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v){
  14. CMutexClass *self = ((CMutexClass *)p);
  15. if (self) delete self;
  16. return 0;
  17. }
  18. static SQRESULT sq_thread_mutex_constructor(HSQUIRRELVM v){
  19. CMutexClass *self = new CMutexClass();
  20. sq_setinstanceup(v, 1, self);
  21. sq_setreleasehook(v, 1, sq_thread_mutex_releasehook);
  22. return 1;
  23. }
  24. static SQRESULT sq_thread_mutex_lock(HSQUIRRELVM v){
  25. SQ_FUNC_VARS_NO_TOP(v);
  26. GET_thread_mutex_INSTANCE();
  27. self->Lock();
  28. return 0;
  29. }
  30. static SQRESULT sq_thread_mutex_unlock(HSQUIRRELVM v){
  31. SQ_FUNC_VARS_NO_TOP(v);
  32. GET_thread_mutex_INSTANCE();
  33. self->Unlock();
  34. return 0;
  35. }
  36. #define _DECL_FUNC(name,nparams,tycheck,isStatic) {_SC(#name), sq_thread_mutex_##name,nparams,tycheck,isStatic}
  37. static SQRegFunction sq_thread_mutex_methods[] =
  38. {
  39. _DECL_FUNC(constructor, 1, _SC("x"), SQFalse),
  40. _DECL_FUNC(lock, 1, _SC("x"), SQFalse),
  41. _DECL_FUNC(unlock, 1, _SC("x"), SQFalse),
  42. {0,0}
  43. };
  44. #undef _DECL_FUNC
  45. static const SQChar *ThreadEventObject_TAG = _SC("ThreadEventObject");
  46. #define GET_thread_event_INSTANCE_AT(idx) \
  47. CEventClass *self=NULL; \
  48. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)&self,(void*)ThreadEventObject_TAG)) < 0) return _rc_;
  49. #define GET_thread_event_INSTANCE() GET_thread_event_INSTANCE_AT(1)
  50. static SQRESULT sq_thread_event_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v){
  51. CEventClass *self = ((CEventClass *)p);
  52. if (self) delete self;
  53. return 0;
  54. }
  55. static SQRESULT sq_thread_event_constructor(HSQUIRRELVM v){
  56. CEventClass *self = new CEventClass();
  57. sq_setinstanceup(v, 1, self);
  58. sq_setreleasehook(v, 1, sq_thread_event_releasehook);
  59. return 1;
  60. }
  61. static SQRESULT sq_thread_event_set(HSQUIRRELVM v){
  62. SQ_FUNC_VARS_NO_TOP(v);
  63. GET_thread_event_INSTANCE();
  64. self->Set();
  65. return 0;
  66. }
  67. static SQRESULT sq_thread_event_reset(HSQUIRRELVM v){
  68. SQ_FUNC_VARS_NO_TOP(v);
  69. GET_thread_event_INSTANCE();
  70. self->Reset();
  71. return 0;
  72. }
  73. static SQRESULT sq_thread_event_wait(HSQUIRRELVM v){
  74. SQ_FUNC_VARS_NO_TOP(v);
  75. GET_thread_event_INSTANCE();
  76. sq_pushbool(v, self->Wait());
  77. return 1;
  78. }
  79. #define _DECL_FUNC(name,nparams,tycheck,isStatic) {_SC(#name), sq_thread_event_##name,nparams,tycheck,isStatic}
  80. static SQRegFunction sq_thread_event_methods[] =
  81. {
  82. _DECL_FUNC(constructor, 1, _SC("x"), SQFalse),
  83. _DECL_FUNC(set, 1, _SC("x"), SQFalse),
  84. _DECL_FUNC(reset, 1, _SC("x"), SQFalse),
  85. _DECL_FUNC(wait, 1, _SC("x"), SQFalse),
  86. {0,0}
  87. };
  88. #undef _DECL_FUNC
  89. class SQ_Task : public CTask {
  90. public:
  91. SQ_Task():CTask(){}
  92. BOOL Task(){}
  93. };
  94. static const SQChar *ThreadTaskObject_TAG = _SC("ThreadTaskObject");
  95. #define GET_thread_task_INSTANCE_AT(idx) \
  96. SQ_Task *self=NULL; \
  97. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)&self,(void*)ThreadTaskObject_TAG)) < 0) return _rc_;
  98. #define GET_thread_task_INSTANCE() GET_thread_task_INSTANCE_AT(1)
  99. static SQRESULT sq_thread_task_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v){
  100. SQ_Task *self = ((SQ_Task *)p);
  101. if (self) delete self;
  102. return 0;
  103. }
  104. static SQRESULT sq_thread_task_constructor(HSQUIRRELVM v){
  105. SQ_Task *self = new SQ_Task();
  106. sq_setinstanceup(v, 1, self);
  107. sq_setreleasehook(v, 1, sq_thread_task_releasehook);
  108. return 1;
  109. }
  110. static SQRESULT sq_thread_task_status(HSQUIRRELVM v){
  111. SQ_FUNC_VARS(v);
  112. GET_thread_task_INSTANCE();
  113. if(_top_ > 1){
  114. SQ_GET_INTEGER(v, 2, state);
  115. self->SetTaskStatus((TaskStatus_t)state);
  116. return 0;
  117. }
  118. sq_pushinteger(v, self->Status());
  119. return 1;
  120. }
  121. static SQRESULT sq_thread_task_id(HSQUIRRELVM v){
  122. SQ_FUNC_VARS(v);
  123. GET_thread_task_INSTANCE();
  124. if(_top_ > 1){
  125. SQ_GET_USERPOINTER(v, 2, pid);
  126. self->SetId((ThreadId_t*)pid);
  127. return 0;
  128. }
  129. ThreadId_t pId;
  130. self->Thread(&pId);
  131. sq_pushuserpointer(v, pId);
  132. return 1;
  133. }
  134. static SQRESULT sq_thread_task_wait(HSQUIRRELVM v){
  135. SQ_FUNC_VARS_NO_TOP(v);
  136. GET_thread_task_INSTANCE();
  137. SQ_GET_INTEGER(v, 2, timeoutSeconds);
  138. sq_pushbool(v, self->Wait(timeoutSeconds));
  139. return 1;
  140. }
  141. #define _DECL_FUNC(name,nparams,tycheck,isStatic) {_SC(#name), sq_thread_task_##name,nparams,tycheck,isStatic}
  142. static SQRegFunction sq_thread_task_methods[] =
  143. {
  144. _DECL_FUNC(constructor, 1, _SC("x"), SQFalse),
  145. _DECL_FUNC(status, -1, _SC("xi"), SQFalse),
  146. _DECL_FUNC(id, -1, _SC("xp"), SQFalse),
  147. _DECL_FUNC(wait, 2, _SC("xn"), SQFalse),
  148. {0,0}
  149. };
  150. #undef _DECL_FUNC
  151. static const SQChar *ThreadObject_TAG = _SC("ThreadObject");
  152. #define GET_thread_INSTANCE_AT(idx) \
  153. CThread *self=NULL; \
  154. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)&self,(void*)ThreadObject_TAG)) < 0) return _rc_;
  155. #define GET_thread_INSTANCE() GET_thread_INSTANCE_AT(1)
  156. static SQRESULT sq_thread_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v){
  157. CThread *self = ((CThread *)p);
  158. if (self) delete self;
  159. return 0;
  160. }
  161. static SQRESULT sq_thread_constructor(HSQUIRRELVM v){
  162. CThread *self = new CThread();
  163. sq_setinstanceup(v, 1, self);
  164. sq_setreleasehook(v, 1, sq_thread_releasehook);
  165. return 1;
  166. }
  167. static SQRESULT sq_thread_on_task(HSQUIRRELVM v){
  168. SQ_FUNC_VARS(v);
  169. GET_thread_INSTANCE();
  170. if(_top_ > 1){
  171. SQ_GET_USERPOINTER(v, 2, lpvData);
  172. self->OnTask(lpvData);
  173. }
  174. else self->OnTask();
  175. return 0;
  176. }
  177. static SQRESULT sq_thread_id(HSQUIRRELVM v){
  178. SQ_FUNC_VARS_NO_TOP(v);
  179. sq_pushuserpointer(v, CThread::ThreadId());
  180. return 1;
  181. }
  182. static SQRESULT sq_thread_from_same_thread(HSQUIRRELVM v){
  183. SQ_FUNC_VARS_NO_TOP(v);
  184. GET_thread_INSTANCE();
  185. sq_pushbool(v, self->FromSameThread());
  186. return 1;
  187. }
  188. static SQRESULT sq_thread_percent_capacity(HSQUIRRELVM v){
  189. SQ_FUNC_VARS_NO_TOP(v);
  190. GET_thread_INSTANCE();
  191. sq_pushfloat(v, self->PercentCapacity());
  192. return 1;
  193. }
  194. static SQRESULT sq_thread_wait_till_exit(HSQUIRRELVM v){
  195. SQ_FUNC_VARS_NO_TOP(v);
  196. GET_thread_INSTANCE();
  197. self->WaitTillExit();
  198. return 0;
  199. }
  200. static SQRESULT sq_thread_kernel_process(HSQUIRRELVM v){
  201. SQ_FUNC_VARS_NO_TOP(v);
  202. GET_thread_INSTANCE();
  203. sq_pushbool(v, self->KernelProcess());
  204. return 1;
  205. }
  206. static SQRESULT sq_thread_event(HSQUIRRELVM v){
  207. SQ_FUNC_VARS(v);
  208. GET_thread_INSTANCE();
  209. SQ_GET_USERPOINTER(v, 2, lpvData);
  210. sq_pushbool(v, self->Event(lpvData));
  211. return 1;
  212. }
  213. static SQRESULT sq_thread_set_on_stop_timeout(HSQUIRRELVM v){
  214. SQ_FUNC_VARS(v);
  215. GET_thread_INSTANCE();
  216. SQ_GET_INTEGER(v, 2, seconds);
  217. self->SetOnStopTimeout(seconds);
  218. return 0;
  219. }
  220. static SQRESULT sq_thread_set_queue_size(HSQUIRRELVM v){
  221. SQ_FUNC_VARS(v);
  222. GET_thread_INSTANCE();
  223. SQ_GET_INTEGER(v, 2, size);
  224. sq_pushbool(v, self->SetQueueSize(size));
  225. return 1;
  226. }
  227. static SQRESULT sq_thread_start(HSQUIRRELVM v){
  228. SQ_FUNC_VARS(v);
  229. GET_thread_INSTANCE();
  230. sq_pushbool(v, self->Start());
  231. return 1;
  232. }
  233. static SQRESULT sq_thread_stop(HSQUIRRELVM v){
  234. SQ_FUNC_VARS(v);
  235. GET_thread_INSTANCE();
  236. sq_pushbool(v, self->Stop());
  237. return 1;
  238. }
  239. #define _DECL_FUNC(name,nparams,tycheck,isStatic) {_SC(#name), sq_thread_##name,nparams,tycheck,isStatic}
  240. static SQRegFunction sq_thread_methods[] =
  241. {
  242. _DECL_FUNC(constructor, 1, _SC("x"), SQFalse),
  243. _DECL_FUNC(on_task, -1, _SC("xi"), SQFalse),
  244. _DECL_FUNC(id, 1, _SC("y"), SQTrue),
  245. _DECL_FUNC(from_same_thread, 1, _SC("x"), SQFalse),
  246. _DECL_FUNC(percent_capacity, 1, _SC("x"), SQFalse),
  247. _DECL_FUNC(wait_till_exit, 1, _SC("x"), SQFalse),
  248. _DECL_FUNC(kernel_process, 1, _SC("x"), SQFalse),
  249. _DECL_FUNC(event, 2, _SC("x."), SQFalse),
  250. _DECL_FUNC(set_on_stop_timeout, 2, _SC("xn"), SQFalse),
  251. _DECL_FUNC(set_queue_size, 2, _SC("xi"), SQFalse),
  252. _DECL_FUNC(start, 1, _SC("x"), SQFalse),
  253. _DECL_FUNC(stop, 1, _SC("x"), SQFalse),
  254. {0,0}
  255. };
  256. #undef _DECL_FUNC
  257. #ifdef __cplusplus
  258. extern "C" {
  259. #endif
  260. SQRESULT sqext_register_ThreadObjects(HSQUIRRELVM v)
  261. {
  262. sq_pushstring(v,ThreadMutexObject_TAG,-1);
  263. sq_newclass(v,SQFalse);
  264. sq_settypetag(v,-1,(void*)ThreadMutexObject_TAG);
  265. sq_insert_reg_funcs(v, sq_thread_mutex_methods);
  266. sq_newslot(v,-3,SQTrue);
  267. sq_pushstring(v,ThreadEventObject_TAG,-1);
  268. sq_newclass(v,SQFalse);
  269. sq_settypetag(v,-1,(void*)ThreadEventObject_TAG);
  270. sq_insert_reg_funcs(v, sq_thread_event_methods);
  271. sq_pushstring(v,ThreadTaskObject_TAG,-1);
  272. sq_newclass(v,SQFalse);
  273. sq_settypetag(v,-1,(void*)ThreadTaskObject_TAG);
  274. sq_insert_reg_funcs(v, sq_thread_task_methods);
  275. sq_pushstring(v,ThreadObject_TAG,-1);
  276. sq_newclass(v,SQFalse);
  277. sq_settypetag(v,-1,(void*)ThreadObject_TAG);
  278. sq_insert_reg_funcs(v, sq_thread_methods);
  279. return 0;
  280. }
  281. #ifdef __cplusplus
  282. }
  283. #endif