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; }
myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size) { myhtml_status_t status; myhtml->async_incoming_buf = mcobject_async_create(); if(myhtml->async_incoming_buf == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; mcobject_async_status_t mcstatus = mcobject_async_init(myhtml->async_incoming_buf, 32, 1024, sizeof(myhtml_incoming_buf_t)); if(mcstatus != MCOBJECT_ASYNC_STATUS_OK) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; myhtml->tags = myhtml_tag_create(); if(myhtml->tags == NULL) { myhtml->parse_state_func = NULL; myhtml->insertion_func = NULL; myhtml->thread = NULL; return MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION; } status = myhtml_tag_init(myhtml->tags); if(status) { myhtml->parse_state_func = NULL; myhtml->insertion_func = NULL; myhtml->thread = NULL; return status; } status = myhtml_tokenizer_state_init(myhtml); if(status) { myhtml->insertion_func = NULL; myhtml->thread = NULL; return status; } status = myhtml_rules_init(myhtml); if(status) { myhtml->thread = NULL; return status; } myhtml->opt = opt; myhtml->thread = mythread_create(); switch (opt) { case MyHTML_OPTIONS_PARSE_MODE_SINGLE: status = mythread_init(myhtml->thread, "lastmac", 0, queue_size); if(status) return status; break; case MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE: status = mythread_init(myhtml->thread, "lastmac", 1, queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_worker_index_stream, &status); break; case MyHTML_OPTIONS_PARSE_MODE_WORKER_TREE: status = mythread_init(myhtml->thread, "lastmac", 2, queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_index, &status); myhread_create_stream(myhtml->thread, myhtml_parser_worker_stream, &status); break; case MyHTML_OPTIONS_PARSE_MODE_WORKER_INDEX: status = mythread_init(myhtml->thread, "lastmac", 2, queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_worker_index, &status); myhread_create_stream(myhtml->thread, myhtml_parser_stream, &status); break; case MyHTML_OPTIONS_PARSE_MODE_TREE_INDEX: if(thread_count == 0) thread_count = 1; status = mythread_init(myhtml->thread, "lastmac", (thread_count + 1), queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_stream_index, &status); myhread_create_batch(myhtml->thread, myhtml_parser_worker, &status, thread_count); break; default: // default MyHTML_OPTIONS_PARSE_MODE_SEPARATELY if(thread_count == 0) thread_count = 1; status = mythread_init(myhtml->thread, "lastmac", (thread_count + 2), queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_index, &status); myhread_create_stream(myhtml->thread, myhtml_parser_stream, &status); myhread_create_batch(myhtml->thread, myhtml_parser_worker, &status, thread_count); break; } myhtml_clean(myhtml); return status; }
myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size) { myhtml_status_t status; myhtml_init_marker(myhtml); myhtml->async_incoming_buf = mcobject_async_create(); if(myhtml->async_incoming_buf == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; mcobject_async_status_t mcstatus = mcobject_async_init(myhtml->async_incoming_buf, 32, 1024, sizeof(myhtml_incoming_buffer_t)); if(mcstatus != MCOBJECT_ASYNC_STATUS_OK) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; // for tags node and other myhtml->mchar = mchar_async_create(64, 4096); myhtml->tag_index = mcobject_async_create(); mcstatus = mcobject_async_init(myhtml->tag_index, 128, 1024, sizeof(myhtml_tag_index_node_t)); if(mcstatus != MCOBJECT_ASYNC_STATUS_OK) return MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE; status = myhtml_tokenizer_state_init(myhtml); if(status) { myhtml->insertion_func = NULL; myhtml->thread = NULL; return status; } status = myhtml_rules_init(myhtml); if(status) { myhtml->thread = NULL; return status; } myhtml->opt = opt; myhtml->thread = mythread_create(); #ifdef MyHTML_BUILD_WITHOUT_THREADS status = mythread_init(myhtml->thread, NULL, thread_count, queue_size); if(status) return status; #else /* MyHTML_BUILD_WITHOUT_THREADS */ switch (opt) { case MyHTML_OPTIONS_PARSE_MODE_SINGLE: status = mythread_init(myhtml->thread, "lastmac", 0, queue_size); if(status) return status; break; case MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE: status = mythread_init(myhtml->thread, "lastmac", 1, queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_worker_index_stream, &status); break; case MyHTML_OPTIONS_PARSE_MODE_WORKER_TREE: status = mythread_init(myhtml->thread, "lastmac", 2, queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_index, &status); myhread_create_stream(myhtml->thread, myhtml_parser_worker_stream, &status); break; case MyHTML_OPTIONS_PARSE_MODE_WORKER_INDEX: status = mythread_init(myhtml->thread, "lastmac", 2, queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_worker_index, &status); myhread_create_stream(myhtml->thread, myhtml_parser_stream, &status); break; case MyHTML_OPTIONS_PARSE_MODE_TREE_INDEX: if(thread_count == 0) thread_count = 1; status = mythread_init(myhtml->thread, "lastmac", (thread_count + 1), queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_stream_index, &status); myhread_create_batch(myhtml->thread, myhtml_parser_worker, &status, thread_count); break; default: // default MyHTML_OPTIONS_PARSE_MODE_SEPARATELY if(thread_count == 0) thread_count = 1; status = mythread_init(myhtml->thread, "lastmac", (thread_count + 2), queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_index, &status); myhread_create_stream(myhtml->thread, myhtml_parser_stream, &status); myhread_create_batch(myhtml->thread, myhtml_parser_worker, &status, thread_count); break; } #endif /* MyHTML_BUILD_WITHOUT_THREADS */ myhtml_clean(myhtml); return status; }
myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size) { myhtml_status_t status; myhtml_init_marker(myhtml); status = myhtml_tokenizer_state_init(myhtml); if(status) { myhtml->insertion_func = NULL; myhtml->thread = NULL; return status; } status = myhtml_rules_init(myhtml); if(status) { myhtml->thread = NULL; return status; } myhtml->opt = opt; myhtml->thread = mythread_create(); #ifdef MyHTML_BUILD_WITHOUT_THREADS status = mythread_init(myhtml->thread, NULL, thread_count, queue_size); if(status) return status; #else /* MyHTML_BUILD_WITHOUT_THREADS */ switch (opt) { case MyHTML_OPTIONS_PARSE_MODE_SINGLE: status = mythread_init(myhtml->thread, "lastmac", 0, queue_size); if(status) return status; break; case MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE: status = mythread_init(myhtml->thread, "lastmac", 1, queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_worker_stream, &status); break; default: // default MyHTML_OPTIONS_PARSE_MODE_SEPARATELY if(thread_count == 0) thread_count = 1; status = mythread_init(myhtml->thread, "lastmac", (thread_count + 1), queue_size); if(status) return status; myhread_create_stream(myhtml->thread, myhtml_parser_stream, &status); myhread_create_batch(myhtml->thread, myhtml_parser_worker, &status, thread_count); break; } #endif /* MyHTML_BUILD_WITHOUT_THREADS */ myhtml_clean(myhtml); return status; }