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 Parameters:
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 0;
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 Parameters:
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 0;
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: SAWs_Register, ("__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN);
67: SAWs_Lock();
68: while (block) {
69: SAWs_Unlock();
70: PetscInfo(NULL, "Blocking on SAWs\n");
71: PetscSleep(.3);
72: SAWs_Lock();
73: }
74: SAWs_Unlock();
75: SAWs_Delete, ("__Block");
76: PetscInfo(NULL, "Out of SAWs block\n");
77: return 0;
78: }
80: /*@C
81: PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called
83: Collective
85: Input Parameters:
86: . obj - the PETSc variable
88: Level: advanced
90: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()`
91: @*/
92: PetscErrorCode PetscObjectSAWsBlock(PetscObject obj)
93: {
96: if (!obj->amspublishblock || !obj->amsmem) return 0;
97: PetscSAWsBlock();
98: return 0;
99: }
101: /*@C
102: PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()`
104: Collective
106: Input Parameters:
107: + obj - the PETSc variable
108: - flg - whether it should block
110: Level: advanced
112: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()`
113: @*/
114: PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg)
115: {
117: obj->amspublishblock = flg;
118: return 0;
119: }
121: PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
122: {
123: char dir[PETSC_MAX_PATH_LEN];
125: if (obj->classid == PETSC_VIEWER_CLASSID) return 0;
126: if (!obj->amsmem) return 0;
127: PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name);
128: SAWs_Delete, (dir);
129: return 0;
130: }