FS-10167 track joins and only do them once

This commit is contained in:
Anthony Minessale 2017-03-27 13:06:43 -05:00
parent 52f1451ece
commit 020f80b8d2
3 changed files with 10 additions and 0 deletions

View File

@ -78,6 +78,7 @@ struct ks_thread {
ks_thread_state_t state; ks_thread_state_t state;
uint8_t priority; uint8_t priority;
void *return_data; void *return_data;
uint8_t joined;
}; };
typedef enum { typedef enum {

View File

@ -89,6 +89,7 @@ KS_BEGIN_EXTERN_C
KS_STATUS_GENERR, KS_STATUS_GENERR,
KS_STATUS_INACTIVE, KS_STATUS_INACTIVE,
KS_STATUS_TIMEOUT, KS_STATUS_TIMEOUT,
KS_STATUS_DUPLICATE_OPERATION,
/* Memory pool errors */ /* Memory pool errors */
KS_STATUS_REFS_EXIST, /* references exist */ KS_STATUS_REFS_EXIST, /* references exist */
KS_STATUS_ARG_NULL, /* function argument is null */ KS_STATUS_ARG_NULL, /* function argument is null */

View File

@ -197,12 +197,20 @@ KS_DECLARE(uint8_t) ks_thread_priority(ks_thread_t *thread) {
} }
KS_DECLARE(ks_status_t) ks_thread_join(ks_thread_t *thread) { KS_DECLARE(ks_status_t) ks_thread_join(ks_thread_t *thread) {
if (thread->joined) {
return KS_STATUS_DUPLICATE_OPERATION;
}
#ifdef WIN32 #ifdef WIN32
WaitForSingleObject(thread->handle, INFINITE); WaitForSingleObject(thread->handle, INFINITE);
#else #else
void *ret; void *ret;
pthread_join(thread->handle, &ret); pthread_join(thread->handle, &ret);
#endif #endif
thread->joined++;
return KS_STATUS_SUCCESS; return KS_STATUS_SUCCESS;
} }