Пример #1
0
void thorium_mpi1_pt2pt_transport_destroy(struct thorium_transport *self)
{
    struct thorium_mpi1_pt2pt_transport *concrete_self;
    int result;
    struct thorium_mpi1_pt2pt_active_request active_request;

    concrete_self = thorium_transport_get_concrete_transport(self);

    while (core_queue_dequeue(&concrete_self->active_requests, &active_request)) {
        thorium_mpi1_pt2pt_active_request_destroy(&active_request);
    }

    core_queue_destroy(&concrete_self->active_requests);

    /*
     * \see http://www.mpich.org/static/docs/v3.1/www3/MPI_Comm_free.html
     */
    result = MPI_Comm_free(&concrete_self->comm);

    if (result != MPI_SUCCESS) {
        return;
    }

    result = MPI_Finalize();

    if (result != MPI_SUCCESS) {
        return;
    }
}
Пример #2
0
void biosal_sequence_partitioner_destroy(struct thorium_actor *actor)
{
    struct biosal_sequence_partitioner *concrete_actor;

    concrete_actor = (struct biosal_sequence_partitioner *)thorium_actor_concrete_actor(actor);

    core_vector_destroy(&concrete_actor->stream_entries);
    core_vector_destroy(&concrete_actor->stream_positions);
    core_vector_destroy(&concrete_actor->stream_global_positions);
    core_vector_destroy(&concrete_actor->store_entries);

    core_queue_destroy(&concrete_actor->available_commands);
    core_map_destroy(&concrete_actor->active_commands);
}
Пример #3
0
void biosal_input_controller_destroy(struct thorium_actor *actor)
{
    struct biosal_input_controller *concrete_actor;
    int i;
    char *pointer;
    struct core_map_iterator iterator;
    struct core_vector *vector;

    concrete_actor = (struct biosal_input_controller *)thorium_actor_concrete_actor(actor);

    core_timer_destroy(&concrete_actor->input_timer);
    core_timer_destroy(&concrete_actor->counting_timer);
    core_timer_destroy(&concrete_actor->distribution_timer);

    biosal_dna_codec_destroy(&concrete_actor->codec);

    for (i = 0; i < core_vector_size(&concrete_actor->files); i++) {
        pointer = *(char **)core_vector_at(&concrete_actor->files, i);
        core_memory_free(pointer, MEMORY_CONTROLLER);
    }

    core_vector_destroy(&concrete_actor->mega_block_vector);
    core_vector_destroy(&concrete_actor->counting_streams);
    core_vector_destroy(&concrete_actor->reading_streams);
    core_vector_destroy(&concrete_actor->partition_commands);
    core_vector_destroy(&concrete_actor->consumer_active_requests);
    core_vector_destroy(&concrete_actor->stream_consumers);
    core_vector_destroy(&concrete_actor->files);
    core_vector_destroy(&concrete_actor->spawners);
    core_vector_destroy(&concrete_actor->counts);
    core_vector_destroy(&concrete_actor->consumers);
    core_vector_destroy(&concrete_actor->stores_per_spawner);
    core_queue_destroy(&concrete_actor->unprepared_spawners);

    core_map_iterator_init(&iterator, &concrete_actor->mega_blocks);
    while (core_map_iterator_has_next(&iterator)) {
        core_map_iterator_next(&iterator, NULL, (void **)&vector);

        core_vector_destroy(vector);
    }
    core_map_iterator_destroy(&iterator);
    core_map_destroy(&concrete_actor->mega_blocks);
    core_map_destroy(&concrete_actor->assigned_blocks);
}
Пример #4
0
int main(int argc, char **argv)
{
    BEGIN_TESTS();

    {
        /* test when inserting more than array size */

        struct core_queue queue;
        int i;
        core_queue_init(&queue, sizeof(int));

        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        i = 16;
        while (i--) {
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &i), 1);
        }

        i = 16;
        while (i--) {
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &i), 1);
        }

        TEST_INT_EQUALS(core_queue_full(&queue), 0);

        i = 16;
        while (i--) {
            int item;
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &item), 1);
        }

        i = 16;
        while (i--) {
            int item;
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &item), 1);
        }

        core_queue_destroy(&queue);
    }

    {
        /* push 1000 elements, and verify them after */

        struct core_queue queue;
        int i;
        core_queue_init(&queue, sizeof(int));

        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        i = 1000;
        while (i--) {
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &i), 1);
        }

        TEST_INT_EQUALS(core_queue_full(&queue), 0);

        i = 1000;
        while (i--) {
            int item;
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &item), 1);
            TEST_INT_EQUALS(item, i);
            /* printf("%i %i\n", item, i); */
        }

        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        core_queue_destroy(&queue);
    }

    {
        /* use array size of 1 and 2000 elements */

        struct core_queue queue;
        int i;
        core_queue_init(&queue, sizeof(int));

        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        i = 2000;
        while (i--) {
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &i), 1);
        }

        TEST_INT_EQUALS(core_queue_full(&queue), 0);

        i = 2000;
        while (i--) {
            int item;
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &item), 1);
            TEST_INT_EQUALS(item, i);
            /* printf("%i %i\n", item, i); */
        }

        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        core_queue_destroy(&queue);
    }

    {
        /* stress test the code by inserting one element,
           and then removing. */

        struct core_queue queue;
        int i;
        int expected;
        core_queue_init(&queue, sizeof(int));

        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        i = 3000;
        while (i--) {
            expected = i;

            TEST_INT_EQUALS(core_queue_enqueue(&queue, &i), 1);
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &i), 1);

            TEST_INT_EQUALS(i, expected);

            TEST_INT_EQUALS(core_queue_empty(&queue), 1);
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &i), 1);
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &i), 1);

            TEST_INT_EQUALS(i, expected);
        }

        TEST_INT_EQUALS(core_queue_full(&queue), 0);
        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        /*
         * At any time, there is 0 or 1 elements in the queue.
         */
        /*
        core_queue_print(&queue);
        */

        TEST_INT_IS_LOWER_THAN(core_queue_capacity(&queue), 100);

        core_queue_destroy(&queue);
    }

    {
        struct core_queue queue;
        int i;
        int value;
        core_queue_init(&queue, sizeof(int));

#if 0
        printf("Test 3\n");
#endif
        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        i = 3000;
        while (i--) {
            value = i;
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &value), 1);
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &value), 1);
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &value), 1);
        }

#if 0
        printf("Test 3, size %d\n",
                        core_queue_size(&queue));
#endif

        core_queue_destroy(&queue);
    }

    {
        struct core_queue queue;
        int i;
        int value;
        core_queue_init(&queue, sizeof(int));

#if 0
        printf("Test 4\n");
#endif
        TEST_INT_EQUALS(core_queue_empty(&queue), 1);

        i = 3000000;
        while (i--) {
            value = i;
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &value), 1);
            TEST_INT_EQUALS(core_queue_enqueue(&queue, &value), 1);
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &value), 1);
            TEST_INT_EQUALS(core_queue_dequeue(&queue, &value), 1);
        }

#if 0
        printf("Test 4, size %d\n",
                        core_queue_size(&queue));
#endif

        core_queue_destroy(&queue);
    }

    END_TESTS();

    return 0;
}
Пример #5
0
void thorium_message_multiplexer_destroy(struct thorium_message_multiplexer *self)
{
    int i;
    int size;
    struct thorium_multiplexed_buffer *multiplexed_buffer;
    float ratio;

    if (thorium_node_must_print_data(self->node)) {

        ratio = 0.0;

        if (self->original_message_count != 0) {
            ratio = self->real_message_count / (0.0 + self->original_message_count);

            /*
             * Jack M. Nilles
             * "Traffic reduction by telecommuting: A status review and selected bibliography"
             * Transportation Research Part A: General
             * Volume 22, Issue 4, July 1988, Pages 301–317.
             *
             * @see http://www.sciencedirect.com/science/article/pii/0191260788900088
             * @see http://ww2.cityofpasadena.net/councilagendas/2007%20agendas/feb_26_07/pasadena%20traffic%20reduction%20strategies%2011-20-06%20draft.pdf
             */
            thorium_printf("[thorium] node %d worker %d message_multiplexer:"
                            " original_message_count %d real_message_count %d (traffic reduction: %.2f%%)\n",
                            thorium_node_name(self->node), thorium_worker_name(self->worker),
                    self->original_message_count, self->real_message_count, (1.0 - ratio) * 100);

            thorium_message_multiplexer_print_traffic_reduction(self);
        }
    }

#ifdef CORE_DEBUGGER_ASSERT_ENABLED
#endif
    size = core_vector_size(&self->buffers);

#ifdef THORIUM_MULTIPLEXER_TRACK_BUFFERS_WITH_CONTENT
    /*
     * There can be no messages that are not flushed already.
     */
    CORE_DEBUGGER_ASSERT(core_set_empty(&self->buffers_with_content));

    core_set_destroy(&self->buffers_with_content);
#endif

    for (i = 0; i < size; ++i) {
        multiplexed_buffer = core_vector_at(&self->buffers, i);

        CORE_DEBUGGER_ASSERT(thorium_multiplexed_buffer_current_size(multiplexed_buffer) == 0);

        thorium_multiplexed_buffer_destroy(multiplexed_buffer);
    }

    core_vector_destroy(&self->buffers);

    self->node = NULL;

    self->buffer_size_in_bytes = -1;
    self->timeout_in_nanoseconds = -1;

    core_timer_destroy(&self->timer);

#ifdef THORIUM_MULTIPLEXER_USE_TREE
    core_red_black_tree_destroy(&self->timeline);
#elif defined(THORIUM_MULTIPLEXER_USE_HEAP)
    core_binary_heap_destroy(&self->timeline);
#elif defined(THORIUM_MULTIPLEXER_USE_QUEUE)
    core_queue_destroy(&self->timeline);

#endif

    thorium_decision_maker_destroy(&self->decision_maker);

    thorium_router_destroy(&self->router);
}