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; }
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; }