Test cases for DevonMcCormick/mutex.ijs, organized under this page. The "TC" functions check the most basic, static functionality. However, "startHRs" is the most realistic test as this starts multiple J processes which all hold and release the same file, recording the timestamps before and after the hold. Subsequent analysis of these timestamps should reveal if there was any overlapping hold. Each process writes out the timestamp info to a ".dat" file using "3!:1"; use "3!:2" on the contents of each file to reconstruct the variable.

NB.* mutex_TCs.ijs: test cases for mutex.ijs.

coclass 'mutexTest'
require '~Code/mutex.ijs'
coinsert 'mutex'

checkIfSelfLocked=: 3 : '(getMUP getMyInfo '''')-:getMUP y'
endSlash=: ],'\'-.{:
wait=: 6!:3

TC0=: 3 : 0
   'fid myi'=. getHold ''
   assert. -. 0*./ . =#&>LFINFO
   releaseHold ''
   assert.    0*./ . =#&>LFINFO
)

TC1=: 3 : 0
   'fid myi'=. getHold ''
   assert. checkIfSelfLocked fread fid
   releaseHold ''
)

TC2=: 3 : 0
   'fid myi'=. getHold ''
   assert. checkIfSelfLocked myi
   releaseHold ''
)

TC3=: 3 : 0
   'fid0 myi0'=. getHold ''
   'fid1 myi1'=. getHold ''
   assert. fid0-:fid1
   assert. checkIfSelfLocked myi0
   assert. checkIfSelfLocked myi1
   releaseHold ''
)

TC4=: 3 : 0
   'fid myi'=. getHold ''
   assert. fid=>0{LFINFO
   assert. fid e. ;whlocks ''
   assert. 3=#fid (]{~[i.~[:;0{"1]) whlocks ''
   assert. LFINFO-:fid (]{~[i.~[:;0{"1]) whfiles ''
   releaseHold ''
)

NB.* holdAndWait: hold file for a random time, then release.
holdAndWait=: 3 : 0
   tm=. tm,qts'' [ 'fid myi'=. getHold '' [ tm=. ,:qts ''
   rc=. *./checkIfSelfLocked &> myi;fread fid
   rc=. rc,wait >:?y
   releaseHold ''
   rc;tm       NB. If self-held, holding time; when asked and got hold.
)

NB.* holdsAndReleases: do number of holds and releases, waiting between each.
holdsAndReleases=: 3 : 0
   'ni wl mhl'=. y  NB. Number of iterations, wait length, max hold length.
   rc=. 0 2$0 2;2 7$2
   while. _1<ni=. <:ni do. wait wl [ rc=. rc,holdAndWait mhl end.
   rc
)

NB.* startHRs: start holders and releasers as separate processes.
startHRs=: 3 : 0
   if. 0=#y do. 
       args=. |.(10+|.i.10),. 2 2,2 3,3 2,3 3,2 4,4 2,4 4,2 5,5 2,:5 5
       dd=. 'C:\amisc\J\Parallel\ExampleProblems\Holds\'
   else. 'dd args'=. y end.
   start1HR"1 dd;"1 args
)

start1HR=: 3 : 0
   'rundir arg'=. y
   1!:44 rundir=. endSlash rundir [ svdir=. 1!:43 ''   NB. Run in target dir.
   basis=. fread jpath '~Code/mutex_TCs.ijs'      NB. Get base code.
   rndnm=. 8 (]{~[:?[$[:#]) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
NB. Obfuscate rand name place-holder to avoid replacement here.
   rplargs=. '{',&.>('RN';'arg';'rundir'),&.>'}'
   addon=. (,rplargs,.rndnm;(":arg);rundir) stringreplace addon
   if. fexist hrfl=. 'HR_',rndnm,'.ijs' do. ferase hrfl end.
   (CR-.~basis,addon) fwrite hrfl                 NB. Create unique HR file.
   exe=. (<'"',(jpath '~bin'),'\j.exe" -jijx "'),&.><endSlash rundir
   fork&.>exe,&.>(<hrfl),&.>'"'                   NB. Run HR file.
   1!:44 svdir
)

addon=: 0 : 0
varnm=. 'rctm{RN}'
(varnm)=: holdsAndReleases {arg}
(varnm)=: ('{RN}';(getpid ''),qts''),".varnm
(3!:1 (".varnm)) 1!:2 <'{rundir}',varnm,'.dat'
2!:55 ''
)

The modified script launched as a separate process would look like the above but with additional, final lines customized per task like the ones shown in this example:

varnm=. 'rctmXOZNFNQJ'
(varnm)=: holdsAndReleases 65 4 2
(varnm)=: ('XOZNFNQJ';(getpid ''),qts''),".varnm
(3!:1 (".varnm)) 1!:2 <'C:\amisc\J\Parallel\ExampleProblems\Holds\',varnm,'.dat'
2!:55 ''

DevonMcCormick/mutex_TCs.ijs (last edited 2010-07-13 21:05:47 by DevonMcCormick)