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