mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, const char* text, size_t begin, size_t limit, myhtml_status_t *status) { queue->nodes_length++; if(queue->nodes_uses >= limit) { queue->nodes_uses++; mythread_wait_all_for_done(mythread); queue->nodes_length = 0; queue->nodes_pos = 0; queue->nodes_root = 0; queue->nodes_uses = 0; } else if(queue->nodes_length >= queue->nodes_size) { queue->nodes_pos++; if(queue->nodes_pos >= queue->nodes_pos_size) { mythread_wait_all_for_done(mythread); queue->nodes_pos_size <<= 1; mythread_queue_node_t** tmp = realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); if(tmp) { memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (queue->nodes_pos_size - queue->nodes_pos)); queue->nodes = tmp; } else { if(status) *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; return NULL; } } if(queue->nodes[queue->nodes_pos] == NULL) { queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); if(queue->nodes[queue->nodes_pos] == NULL) { if(status) *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; return NULL; } } queue->nodes_length = 0; } queue->nodes_uses++; mythread_queue_node_t *qnode = &queue->nodes[queue->nodes_pos][queue->nodes_length]; qnode->text = text; qnode->begin = begin; return qnode; }
mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, myhtml_status_t *status) { queue->nodes_length++; if(queue->nodes_length >= queue->nodes_size) { queue->nodes_pos++; if(queue->nodes_pos >= queue->nodes_pos_size) { mythread_wait_all_for_done(mythread); queue->nodes_pos_size <<= 1; mythread_queue_node_t** tmp = myhtml_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); if(tmp) { memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (queue->nodes_pos_size - queue->nodes_pos)); queue->nodes = tmp; } else { if(status) *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; return NULL; } } if(queue->nodes[queue->nodes_pos] == NULL) { queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)myhtml_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); if(queue->nodes[queue->nodes_pos] == NULL) { if(status) *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; return NULL; } } queue->nodes_length = 0; } queue->nodes_uses++; return &queue->nodes[queue->nodes_pos][queue->nodes_length]; }
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; }