xref: /petsc/src/sys/ams/pams.c (revision 5b6bfdb9644f185dbf5e5a09b808ec241507e1e7)
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 so they may be changed locally
8 
9    Collective on PetscObject
10 
11    Input Parameters:
12 .  obj - the Petsc variable
13          Thus must be cast with a (PetscObject), for example,
14          PetscObjectSetName((PetscObject)mat,name);
15 
16    Level: advanced
17 
18    Concepts: publishing object
19 
20 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess()
21 
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 0;
30 }
31 
32 /*@C
33    PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to change
34 
35    Collective on PetscObject
36 
37    Input Parameters:
38 .  obj - the Petsc variable
39          Thus must be cast with a (PetscObject), for example,
40          PetscObjectSetName((PetscObject)mat,name);
41 
42    Level: advanced
43 
44    Concepts: publishing object
45 
46 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
47 
48 @*/
49 PetscErrorCode  PetscObjectSAWsGrantAccess(PetscObject obj)
50 {
51   if (obj->amsmem) {
52     /* cannot wrap with PetscPushStack() because that also deals with the locks */
53     SAWs_Unlock();
54   }
55   return 0;
56 }
57 
58 /*@C
59    PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks
60 
61    Not Collective
62 
63    Level: advanced
64 
65 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock(), PetscObjectSAWsBlock()
66 
67 @*/
68 PetscErrorCode  PetscSAWsBlock(void)
69 {
70   PetscErrorCode     ierr;
71   volatile PetscBool block = PETSC_TRUE;
72 
73   PetscFunctionBegin;
74   PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN));
75   SAWs_Lock();
76   while (block) {
77     SAWs_Unlock();
78     ierr = PetscInfo(NULL,"Blocking on SAWs\n");
79     ierr = PetscSleep(.3);CHKERRQ(ierr);
80     SAWs_Lock();
81   }
82   SAWs_Unlock();
83   PetscStackCallSAWs(SAWs_Delete,("__Block"));
84   ierr = PetscInfo(NULL,"Out of SAWs block\n");
85   PetscFunctionReturn(0);
86 }
87 
88 /*@C
89    PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called
90 
91    Collective on PetscObject
92 
93    Input Parameters:
94 .  obj - the Petsc variable
95          Thus must be cast with a (PetscObject), for example,
96          PetscObjectSetName((PetscObject)mat,name);
97 
98 
99    Level: advanced
100 
101    Concepts: publishing object
102 
103 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock()
104 
105 @*/
106 PetscErrorCode  PetscObjectSAWsBlock(PetscObject obj)
107 {
108   PetscErrorCode     ierr;
109 
110   PetscFunctionBegin;
111   PetscValidHeader(obj,1);
112 
113   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0);
114   ierr = PetscSAWsBlock();CHKERRQ(ierr);
115   PetscFunctionReturn(0);
116 }
117 
118 /*@C
119    PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock()
120 
121    Collective on PetscObject
122 
123    Input Parameters:
124 +  obj - the Petsc variable
125          Thus must be cast with a (PetscObject), for example,
126          PetscObjectSetName((PetscObject)mat,name);
127 -  flg - whether it should block
128 
129    Level: advanced
130 
131    Concepts: publishing object
132 
133 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock()
134 
135 @*/
136 PetscErrorCode  PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg)
137 {
138   PetscFunctionBegin;
139   PetscValidHeader(obj,1);
140   obj->amspublishblock = flg;
141   PetscFunctionReturn(0);
142 }
143 
144 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
145 {
146   char           dir[1024];
147   PetscErrorCode ierr;
148 
149   PetscFunctionBegin;
150   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
151   if (!obj->amsmem) PetscFunctionReturn(0);
152   ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr);
153   PetscStackCallSAWs(SAWs_Delete,(dir));
154   PetscFunctionReturn(0);
155 }
156 
157