Build Packages / Unit tests (push) Successful in 1h31m59s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 8m43s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m5s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 9m27s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m56s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 9m24s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 10m27s
Build Packages / build:rpm (rocky8) (push) Successful in 9m20s
Build Packages / build:rpm (rocky9) (push) Successful in 10m50s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m54s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 8m38s
Build Packages / DIALS test (push) Successful in 12m13s
Build Packages / XDS test (durin plugin) (push) Successful in 7m8s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m8s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m50s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / Build documentation (push) Successful in 50s
Build Packages / Create release (push) Skipped
This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use. * jfjoch_broker: Add EXPERIMENTAL pixelrefine mode for image processing * jfjoch_broker: Allow to load user mask from 8-bit and 16-bit TIFF files * jfjoch_broker: Add ROI calculation in non-FPGA workflow * jfjoch_broker: Fixes to TCP image pusher * jfjoch_broker: Remove NUMA bindings * jfjoch_broker: Improvements to indexing * jfjoch_broker: For PSI EIGER, trimming energies are taken from the detector configuration (now compulsory) instead of hardcoded values * jfjoch_writer: Save ROI definitions and the per-pixel ROI bitmap in the master file; azimuthal ROIs support phi (angular) sectors * jfjoch_viewer: Major redesign with dockable panels and saved layouts, plus on-canvas creation/move/resize of box, circle and azimuthal ROIs * jfjoch_viewer: Run jfjoch_process reprocessing jobs from inside the GUI and overlay per-run results Reviewed-on: #63
90 lines
2.4 KiB
C
90 lines
2.4 KiB
C
/*
|
|
* IOchain - Distribute a chain of dependent IO events among threads.
|
|
*
|
|
* This file is part of Bitshuffle
|
|
* Author: Kiyoshi Masui <kiyo@physics.ubc.ca>
|
|
* Website: https://www.github.com/kiyo-masui/bitshuffle
|
|
* Created: 2014
|
|
*
|
|
* See LICENSE file for details about copyright and rights to use.
|
|
*
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include "iochain.h"
|
|
|
|
|
|
void ioc_init(ioc_chain *C, const void *in_ptr_0, void *out_ptr_0) {
|
|
#ifdef _OPENMP
|
|
omp_init_lock(&C->next_lock);
|
|
for (size_t ii = 0; ii < IOC_SIZE; ii ++) {
|
|
omp_init_lock(&(C->in_pl[ii].lock));
|
|
omp_init_lock(&(C->out_pl[ii].lock));
|
|
}
|
|
#endif
|
|
C->next = 0;
|
|
C->in_pl[0].ptr = in_ptr_0;
|
|
C->out_pl[0].ptr = out_ptr_0;
|
|
}
|
|
|
|
|
|
void ioc_destroy(ioc_chain *C) {
|
|
#ifdef _OPENMP
|
|
omp_destroy_lock(&C->next_lock);
|
|
for (size_t ii = 0; ii < IOC_SIZE; ii ++) {
|
|
omp_destroy_lock(&(C->in_pl[ii].lock));
|
|
omp_destroy_lock(&(C->out_pl[ii].lock));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
const void * ioc_get_in(ioc_chain *C, size_t *this_iter) {
|
|
#ifdef _OPENMP
|
|
omp_set_lock(&C->next_lock);
|
|
#pragma omp flush
|
|
#endif
|
|
*this_iter = C->next;
|
|
C->next ++;
|
|
#ifdef _OPENMP
|
|
omp_set_lock(&(C->in_pl[*this_iter % IOC_SIZE].lock));
|
|
omp_set_lock(&(C->in_pl[(*this_iter + 1) % IOC_SIZE].lock));
|
|
omp_set_lock(&(C->out_pl[(*this_iter + 1) % IOC_SIZE].lock));
|
|
omp_unset_lock(&C->next_lock);
|
|
#endif
|
|
return C->in_pl[*this_iter % IOC_SIZE].ptr;
|
|
}
|
|
|
|
|
|
void ioc_set_next_in(ioc_chain *C, size_t* this_iter, void* in_ptr) {
|
|
C->in_pl[(*this_iter + 1) % IOC_SIZE].ptr = in_ptr;
|
|
#ifdef _OPENMP
|
|
omp_unset_lock(&(C->in_pl[(*this_iter + 1) % IOC_SIZE].lock));
|
|
#endif
|
|
}
|
|
|
|
|
|
void * ioc_get_out(ioc_chain *C, size_t *this_iter) {
|
|
#ifdef _OPENMP
|
|
omp_set_lock(&(C->out_pl[(*this_iter) % IOC_SIZE].lock));
|
|
#pragma omp flush
|
|
#endif
|
|
void *out_ptr = C->out_pl[*this_iter % IOC_SIZE].ptr;
|
|
#ifdef _OPENMP
|
|
omp_unset_lock(&(C->out_pl[(*this_iter) % IOC_SIZE].lock));
|
|
#endif
|
|
return out_ptr;
|
|
}
|
|
|
|
|
|
void ioc_set_next_out(ioc_chain *C, size_t *this_iter, void* out_ptr) {
|
|
C->out_pl[(*this_iter + 1) % IOC_SIZE].ptr = out_ptr;
|
|
#ifdef _OPENMP
|
|
omp_unset_lock(&(C->out_pl[(*this_iter + 1) % IOC_SIZE].lock));
|
|
// *in_pl[this_iter]* lock released at the end of the iteration to avoid being
|
|
// overtaken by previous threads and having *out_pl[this_iter]* corrupted.
|
|
// Especially worried about thread 0, iteration 0.
|
|
omp_unset_lock(&(C->in_pl[(*this_iter) % IOC_SIZE].lock));
|
|
#endif
|
|
}
|