xref: /petsc/src/sys/ams/pams.c (revision 5f3c5e7ab1713b2b36ec2007ece43899b4f0dcb3)
1 
2 #include <petsc/private/petscimpl.h> /*I    "petscsys.h"   I*/
3 #include <petscviewersaws.h>
4 #include <petscsys.h>
5 
6 /*@C
7   PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs
8   by a `PetscObject` so their values may  be changed in the computation
9 
10   Collective
11 
12   Input Parameter:
13 . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat);
14 
15   Level: advanced
16 
17   Developer Notes:
18   The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and
19   `PetscObjectSAWsRestoreAccess()`
20 
21 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()`
22 @*/
23 PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj)
24 {
25   if (obj->amsmem) {
26     /* cannot wrap with PetscPushStack() because that also deals with the locks */
27     SAWs_Lock();
28   }
29   return PETSC_SUCCESS;
30 }
31 
32 /*@C
33   PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to
34   SAWs called when the changes made during `PetscObjectSAWsTakeAccess()` are complete.
35 
36   Collective
37 
38   Input Parameter:
39 . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat);
40 
41   Level: advanced
42 
43   Notes:
44   This allows the webserve to change the published values.
45 
46 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()`
47 @*/
48 PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj)
49 {
50   if (obj->amsmem) {
51     /* cannot wrap with PetscPushStack() because that also deals with the locks */
52     SAWs_Unlock();
53   }
54   return PETSC_SUCCESS;
55 }
56 
57 /*@C
58   PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks it
59 
60   Not Collective
61 
62   Level: advanced
63 
64 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()`
65 @*/
66 PetscErrorCode PetscSAWsBlock(void)
67 {
68   volatile PetscBool block = PETSC_TRUE;
69 
70   PetscFunctionBegin;
71   PetscCallSAWs(SAWs_Register, ("__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN));
72   SAWs_Lock();
73   while (block) {
74     SAWs_Unlock();
75     PetscCall(PetscInfo(NULL, "Blocking on SAWs\n"));
76     PetscCall(PetscSleep(.3));
77     SAWs_Lock();
78   }
79   SAWs_Unlock();
80   PetscCallSAWs(SAWs_Delete, ("__Block"));
81   PetscCall(PetscInfo(NULL, "Out of SAWs block\n"));
82   PetscFunctionReturn(PETSC_SUCCESS);
83 }
84 
85 /*@C
86   PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called
87 
88   Collective
89 
90   Input Parameter:
91 . obj - the PETSc variable
92 
93   Level: advanced
94 
95 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()`
96 @*/
97 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj)
98 {
99   PetscFunctionBegin;
100   PetscValidHeader(obj, 1);
101 
102   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
103   PetscCall(PetscSAWsBlock());
104   PetscFunctionReturn(PETSC_SUCCESS);
105 }
106 
107 /*@C
108   PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()`
109 
110   Collective
111 
112   Input Parameters:
113 + obj - the PETSc variable
114 - flg - whether it should block
115 
116   Level: advanced
117 
118 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()`
119 @*/
120 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg)
121 {
122   PetscFunctionBegin;
123   PetscValidHeader(obj, 1);
124   obj->amspublishblock = flg;
125   PetscFunctionReturn(PETSC_SUCCESS);
126 }
127 
128 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
129 {
130   char dir[PETSC_MAX_PATH_LEN];
131 
132   PetscFunctionBegin;
133   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(PETSC_SUCCESS);
134   if (!obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
135   PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name));
136   PetscCallSAWs(SAWs_Delete, (dir));
137   PetscFunctionReturn(PETSC_SUCCESS);
138 }
139