1 #include <petsc-private/petscimpl.h> 2 3 /* ---------------------------------------------------------------------------------------*/ 4 #if defined(PETSC_HAVE_SETJMP_H) && defined(PETSC_HAVE_SIGINFO_T) 5 #include <signal.h> 6 #include <setjmp.h> 7 PETSC_INTERN jmp_buf PetscSegvJumpBuf; 8 PETSC_INTERN void PetscSegv_sigaction(int, siginfo_t*, void *); 9 10 /*@C 11 PetscCheckPointer - Returns PETSC_TRUE if a pointer points to accessible data 12 13 Not Collective 14 15 Input Parameters: 16 + ptr - the pointer 17 - dtype - the type of data the pointer is suppose to point to 18 19 Level: developer 20 21 @*/ 22 PetscBool PetscCheckPointer(const void *ptr,PetscDataType dtype) 23 { 24 struct sigaction sa,oldsa; 25 PetscStack *stackp; 26 27 if (PETSC_RUNNING_ON_VALGRIND) return PETSC_TRUE; 28 if (!ptr) return PETSC_FALSE; 29 30 /* Skip the verbose check if we are inside a hot function. */ 31 stackp = (PetscStack*)PetscThreadLocalGetValue(petscstack); 32 if (stackp && stackp->hotdepth > 0) return PETSC_TRUE; 33 34 sigemptyset(&sa.sa_mask); 35 sa.sa_sigaction = PetscSegv_sigaction; 36 sa.sa_flags = SA_SIGINFO; 37 sigaction(SIGSEGV, &sa, &oldsa); 38 39 if (setjmp(PetscSegvJumpBuf)) { 40 /* A segv was triggered in the code below hence we return with an error code */ 41 sigaction(SIGSEGV, &oldsa, NULL);/* reset old signal hanlder */ 42 return PETSC_FALSE; 43 } else { 44 switch (dtype) { 45 case PETSC_INT:{ 46 PETSC_UNUSED PetscInt x = (PetscInt)*(volatile PetscInt*)ptr; 47 break; 48 } 49 #if defined(PETSC_USE_COMPLEX) 50 case PETSC_SCALAR:{ /* C++ is seriously dysfunctional with volatile std::complex. */ 51 PetscReal xreal = ((volatile PetscReal*)ptr)[0],ximag = ((volatile PetscReal*)ptr)[1]; 52 PETSC_UNUSED volatile PetscScalar x = xreal + PETSC_i*ximag; 53 break; 54 } 55 #endif 56 case PETSC_REAL:{ 57 PETSC_UNUSED PetscReal x = *(volatile PetscReal*)ptr; 58 break; 59 } 60 case PETSC_BOOL:{ 61 PETSC_UNUSED PetscBool x = *(volatile PetscBool*)ptr; 62 break; 63 } 64 case PETSC_ENUM:{ 65 PETSC_UNUSED PetscEnum x = *(volatile PetscEnum*)ptr; 66 break; 67 } 68 case PETSC_CHAR:{ 69 PETSC_UNUSED char *x = *(char*volatile*)ptr; 70 break; 71 } 72 case PETSC_OBJECT:{ 73 PETSC_UNUSED volatile PetscClassId classid = ((PetscObject)ptr)->classid; 74 break; 75 } 76 default:; 77 } 78 } 79 sigaction(SIGSEGV, &oldsa, NULL); /* reset old signal hanlder */ 80 return PETSC_TRUE; 81 } 82 #else 83 PetscBool PetscCheckPointer(const void *ptr,PETSC_UNUSED PetscDataType dtype) 84 { 85 if (!ptr) return PETSC_FALSE; 86 return PETSC_TRUE; 87 } 88 #endif 89