myhtml_status_t myhtml_tag_init(myhtml_tag_t *tags) { tags->context_size = 4096 * 50; tags->context = (myhtml_tag_context_t*)mymalloc(sizeof(myhtml_tag_context_t) * tags->context_size); if(tags->context == NULL) { tags->cache_name = NULL; tags->index_nodes = NULL; return MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION; } tags->cache_name_size = tags->context_size * 12; tags->cache_name = (char*)mymalloc(sizeof(char) * tags->cache_name_size); if(tags->cache_name == NULL) { tags->index_nodes = NULL; return MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION; } tags->tree = mctree_create(32); myhtml_tag_clean(tags); myhtml_tag_init_tags(tags); myhtml_tag_init_tags_categories(tags); tags->index_nodes = mcobject_async_create(); mcobject_async_status_t mcstatus = mcobject_async_init(tags->index_nodes, 128, 4096, sizeof(myhtml_tag_index_node_t)); if(mcstatus != MCOBJECT_ASYNC_STATUS_OK) return MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE; return MyHTML_STATUS_OK; }
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->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; }