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 by a `PetscObject` so their values may 8 be changed in the computation 9 10 Collective on obj 11 12 Input Parameters: 13 . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat); 14 15 Level: advanced 16 17 Developer Note: 18 The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and `PetscObjectSAWsRestoreAccess()` 19 20 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()` 21 @*/ 22 PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) { 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 called when the changes made during 32 `PetscObjectSAWsTakeAccess()` are complete. This allows the webserve to change the published values. 33 34 Collective on obj 35 36 Input Parameters: 37 . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat); 38 39 Level: advanced 40 41 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()` 42 @*/ 43 PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) { 44 if (obj->amsmem) { 45 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 46 SAWs_Unlock(); 47 } 48 return 0; 49 } 50 51 /*@C 52 PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks it 53 54 Not Collective 55 56 Level: advanced 57 58 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()` 59 @*/ 60 PetscErrorCode PetscSAWsBlock(void) { 61 volatile PetscBool block = PETSC_TRUE; 62 63 PetscFunctionBegin; 64 PetscCallSAWs(SAWs_Register, ("__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN)); 65 SAWs_Lock(); 66 while (block) { 67 SAWs_Unlock(); 68 PetscCall(PetscInfo(NULL, "Blocking on SAWs\n")); 69 PetscCall(PetscSleep(.3)); 70 SAWs_Lock(); 71 } 72 SAWs_Unlock(); 73 PetscCallSAWs(SAWs_Delete, ("__Block")); 74 PetscCall(PetscInfo(NULL, "Out of SAWs block\n")); 75 PetscFunctionReturn(0); 76 } 77 78 /*@C 79 PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called 80 81 Collective on obj 82 83 Input Parameters: 84 . obj - the PETSc variable 85 86 Level: advanced 87 88 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()` 89 @*/ 90 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) { 91 PetscFunctionBegin; 92 PetscValidHeader(obj, 1); 93 94 if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); 95 PetscCall(PetscSAWsBlock()); 96 PetscFunctionReturn(0); 97 } 98 99 /*@C 100 PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()` 101 102 Collective on obj 103 104 Input Parameters: 105 + obj - the PETSc variable 106 - flg - whether it should block 107 108 Level: advanced 109 110 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()` 111 @*/ 112 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg) { 113 PetscFunctionBegin; 114 PetscValidHeader(obj, 1); 115 obj->amspublishblock = flg; 116 PetscFunctionReturn(0); 117 } 118 119 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) { 120 char dir[PETSC_MAX_PATH_LEN]; 121 122 PetscFunctionBegin; 123 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 124 if (!obj->amsmem) PetscFunctionReturn(0); 125 PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name)); 126 PetscCallSAWs(SAWs_Delete, (dir)); 127 PetscFunctionReturn(0); 128 } 129