xref: /petsc/src/sys/ams/pams.c (revision a623e290c7eaa252b385564179837fe27521fbac)
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