Actual source code: pams.c
2: #include <petsc/private/petscimpl.h>
3: #include <petscviewersaws.h>
4: #include <petscsys.h>
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
10: Collective
12: Input Parameter:
13: . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat);
15: Level: advanced
17: Developer Note:
18: The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and `PetscObjectSAWsRestoreAccess()`
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: }
31: /*@C
32: PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs called when the changes made during
33: `PetscObjectSAWsTakeAccess()` are complete. This allows the webserve to change the published values.
35: Collective
37: Input Parameter:
38: . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat);
40: Level: advanced
42: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()`
43: @*/
44: PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj)
45: {
46: if (obj->amsmem) {
47: /* cannot wrap with PetscPushStack() because that also deals with the locks */
48: SAWs_Unlock();
49: }
50: return PETSC_SUCCESS;
51: }
53: /*@C
54: PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks it
56: Not Collective
58: Level: advanced
60: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()`
61: @*/
62: PetscErrorCode PetscSAWsBlock(void)
63: {
64: volatile PetscBool block = PETSC_TRUE;
66: PetscFunctionBegin;
67: PetscCallSAWs(SAWs_Register, ("__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN));
68: SAWs_Lock();
69: while (block) {
70: SAWs_Unlock();
71: PetscCall(PetscInfo(NULL, "Blocking on SAWs\n"));
72: PetscCall(PetscSleep(.3));
73: SAWs_Lock();
74: }
75: SAWs_Unlock();
76: PetscCallSAWs(SAWs_Delete, ("__Block"));
77: PetscCall(PetscInfo(NULL, "Out of SAWs block\n"));
78: PetscFunctionReturn(PETSC_SUCCESS);
79: }
81: /*@C
82: PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called
84: Collective
86: Input Parameter:
87: . obj - the PETSc variable
89: Level: advanced
91: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()`
92: @*/
93: PetscErrorCode PetscObjectSAWsBlock(PetscObject obj)
94: {
95: PetscFunctionBegin;
98: if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
99: PetscCall(PetscSAWsBlock());
100: PetscFunctionReturn(PETSC_SUCCESS);
101: }
103: /*@C
104: PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()`
106: Collective
108: Input Parameters:
109: + obj - the PETSc variable
110: - flg - whether it should block
112: Level: advanced
114: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()`
115: @*/
116: PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg)
117: {
118: PetscFunctionBegin;
120: obj->amspublishblock = flg;
121: PetscFunctionReturn(PETSC_SUCCESS);
122: }
124: PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
125: {
126: char dir[PETSC_MAX_PATH_LEN];
128: PetscFunctionBegin;
129: if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(PETSC_SUCCESS);
130: if (!obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
131: PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name));
132: PetscCallSAWs(SAWs_Delete, (dir));
133: PetscFunctionReturn(PETSC_SUCCESS);
134: }