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);
}
Exemple #2
0
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;
}
Exemple #4
0
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);
}
Exemple #5
0
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;
}