@@ -7,28 +7,37 @@ Hook to use [Web Locks API](https://developer.mozilla.org/en-US/docs/Web/API/Web
77export const UseLock = () => {
88 const [buffer, setBuffer] = useState <number []>([]);
99 const [lock, setLock] = useState <{ held: string [], pending: string [] }>({ held: [], pending: [] });
10- const [messages, setMessages] = useState <{ consumer: string [], producer: string [] }>({
10+ const [messages, setMessages] = useState <{ consumer: string [], buffer : number [][], producer: string [] }>({
1111 consumer: [],
12+ buffer: [],
1213 producer: []
1314 });
1415 const do_something = useCallback ((mode : " read" | " write" ) => {
1516 return new Promise <void >((res ) => {
1617 setTimeout (() => {
1718 if (mode === " read" ) {
1819 let el: number | undefined ;
19- setBuffer (b => b .filter ((_ , index , arr ) => {
20- if (index !== arr .length - 1 ) {
21- return true ;
22- } else {
23- el = _ ;
24- return false ;
25- }
26- }))
27- setMessages (m => ({... m , consumer: [... m .consumer , el !== undefined ? " Consumer has read " + el : " Consumer has read nothing" ]}))
20+ let buffer: number [];
21+ setBuffer (b => {
22+ buffer = b .filter ((_ , index , arr ) => {
23+ if (index !== arr .length - 1 ) {
24+ return true ;
25+ } else {
26+ el = _ ;
27+ return false ;
28+ }
29+ });
30+ return buffer ;
31+ })
32+ setMessages (m => ({ producer: [... m .producer , " -" ].filter ((_ , index , arr ) => arr .length - index <= 5 ), buffer: [... m .buffer , buffer ].filter ((_ ,index ,arr )=> arr .length - index <= 5 ), consumer: [... m .consumer , el !== undefined ? " Consumer has read " + el : " Consumer has read nothing" ].filter ((_ ,index , arr ) => arr .length - index <= 5 )}))
2833 } else {
2934 const n = Math .floor (Math .random () * 11 );
30- setBuffer (b => [n , ... b ]);
31- setMessages (m => ({ ... m , producer: [... m .producer , " Producer has written " + n ] }));
35+ let buffer: number [];
36+ setBuffer (b => {
37+ buffer = [n , ... b ];
38+ return buffer ;
39+ });
40+ setMessages (m => ({ consumer: [... m .consumer , " -" ].filter ((_ , index , arr ) => arr .length - index <= 5 ), buffer: [... m .buffer , buffer ].filter ((_ , index , arr ) => arr .length - index <= 5 ), producer: [... m .producer , " Producer has written " + n ].filter ((_ , index , arr ) => arr .length - index <= 5 ) }));
3241 }
3342 res ();
3443 }, 1600 );
@@ -46,16 +55,16 @@ export const UseLock = () => {
4655 useEffect (() => {
4756 const interval = setInterval (async () => {
4857 const n = Math .floor (Math .random () * 11 );
49- n > 6 ? createExclusiveLock () : createSharedLock ();
58+ n <= 6 ? createExclusiveLock () : createSharedLock ();
5059 }, 700 );
5160 return () => clearInterval (interval );
5261 }, [createExclusiveLock , createSharedLock ]);
5362
5463 useEffect (() => {
5564 const interval = setInterval (async () => {
5665 const result = await query ();
57- const held = (result .held || []).map (el => el .name + " - " + el .mode );
58- const pending = (result .pending || []).map (el => el .name + " - " + el .mode );
66+ const held = (result .held || []).map (el => ` ${ el .mode === " exclusive " ? " Reader " : " Writer " } require ${ el .mode } lock ` );
67+ const pending = (result .pending || []).map (el => ` ${ el .mode === " exclusive " ? " Reader " : " Writer " } require ${ el .mode } lock ` );
5968 setLock ({ held , pending });
6069 }, 1000 )
6170 return () => {
@@ -73,7 +82,9 @@ export const UseLock = () => {
7382 </div >
7483 <div >
7584 <h3 >Buffer</h3 >
76- <p >{ JSON .stringify (buffer , null , 6 )} </p >
85+ {
86+ messages .buffer .map ((m , index ) => <p key = { index } >{ JSON .stringify (m )} </p >)
87+ }
7788 </div >
7889 <div style = { { display: " grid" , gridTemplateColumns: " auto" , justifyContent: " center" , gap: 50 , overflow: ' auto' , maxHeight: 400 }} >
7990 <div >
0 commit comments