I think the following outlines how this could be achieved just using PLO CSTST.
(o) Have a "lock word" for your ASID-Vector table that is incremented every
time an update is made (does not matter if this values wraps)
AVECHEAD DSECT
AVECHEAD_LOCK DS F
AVECHEAD_AVEC_CPID DS F CPOOL ID for AVEC entries
AVECHEAD_TVEC_CPID DS F CPOOL ID for TVEC entries
AVECHEAD_START DS 0A Start of AVEC slots (each slot
is AVEC address or 0)
(o) "AVEC" describes ASID vector for each entry
AVEC DSECT
....
AVEC_TVEC DS A Top TVEC
(o) "TVEC" describes TCB object
TVEC DSECT
TVEC_PREV DS A
TVEC_NEXT DS A
TVEC_TCB DS A
....
Then for a "TVEC add" function you could do something like :
(1) Load AVECHEAD_LOCK into reg
(2) Copy reg from (1), increment it and store somewhere
(3) Examine AVECHEAD table for existing AVEC for ASID
(4) Build AVEC if required and point a reg at slot (remember if we build new
one)
(5) Build TVEC for new task
(6) Remember existing AVEC_TVEC as OLD.TVEC
(7) Store OLD.TVEC in new TVEC_NEXT
(8) Get address of AVEC_TVEC
(9) PLO CSTST using :
Lockword from (1) and new value in (2)
New Data value 1 is AVEC addr - stored in slot address in (4)
New Data value 2 is TVEC addr - stored at AVEC_TVEC
New Data value 3 is TVEC addr - stored at OLD.TVEC_PREV
(A) If PLO fails, then free TVEC and AVEC (if new) and then go back to (1)
Another alternative is to fully populate your AVECHEAD slots with an AVEC at
server init time
AVEC DSECT
AVEC_LOCK DS F
AVEC_TVEC_HEAD DS A
AVEC_TVEC_TAIL DS A
Then when new tasks are added, you just manage the AVEC queue using PLO. An
ASID being indicated as not being monitored when AVEC_TVEC_HEAD = 0.
Part of me prefers the second method as mutliple AVECs queues can be updated at
the same time and the code is easier - however downside is the increased
storage requirements to fully populate the table at init (and maybe never even
use most of the slots)
Rob Scott
Developer
Rocket Software
275 Grove Street * Newton, MA 02466-2272 * USA
Tel: +1.617.614.2305
Email: [email protected]
Web: www.rocketsoftware.com
-----Original Message-----
From: IBM Mainframe Discussion List [mailto:[email protected]] On Behalf Of
Binyamin Dissen
Sent: 08 March 2010 20:18
To: [email protected]
Subject: Re: Several PLO's versus a SETLOCK
That won't help.
To make it more clear, I have a local ASVT with a slot for each address space.
If a task needs my services I would like to track the address space (in the
ASVT slot) as well as a linked list of the tasks using the service chained off
of the ASCB slot. Additional tasks in this address space may be connecting and
disconnecting.
So if there is already an address space tracking block just chain the TCB block
off of it. If not, allocate one and anchor it. Of course, another task may have
the same idea and there might be two attempts at storing into the slot. Or the
cleanup procedure can detect that all tasks have disconnected and thus there is
no need to retain the address space tracking block.
On Mon, 8 Mar 2010 18:06:38 +0000 Rob Scott <[email protected]> wrote:
:>Binyamin,
:>
:>Why not use the PLO CSTST (compare swap and triple store) ?
:>
:>
:>Rob Scott
:>Developer
:>Rocket Software
:>275 Grove Street * Newton, MA 02466-2272 * USA
:>Tel: +1.617.614.2305
:>Email: [email protected]
:>Web: www.rocketsoftware.com
:>
:>-----Original Message-----
:>From: IBM Mainframe Discussion List [mailto:[email protected]] On Behalf
Of Binyamin Dissen
:>Sent: 08 March 2010 17:10
:>To: [email protected]
:>Subject: Several PLO's versus a SETLOCK :> :>I need to do a interlocked
update of two disjoint areas. That might include getting storage (if not yet
allocated).
:>
:>The old way would be to setlock, see if the area1 was allocated, if not
allocate and store the anchor1. Then allocate area2 and save its pointer in a
linked list off of area1.
:>
:>The PLO approach is to see if area1 is allocated, and if not allocate both
:>area1 and area2, store area2 in area1 linked list and do a PLO C/S on anchor1.
:>If that fails, do a PLO C/F of the top chain item in area1 store as forward
pointer in area2 next and do a PLO C/D/S with the anchor1 value the same and
setting the forward from area1 to the new area2. If that fails on forward
:>area2 pointer, repeat. If that fails on area1 pointer, repeat top.
:>
:>Obviously the PLO approach is more complicated. But will it save enough
performance on the typical paths so that one can live with the extra cost of
the retries upon failure?
--
Binyamin Dissen <[email protected]> http://www.dissensoftware.com
Director, Dissen Software, Bar & Grill - Israel
Should you use the mailblocks package and expect a response from me, you should
preauthorize the dissensoftware.com domain.
I very rarely bother responding to challenge/response systems, especially those
from irresponsible companies.
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email to
[email protected] with the message: GET IBM-MAIN INFO Search the archives at
http://bama.ua.edu/archives/ibm-main.html
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html