Skip to content
  • Barry Smith's avatar
    Fix PetscOptionsGetViewer() so it works in a thread-safe way · cd791dc2
    Barry Smith authored and Satish Balay's avatar Satish Balay committed
    When PetscOptionsGetViewer() returns, for example, PETSC_VIEWER_STDOUT_SELF the same object is shared
    by all threads that call PetscOptionsGetViewer(). In the previous code PetscObjectReference() and
    dereference (via PetscViewerDestroy() where called on the viewer by multiple threads after the viewer
    was accessed thus corrupting the object.
    
    This branch introduces a PetscOptionsRestoreViewer() that allows not doing the referencing and dereferencing
    on persistant viewers, thus removing the specific race condition above.
    
    Other possible solutions include
    
    Use a lock on each PetscObjectReference/Dereference() just in case they are shared. Could be time consuming so one
    could mark each object as either threadshared or independent and only do the locks on threadshared objects. This lowers
    the cost but would require more extensive changes to PETSc infrastructure. And I do not know if this shared/not shared model
    is what we need in the long run, though it might be.
    cd791dc2