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