1 2 #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 3 #include <petscviewersaws.h> 4 #include <petscsys.h> 5 6 /*@C 7 PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally 8 9 Collective on PetscObject 10 11 Input Parameters: 12 . obj - the Petsc variable 13 Thus must be cast with a (PetscObject), for example, 14 PetscObjectSetName((PetscObject)mat,name); 15 16 Level: advanced 17 18 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess() 19 20 @*/ 21 PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) 22 { 23 if (obj->amsmem) { 24 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 25 SAWs_Lock(); 26 } 27 return 0; 28 } 29 30 /*@C 31 PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to change 32 33 Collective on PetscObject 34 35 Input Parameters: 36 . obj - the Petsc variable 37 Thus must be cast with a (PetscObject), for example, 38 PetscObjectSetName((PetscObject)mat,name); 39 40 Level: advanced 41 42 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 43 44 @*/ 45 PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) 46 { 47 if (obj->amsmem) { 48 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 49 SAWs_Unlock(); 50 } 51 return 0; 52 } 53 54 /*@C 55 PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks 56 57 Not Collective 58 59 Level: advanced 60 61 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock(), PetscObjectSAWsBlock() 62 63 @*/ 64 PetscErrorCode PetscSAWsBlock(void) 65 { 66 PetscErrorCode ierr; 67 volatile PetscBool block = PETSC_TRUE; 68 69 PetscFunctionBegin; 70 PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN)); 71 SAWs_Lock(); 72 while (block) { 73 SAWs_Unlock(); 74 ierr = PetscInfo(NULL,"Blocking on SAWs\n"); 75 ierr = PetscSleep(.3);CHKERRQ(ierr); 76 SAWs_Lock(); 77 } 78 SAWs_Unlock(); 79 PetscStackCallSAWs(SAWs_Delete,("__Block")); 80 ierr = PetscInfo(NULL,"Out of SAWs block\n"); 81 PetscFunctionReturn(0); 82 } 83 84 /*@C 85 PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called 86 87 Collective on PetscObject 88 89 Input Parameters: 90 . obj - the Petsc variable 91 Thus must be cast with a (PetscObject), for example, 92 PetscObjectSetName((PetscObject)mat,name); 93 94 Level: advanced 95 96 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock() 97 98 @*/ 99 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 100 { 101 PetscErrorCode ierr; 102 103 PetscFunctionBegin; 104 PetscValidHeader(obj,1); 105 106 if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); 107 ierr = PetscSAWsBlock();CHKERRQ(ierr); 108 PetscFunctionReturn(0); 109 } 110 111 /*@C 112 PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock() 113 114 Collective on PetscObject 115 116 Input Parameters: 117 + obj - the Petsc variable 118 Thus must be cast with a (PetscObject), for example, 119 PetscObjectSetName((PetscObject)mat,name); 120 - flg - whether it should block 121 122 Level: advanced 123 124 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock() 125 126 @*/ 127 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg) 128 { 129 PetscFunctionBegin; 130 PetscValidHeader(obj,1); 131 obj->amspublishblock = flg; 132 PetscFunctionReturn(0); 133 } 134 135 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 136 { 137 char dir[1024]; 138 PetscErrorCode ierr; 139 140 PetscFunctionBegin; 141 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 142 if (!obj->amsmem) PetscFunctionReturn(0); 143 ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr); 144 PetscStackCallSAWs(SAWs_Delete,(dir)); 145 PetscFunctionReturn(0); 146 } 147 148