Пример #1
0
size_t ZSTD_seekable_writeSeekTable(ZSTD_frameLog* fl, ZSTD_outBuffer* output)
{
    /* seekTableIndex: the current index in the table and
     * seekTableSize: the amount of the table written so far
     *
     * This function is written this way so that if it has to return early
     * because of a small buffer, it can keep going where it left off.
     */

    size_t const sizePerFrame = 8 + (fl->checksumFlag?4:0);
    size_t const seekTableLen = ZSTD_seekable_seekTableSize(fl);

    CHECK_Z(ZSTD_stwrite32(fl, output, ZSTD_MAGIC_SKIPPABLE_START | 0xE, 0));
    CHECK_Z(ZSTD_stwrite32(fl, output, seekTableLen - ZSTD_skippableHeaderSize,
                           4));

    while (fl->seekTableIndex < fl->size) {
        CHECK_Z(ZSTD_stwrite32(fl, output,
                               fl->entries[fl->seekTableIndex].cSize,
                               ZSTD_skippableHeaderSize +
                                       sizePerFrame * fl->seekTableIndex + 0));

        CHECK_Z(ZSTD_stwrite32(fl, output,
                               fl->entries[fl->seekTableIndex].dSize,
                               ZSTD_skippableHeaderSize +
                                       sizePerFrame * fl->seekTableIndex + 4));

        if (fl->checksumFlag) {
            CHECK_Z(ZSTD_stwrite32(
                    fl, output, fl->entries[fl->seekTableIndex].checksum,
                    ZSTD_skippableHeaderSize +
                            sizePerFrame * fl->seekTableIndex + 8));
        }

        fl->seekTableIndex++;
    }

    CHECK_Z(ZSTD_stwrite32(fl, output, fl->size,
                           seekTableLen - ZSTD_seekTableFooterSize));

    if (output->size - output->pos < 1) return seekTableLen - fl->seekTablePos;
    if (fl->seekTablePos < seekTableLen - 4) {
        BYTE sfd = 0;
        sfd |= (fl->checksumFlag) << 7;

        ((BYTE*)output->dst)[output->pos] = sfd;
        output->pos++;
        fl->seekTablePos++;
    }

    CHECK_Z(ZSTD_stwrite32(fl, output, ZSTD_SEEKABLE_MAGICNUMBER,
                           seekTableLen - 4));

    if (fl->seekTablePos != seekTableLen) return ERROR(GENERIC);
    return 0;
}
Пример #2
0
void * simp_group_routine(void * arg) {

    simp_group_context * context      = (simp_group_context *) arg;
    sched_device       * device       = NULL;
    int                  num_devices;

    allocate_compute_resources(context->job_event.group,
        &device, &num_devices);

    sched_event event;
    sched_pe    pe[100];

//#define _KILL_PES
#if defined(_KILL_PES)
    sched_pe    killed_pe[100];
    int iter = 0, killed;
#endif

    int tot_pe = 0;
    do {
        int ret, idx, success = 0;
//        int jIdx;
        for (idx=0;idx<num_devices;idx++) {

//            for (jIdx=0;jIdx<4;jIdx++) {
            ret = schedSpawnPes(
                device[idx], context->job_event.comp,  1, &pe[success]);
            if ((ret == 0) && (tot_pe < 
                context->job_event.comp->config.max_pes_num)) {
                tot_pe++;
                success++;
            }
            else if (ret == -1)
                break;
//            }
        }

#if  defined(_KILL_PES)
        if (iter == 0) {
            killed = success;
            for (idx=0;idx<success;idx++) {
                CHECK_Z(    schedKillPes(pe[idx]),
                    "Failed to kill PEs.");
                killed_pe[idx] = pe[idx];
            }
        }
        iter++;
#endif

        for (idx=0;idx<success;idx++) {
            CHECK_Z(    schedWaitEvent(context->event_handle, &event),
                "Failed to retrieve a group event.");
            TRACE("Pe exit (%d - %x)", event.peid, event.type);
        }
    } while(tot_pe < context->job_event.comp->config.max_pes_num);
//    } while(event.peid < context->job_event.comp->config.max_pes_num);

#if  defined(_KILL_PES)
        int idx;
        for (idx=0;idx<killed;idx++) {
            CHECK_Z(    schedRespawnPes(device[0], killed_pe[idx]),
                "Failed to respawn PEs.");
        }
        for (idx=0;idx<killed;idx++) {
            CHECK_Z(    schedWaitEvent(context->event_handle, &event),
                "Failed to retrieve a group event.");
            TRACE("Pe exit (%d - %x)", event.peid, event.type);
        }
#endif

    CHECK_Z(    schedAckEvent(context->job_event),
        "Failed to acknowledge job event.");

    deallocate_compute_resources(device, num_devices);

    return NULL;
}