myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size) { mythread->batch_count = 0; mythread->batch_first_id = 0; mythread->stream_opt = MyTHREAD_OPT_STOP; mythread->batch_opt = MyTHREAD_OPT_STOP; if(thread_count) { myhtml_status_t status = myhtml_thread_attr_init(mythread); if(status) return status; mythread->pth_list_root = 1; mythread->pth_list_length = 1; mythread->pth_list_size = thread_count + 1; mythread->pth_list = (mythread_list_t*)calloc(mythread->pth_list_size, sizeof(mythread_list_t)); if(mythread->pth_list == NULL) return MyHTML_STATUS_THREAD_ERROR_LIST_INIT; } else { myhtml_thread_attr_clean(mythread); mythread->sys_last_error = 0; mythread->pth_list_root = 1; mythread->pth_list_length = 1; mythread->pth_list_size = 0; mythread->pth_list = NULL; } myhtml_status_t status; mythread->queue_list = mythread_queue_list_create(mythread, 1024, &status); if(mythread->queue_list == NULL) return status; if(sem_prefix) { mythread->sem_prefix_length = strlen(sem_prefix); if(mythread->sem_prefix_length) { mythread->sem_prefix = calloc((mythread->sem_prefix_length + 1), sizeof(char)); if(mythread->sem_prefix == NULL) { mythread->sem_prefix_length = 0; return MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC; } myhtml_string_raw_copy(mythread->sem_prefix, sem_prefix, mythread->sem_prefix_length); } } return MyHTML_STATUS_OK; }
mystatus_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size) { mystatus_t status; myhtml->opt = opt; myhtml_init_marker(myhtml); status = myhtml_tokenizer_state_init(myhtml); if(status) return status; status = myhtml_rules_init(myhtml); #ifdef MyCORE_BUILD_WITHOUT_THREADS myhtml->thread_stream = NULL; myhtml->thread_batch = NULL; myhtml->thread_total = 0; #else /* if undef MyCORE_BUILD_WITHOUT_THREADS */ if(status) return status; switch (opt) { case MyHTML_OPTIONS_PARSE_MODE_SINGLE: if((status = myhtml_create_stream_and_batch(myhtml, 0, 0))) return status; break; case MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE: if((status = myhtml_create_stream_and_batch(myhtml, 1, 0))) return status; myhtml->thread_stream->context = mythread_queue_list_create(&status); status = myhread_entry_create(myhtml->thread_stream, mythread_function_queue_stream, myhtml_parser_worker_stream, MyTHREAD_OPT_STOP); break; default: // default MyHTML_OPTIONS_PARSE_MODE_SEPARATELY if(thread_count < 2) thread_count = 2; if((status = myhtml_create_stream_and_batch(myhtml, 1, (thread_count - 1)))) return status; myhtml->thread_stream->context = mythread_queue_list_create(&status); myhtml->thread_batch->context = myhtml->thread_stream->context; status = myhread_entry_create(myhtml->thread_stream, mythread_function_queue_stream, myhtml_parser_stream, MyTHREAD_OPT_STOP); if(status) return status; for(size_t i = 0; i < myhtml->thread_batch->entries_size; i++) { status = myhread_entry_create(myhtml->thread_batch, mythread_function_queue_batch, myhtml_parser_worker, MyTHREAD_OPT_STOP); if(status) return status; } break; } myhtml->thread_total = thread_count; myhtml->thread_list[0] = myhtml->thread_stream; myhtml->thread_list[1] = myhtml->thread_batch; myhtml->thread_list[2] = NULL; #endif /* if undef MyCORE_BUILD_WITHOUT_THREADS */ if(status) return status; myhtml_clean(myhtml); return status; }