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