1 #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/
2 #include <petscviewersaws.h>
3 #include <petscsys.h>
4
5 /*@
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 @*/
PetscObjectSAWsTakeAccess(PetscObject obj)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 /*@
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 @*/
PetscObjectSAWsGrantAccess(PetscObject obj)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 /*@
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 @*/
PetscSAWsBlock(void)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 /*@
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 @*/
PetscObjectSAWsBlock(PetscObject obj)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 /*@
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 @*/
PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg)119 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg)
120 {
121 PetscFunctionBegin;
122 PetscValidHeader(obj, 1);
123 obj->amspublishblock = flg;
124 PetscFunctionReturn(PETSC_SUCCESS);
125 }
126
PetscObjectSAWsViewOff(PetscObject obj)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