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