Actual source code: pams.c
1: #include <petsc/private/petscimpl.h>
2: #include <petscviewersaws.h>
4: /*@
5: PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs
6: by a `PetscObject` so their values may be changed in the computation
8: Collective
10: Input Parameter:
11: . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat);
13: Level: advanced
15: Developer Notes:
16: The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and
17: `PetscObjectSAWsRestoreAccess()`
19: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()`
20: @*/
21: PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj)
22: {
23: if (obj->amsmem) {
24: /* cannot wrap with PetscPushStack() because that also deals with the locks */
25: SAWs_Lock();
26: }
27: return PETSC_SUCCESS;
28: }
30: /*@
31: PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to
32: SAWs called when the changes made during `PetscObjectSAWsTakeAccess()` are complete.
34: Collective
36: Input Parameter:
37: . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat);
39: Level: advanced
41: Notes:
42: This allows the webserve to change the published values.
44: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()`
45: @*/
46: PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj)
47: {
48: if (obj->amsmem) {
49: /* cannot wrap with PetscPushStack() because that also deals with the locks */
50: SAWs_Unlock();
51: }
52: return PETSC_SUCCESS;
53: }
55: /*@
56: PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks it
58: Not Collective
60: Level: advanced
62: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()`
63: @*/
64: PetscErrorCode PetscSAWsBlock(void)
65: {
66: volatile PetscBool block = PETSC_TRUE;
68: PetscFunctionBegin;
69: PetscCallSAWs(SAWs_Register, "__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN);
70: SAWs_Lock();
71: while (block) {
72: SAWs_Unlock();
73: PetscCall(PetscInfo(NULL, "Blocking on SAWs\n"));
74: PetscCall(PetscSleep(.3));
75: SAWs_Lock();
76: }
77: SAWs_Unlock();
78: PetscCallSAWs(SAWs_Delete, "__Block");
79: PetscCall(PetscInfo(NULL, "Out of SAWs block\n"));
80: PetscFunctionReturn(PETSC_SUCCESS);
81: }
83: /*@
84: PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called
86: Collective
88: Input Parameter:
89: . obj - the PETSc variable
91: Level: advanced
93: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()`
94: @*/
95: PetscErrorCode PetscObjectSAWsBlock(PetscObject obj)
96: {
97: PetscFunctionBegin;
100: if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
101: PetscCall(PetscSAWsBlock());
102: PetscFunctionReturn(PETSC_SUCCESS);
103: }
105: /*@
106: PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()`
108: Collective
110: Input Parameters:
111: + obj - the PETSc variable
112: - flg - whether it should block
114: Level: advanced
116: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()`
117: @*/
118: PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg)
119: {
120: PetscFunctionBegin;
122: obj->amspublishblock = flg;
123: PetscFunctionReturn(PETSC_SUCCESS);
124: }
126: /*@
127: PetscObjectSAWsViewOff - Remove a `PetscObject`'s SAWs (Scientific Application Web server) directory so the object is no longer published
129: Logically Collective
131: Input Parameter:
132: . obj - the `PetscObject` whose SAWs publication should be torn down
134: Level: developer
136: Notes:
137: No-op for `PetscViewer` objects, and for any object that was never published via SAWs.
139: Called from `PetscObjectDestroy()`; users normally do not need to call this directly.
141: .seealso: `PetscObject`, `PetscObjectSAWsBlock()`, `PetscObjectSAWsTakeAccess()`, `PetscObjectSAWsGrantAccess()`
142: @*/
143: PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
144: {
145: char dir[PETSC_MAX_PATH_LEN];
147: PetscFunctionBegin;
148: if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(PETSC_SUCCESS);
149: if (!obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
150: PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name));
151: PetscCallSAWs(SAWs_Delete, dir);
152: PetscFunctionReturn(PETSC_SUCCESS);
153: }