|
@@ -2959,38 +2959,58 @@ const char *STD[][2] = {
|
|
|
" },\n"
|
|
|
" is_joined: func (this): this._thread.joined\n"
|
|
|
"})\n"
|
|
|
- "func Lock(acquired=false) {\n"
|
|
|
- " inline `void *lock = qi_lock_create()`\n"
|
|
|
- " inline `if (!lock) qi_throw_format(state, \"lock init failed\")`\n"
|
|
|
- " inline `qi_decl(state, \"lock\", qi_make_data(state, 'L', lock))`\n"
|
|
|
- " var l = Object({\n"
|
|
|
+ "func Mutex() {\n"
|
|
|
+ " inline `void *mutex = qi_mutex_create()`\n"
|
|
|
+ " inline `if (!mutex) qi_throw_format(state, \"mutex init failed\")`\n"
|
|
|
+ " inline `qi_decl(state, \"mutex\", qi_make_data(state, 'M', mutex))`\n"
|
|
|
+ " return Object({\n"
|
|
|
" __fin: func (this) {\n"
|
|
|
- " var lock = this._lock\n"
|
|
|
- " this._lock = nil\n"
|
|
|
- " inline `qi_lock_destroy(qi_get_data(state, 'L', qi_get(state, \"lock\")))`\n"
|
|
|
+ " mutex = this._mutex\n"
|
|
|
+ " this._mutex = nil\n"
|
|
|
+ " inline `qi_mutex_destroy(qi_get_data(state, 'M', qi_get(state, \"mutex\")))`\n"
|
|
|
" },\n"
|
|
|
- " __str: func (this): \"<Lock>\",\n"
|
|
|
- " _lock: lock,\n"
|
|
|
- " acquired: func (this) {\n"
|
|
|
- " var lock = this._lock\n"
|
|
|
- " inline `return qi_make_boolean(state, qi_lock_acquired(qi_get_data(state, 'L', qi_get(state, \"lock\"))))`\n"
|
|
|
+ " __str: func (this): \"<Mutex>\",\n"
|
|
|
+ " _mutex: mutex,\n"
|
|
|
+ " lock: func (this) {\n"
|
|
|
+ " var mutex = this._mutex\n"
|
|
|
+ " inline `qi_mutex_lock(qi_get_data(state, 'M', qi_get(state, \"mutex\")))`\n"
|
|
|
" },\n"
|
|
|
- " acquire: func (this) {\n"
|
|
|
- " var lock = this._lock\n"
|
|
|
- " inline `qi_lock_acquire(qi_get_data(state, 'L', qi_get(state, \"lock\")))`\n"
|
|
|
+ " trylock: func (this) {\n"
|
|
|
+ " var mutex = this._mutex\n"
|
|
|
+ " inline `return qi_make_boolean(state, qi_mutex_trylock(qi_get_data(state, 'M', qi_get(state, \"mutex\"))))`\n"
|
|
|
" },\n"
|
|
|
- " tryacquire: func (this) {\n"
|
|
|
- " var lock = this._lock\n"
|
|
|
- " inline `return qi_make_boolean(state, qi_lock_tryacquire(qi_get_data(state, 'L', qi_get(state, \"lock\"))))`\n"
|
|
|
+ " unlock: func (this) {\n"
|
|
|
+ " var mutex = this._mutex\n"
|
|
|
+ " inline `qi_mutex_unlock(qi_get_data(state, 'M', qi_get(state, \"mutex\")))`\n"
|
|
|
+ " }\n"
|
|
|
+ " })\n"
|
|
|
+ "}\n"
|
|
|
+ "func Cond() {\n"
|
|
|
+ " inline `void *cond = qi_cond_create()`\n"
|
|
|
+ " inline `if (!cond) qi_throw_format(state, \"cond init failed\")`\n"
|
|
|
+ " inline `qi_decl(state, \"cond\", qi_make_data(state, 'C', cond))`\n"
|
|
|
+ " return Object({\n"
|
|
|
+ " __fin: func (this) {\n"
|
|
|
+ " cond = this._cond\n"
|
|
|
+ " this._cond = nil\n"
|
|
|
+ " inline `qi_cond_destroy(qi_get_data(state, 'C', qi_get(state, \"cond\")))`\n"
|
|
|
+ " },\n"
|
|
|
+ " __str: func (this): \"<Cond>\",\n"
|
|
|
+ " _cond: cond,\n"
|
|
|
+ " wait: func (this, mutex) {\n"
|
|
|
+ " var cond = this._cond\n"
|
|
|
+ " mutex = mutex._mutex\n"
|
|
|
+ " inline `qi_cond_wait(qi_get_data(state, 'C', qi_get(state, \"cond\")), qi_get_data(state, 'M', qi_get(state, \"mutex\")))`\n"
|
|
|
" },\n"
|
|
|
- " release: func (this) {\n"
|
|
|
- " var lock = this._lock\n"
|
|
|
- " inline `qi_lock_release(qi_get_data(state, 'L', qi_get(state, \"lock\")))`\n"
|
|
|
+ " signal: func (this) {\n"
|
|
|
+ " var cond = this._cond\n"
|
|
|
+ " inline `qi_cond_signal(qi_get_data(state, 'C', qi_get(state, \"cond\")))`\n"
|
|
|
+ " },\n"
|
|
|
+ " broadcast: func (this) {\n"
|
|
|
+ " var cond = this._cond\n"
|
|
|
+ " inline `qi_cond_broadcast(qi_get_data(state, 'C', qi_get(state, \"cond\")))`\n"
|
|
|
" }\n"
|
|
|
" })\n"
|
|
|
- " if acquired\n"
|
|
|
- " l.acquire()\n"
|
|
|
- " return l\n"
|
|
|
"}\n"
|
|
|
"func thread_exit(ret=nil)\n"
|
|
|
" inline `qi_thread_exit(state, qi_get(state, \"ret\"))`\n"
|