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