void test1() { sc_uint idx = 0; sc_addr id, id2; sc_uint32 count = 0; printf("Element size: %d bytes\n", sizeof(sc_element)); printf("Segment size: %d elements\n", SEGMENT_SIZE); timer = g_timer_new(); print_storage_statistics(); printf("--- Node creation ---\n"); g_timer_start(timer); for (idx = 0; idx < nodes_append_count; idx++) { id = sc_storage_element_new(sc_type_node); //g_printf("uri: %d\t%d\n", uri.seg, uri.id); } g_timer_stop(timer); printf("Time: %f s\n", g_timer_elapsed(timer, 0)); printf("Nodes per second: %f\n", (float)nodes_append_count / g_timer_elapsed(timer, 0)); printf("Segments count: %d\n", sc_storage_get_segments_count()); print_storage_statistics(); g_timer_reset(timer); printf("--- Node segmentation ---\n"); count = 0; printf("Prepare test...\n"); for (idx = 1; idx < nodes_remove_count + 1; idx++) { if (idx % 10 < 5) { id.seg = idx / SEGMENT_SIZE; id.offset = idx % SEGMENT_SIZE; /*do { id = get_random_addr(sc_type_node); } while(!sc_storage_is_element(id) && is_sc_addr_in_segment_node_vector(id));*/ if (sc_storage_is_element(id)) segment_node_del.push_back(id); } } printf("Run test...\n"); g_timer_start(timer); sc_uint32 n = segment_node_del.size(); for (sc_uint32 i = 0; i < n; ++i) sc_storage_element_free(segment_node_del[i]); n = nodes_remove_count - n; for (sc_uint32 i = 0; i < n; i++) sc_storage_node_new(0); g_timer_stop(timer); segment_node_del.clear(); printf("Time: %f s\n", g_timer_elapsed(timer, 0)); printf("Elements per second: %f\n", (float)nodes_remove_count / g_timer_elapsed(timer, 0)); printf("Segments count: %d\n", sc_storage_get_segments_count()); printf("Element free calls: %u\n", segment_node_del.size()); print_storage_statistics(); g_timer_reset(timer); printf("--- Arcs creation ---\n"); count = 0; printf("Prepare...\n"); for (idx = 0; idx < arcs_append_count; idx++) { do { id = get_random_addr(0); }while (!sc_storage_is_element(id)); do { id2 = get_random_addr(0); }while (!sc_storage_is_element(id2)); arc_creation_vector.push_back(id); arc_creation_vector.push_back(id2); } printf("Run...\n"); g_timer_start(timer); n = arc_creation_vector.size() / 2; for (sc_uint32 i = 0; i < n; ++i) { sc_storage_arc_new(sc_type_arc_common, arc_creation_vector[i], arc_creation_vector[i + n]); } g_timer_stop(timer); printf("Timer: %fs\n", g_timer_elapsed(timer, 0)); printf("Arcs per second: %f\n", (float)n / g_timer_elapsed(timer, 0)); printf("Segments count: %d\n", sc_storage_get_segments_count()); print_storage_statistics(); g_timer_destroy(timer); }
sc_result sc_storage_element_free(sc_addr addr) { sc_element *el, *el2; sc_addr _addr; sc_uint addr_int; GSList *remove_list = 0; el = el2 = 0; if (sc_storage_is_element(addr) == SC_FALSE) return SC_RESULT_ERROR; if (sc_iterator_has_any_timestamp()) storage_time_stamp++; remove_list = g_slist_append(remove_list, GUINT_TO_POINTER(SC_ADDR_LOCAL_TO_INT(addr))); while (remove_list != 0) { // get sc-addr for removing addr_int = GPOINTER_TO_UINT(remove_list->data); _addr.seg = SC_ADDR_LOCAL_SEG_FROM_INT(addr_int); _addr.offset = SC_ADDR_LOCAL_OFFSET_FROM_INT(addr_int); // go to next sc-addr in list remove_list = g_slist_delete_link(remove_list, remove_list); el = sc_storage_get_element(_addr, SC_TRUE); g_assert(el != 0 && el->type != 0); // remove registered events before deletion sc_event_notify_element_deleted(_addr); el->delete_time_stamp = storage_time_stamp; if (el->type & sc_type_arc_mask) { sc_event_emit(el->arc.begin, SC_EVENT_REMOVE_OUTPUT_ARC, _addr); sc_event_emit(el->arc.end, SC_EVENT_REMOVE_INPUT_ARC, _addr); } // Iterate all connectors for deleted element and append them into remove_list _addr = el->first_out_arc; while (SC_ADDR_IS_NOT_EMPTY(_addr)) { el2 = sc_storage_get_element(_addr, SC_TRUE); // do not append elements, that have delete_time_stamp != 0 if (el2->delete_time_stamp == 0) remove_list = g_slist_append(remove_list, GUINT_TO_POINTER(SC_ADDR_LOCAL_TO_INT(_addr))); _addr = el2->arc.next_out_arc; } _addr = el->first_in_arc; while (SC_ADDR_IS_NOT_EMPTY(_addr)) { el2 = sc_storage_get_element(_addr, SC_TRUE); // do not append elements, that have delete_time_stamp != 0 if (el2->delete_time_stamp == 0) remove_list = g_slist_append(remove_list, GUINT_TO_POINTER(SC_ADDR_LOCAL_TO_INT(_addr))); _addr = el2->arc.next_in_arc; } // clean temp addr SC_ADDR_MAKE_EMPTY(_addr); } return SC_RESULT_OK; }
sc_bool sc_memory_is_element(sc_memory_context const * ctx, sc_addr addr) { return sc_storage_is_element(ctx, addr); }