mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status) { mythread_queue_list_t *queue_list = mythread->queue_list; if(status) *status = MyHTML_STATUS_OK; mythread_queue_list_entry_t* entry = (mythread_queue_list_entry_t*)mycalloc(1, sizeof(mythread_queue_list_entry_t)); if(entry == NULL) { if(status) *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; return NULL; } entry->thread_param = (mythread_queue_thread_param_t*)mycalloc(mythread->pth_list_size, sizeof(mythread_queue_thread_param_t)); if(entry->thread_param == NULL) { free(entry); if(status) *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; return NULL; } size_t idx; for (idx = mythread->batch_first_id; idx < (mythread->batch_first_id + mythread->batch_count); idx++) { entry->thread_param[idx].use = mythread->pth_list[idx].data.t_count; } entry->queue = queue; if(mythread->stream_opt == MyTHREAD_OPT_UNDEF) { mythread_suspend_all(mythread); } else if(mythread->stream_opt == MyTHREAD_OPT_STOP) { mythread_stop_all(mythread); } if(queue_list->first) { queue_list->last->next = entry; entry->prev = queue_list->last; queue_list->last = entry; } else { queue_list->first = entry; queue_list->last = entry; } queue_list->count++; if(mythread->stream_opt != MyTHREAD_OPT_STOP) mythread_resume_all(mythread); return entry; }
mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy) { if(mythread == NULL) return NULL; #ifndef MyHTML_BUILD_WITHOUT_THREADS myhtml_thread_attr_destroy(mythread); if(mythread->pth_list) { mythread_resume_all(mythread); mythread_stream_quit_all(mythread); mythread_batch_quit_all(mythread); mythread_wait_all_for_done(mythread); for (size_t i = mythread->pth_list_root; i < mythread->pth_list_length; i++) { myhtml_thread_join(mythread, &mythread->pth_list[i]); } free(mythread->pth_list); mythread->pth_list = NULL; } if(mythread->queue_list) { free(mythread->queue_list); } if(mythread->sem_prefix) { free(mythread->sem_prefix); mythread->sem_prefix = NULL; mythread->sem_prefix_length = 0; } #endif /* MyHTML_BUILD_WITHOUT_THREADS */ if(self_destroy) { free(mythread); return NULL; } return mythread; }
mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy) { if(mythread == NULL) return NULL; myhtml_thread_attr_destroy(mythread); if(mythread->pth_list) { mythread_resume_all(mythread); mythread_stream_quit_all(mythread); mythread_batch_quit_all(mythread); mythread_wait_all(mythread); for (size_t i = mythread->pth_list_root; i < mythread->pth_list_length; i++) { myhtml_thread_join(mythread, &mythread->pth_list[i]); if(mythread->pth_list[i].data.sem_name) { free(mythread->pth_list[i].data.sem_name); } } free(mythread->pth_list); mythread->pth_list = NULL; } if(mythread->sem_prefix) { free(mythread->sem_prefix); mythread->sem_prefix = NULL; mythread->sem_prefix_length = 0; } if(mythread->queue) mythread_queue_destroy(mythread->queue); if(self_destroy) { free(mythread); return NULL; } return mythread; }
mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue) { mythread_queue_list_t *queue_list = mythread->queue_list; mythread_queue_list_entry_t *next = entry->next; mythread_queue_list_entry_t *prev = entry->prev; if(mythread->stream_opt == MyTHREAD_OPT_UNDEF) { mythread_suspend_all(mythread); } else if(mythread->stream_opt == MyTHREAD_OPT_STOP) { mythread_stop_all(mythread); } if(prev) prev->next = next; if(next) next->prev = prev; if(queue_list->first == entry) queue_list->first = next; if(queue_list->last == entry) queue_list->last = prev; if(mythread->stream_opt != MyTHREAD_OPT_STOP) mythread_resume_all(mythread); if(destroy_queue && entry->queue) mythread_queue_destroy(entry->queue); if(entry->thread_param) free(entry->thread_param); free(entry); queue_list->count--; return NULL; }