yes, that should work. But CCTK_stdout may also need to be thread private variable to avoid race condition by multiple SMP threads. So this will be similar to what I proposed to have a cctk_printf function.
Gengbin
On 5/22/2014 1:53 PM, Einstein Toolkit wrote:
#1548: stdout redirection in multithreading scenario ----------------------------------+----------------------------------------- Reporter: gzheng@… | Owner: Type: defect | Status: reopened Priority: major | Milestone: Component: Cactus | Version: development version Resolution: | Keywords: stdout redirection ----------------------------------+-----------------------------------------
Comment (by rhaas):
After Gengbing's talk today and studying #1618, would it be possible to do something as simple as this: {{{ static AMPI_TLS FILE *CCTK_stdout = NULL; ... CCTKi_CommandLineFinished(...) { ... if(CCTK_MyProc(cctkGH) != 0) { CCTK_stdout = fopen("CCTK_ProcX.out"); } else { // or just = stdout since we never close the file handle anyway CCTK_stdout = freopen(stdout); } ... } }}} ?
We would then use CCTK_stdout in CCTK_VWarn etc. We'd still keep the {{{dup()}}} code around for the benefit of Fortran code that does {{{write(*,*)}}} etc. and requires redirecting the OS level file descriptors (which may need some code to protect against multiple AMPI ranks trying to redirect the same file descriptor). Such Fortran code would not be compatible with AMPI (not much we can do about this I think unless we want to change the file descriptors each time the thread changes).
This would make this ticket a sub-ticket of #1618 (supporting AMPI).