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; }