void append_to_set(gpointer key, gpointer value, gpointer set) { sc_addr elem; elem.offset = SC_ADDR_LOCAL_OFFSET_FROM_INT(GPOINTER_TO_INT(key)); elem.seg = SC_ADDR_LOCAL_SEG_FROM_INT(GPOINTER_TO_INT(key)); sc_memory_arc_new(s_default_ctx, sc_type_arc_pos_const_perm, ((scp_operand *)set)->addr, elem); }
sc_addr resolve_sc_addr_from_pointer(gpointer data) { sc_addr elem; elem.offset = SC_ADDR_LOCAL_OFFSET_FROM_INT(GPOINTER_TO_INT(data)); elem.seg = SC_ADDR_LOCAL_SEG_FROM_INT(GPOINTER_TO_INT(data)); return elem; }
sc_addr resolve_sc_addr_from_int(scp_uint32 data) { sc_addr elem; elem.offset = SC_ADDR_LOCAL_OFFSET_FROM_INT(data); elem.seg = SC_ADDR_LOCAL_SEG_FROM_INT(data); return elem; }
void test2() { sc_uint passed = 0; sc_uint idx = 0; sc_uint32 packed; sc_uint32 test_count = 10000000; sc_addr addr, addr2; printf("Test sc-addr packing\n"); passed = 0; timer = g_timer_new(); g_timer_reset(timer); g_timer_start(timer); for (idx = 0; idx < test_count; idx++) { // make random addr addr.seg = g_random_int() % SC_ADDR_SEG_MAX; addr.offset = g_random_int() % SC_ADDR_OFFSET_MAX; // pack packed = SC_ADDR_LOCAL_TO_INT(addr); // unpack addr2.seg = SC_ADDR_LOCAL_SEG_FROM_INT(packed); addr2.offset = SC_ADDR_LOCAL_OFFSET_FROM_INT(packed); if (SC_ADDR_IS_NOT_EQUAL(addr, addr2)) { printf("Error!\n"); printf("Source seg=%d, offset=%d\n", addr.seg, addr.offset); printf("Packed=%d\n", packed); printf("Unpacked seg=%d, offset=%d", addr2.seg, addr2.offset); }else passed++; } g_timer_stop(timer); printf("Passed %d of %d tests\n", passed, idx); printf("Pack/Unpack operations per second: %f", test_count / g_timer_elapsed(timer, 0)); 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; }