xref: /petsc/src/sys/ams/pams.c (revision d50831c44aeb795bfe318cd7aecdd61216e9ac7c)
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__
637aab2a10SBarry Smith #define __FUNCT__ "PetscSAWsBlock"
647aab2a10SBarry Smith /*@C
657aab2a10SBarry Smith    PetscSAWsBlock - Blocks on SAWs until a client unblocks
667aab2a10SBarry Smith 
677aab2a10SBarry Smith    Not Collective
687aab2a10SBarry Smith 
697aab2a10SBarry Smith    Level: advanced
707aab2a10SBarry Smith 
717aab2a10SBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock(), PetscObjectSAWsBlock()
727aab2a10SBarry Smith 
737aab2a10SBarry Smith @*/
747aab2a10SBarry Smith PetscErrorCode  PetscSAWsBlock(void)
757aab2a10SBarry Smith {
767aab2a10SBarry Smith   PetscErrorCode     ierr;
777aab2a10SBarry Smith   volatile PetscBool block = PETSC_TRUE;
787aab2a10SBarry Smith 
797aab2a10SBarry Smith   PetscFunctionBegin;
80*d50831c4SBarry Smith   PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN));
817aab2a10SBarry Smith   SAWs_Lock();
827aab2a10SBarry Smith   while (block) {
837aab2a10SBarry Smith     SAWs_Unlock();
847aab2a10SBarry Smith     ierr = PetscInfo(NULL,"Blocking on SAWs\n");
85485c7403SBarry Smith     ierr = PetscSleep(.3);CHKERRQ(ierr);
867aab2a10SBarry Smith     SAWs_Lock();
877aab2a10SBarry Smith   }
887aab2a10SBarry Smith   SAWs_Unlock();
89*d50831c4SBarry Smith   PetscStackCallSAWs(SAWs_Delete,("__Block"));
907aab2a10SBarry Smith   ierr = PetscInfo(NULL,"Out of SAWs block\n");
917aab2a10SBarry Smith   PetscFunctionReturn(0);
927aab2a10SBarry Smith }
937aab2a10SBarry Smith 
947aab2a10SBarry 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);
1227aab2a10SBarry 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