| 
									
										
										
										
											2008-03-01 17:00:45 -05:00
										 |  |  | IN: concurrency.locks.tests | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | USING: tools.test concurrency.locks concurrency.count-downs | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | concurrency.messaging concurrency.mailboxes locals kernel | 
					
						
							| 
									
										
										
										
											2008-08-30 13:35:00 -04:00
										 |  |  | threads sequences calendar accessors ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  | :: lock-test-0 ( -- v )
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |     [let | v [ V{ } clone ] | 
					
						
							|  |  |  |            c [ 2 <count-down> ] | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							|  |  |  |                yield | 
					
						
							|  |  |  |                1 v push
 | 
					
						
							|  |  |  |                yield | 
					
						
							|  |  |  |                2 v push
 | 
					
						
							|  |  |  |                c count-down | 
					
						
							|  |  |  |            ] "Lock test 1" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							|  |  |  |                yield | 
					
						
							|  |  |  |                3 v push
 | 
					
						
							|  |  |  |                yield | 
					
						
							|  |  |  |                4 v push
 | 
					
						
							|  |  |  |                c count-down | 
					
						
							|  |  |  |            ] "Lock test 2" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            c await | 
					
						
							|  |  |  |            v | 
					
						
							|  |  |  |     ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  | :: lock-test-1 ( -- v )
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |     [let | v [ V{ } clone ] | 
					
						
							|  |  |  |            l [ <lock> ] | 
					
						
							|  |  |  |            c [ 2 <count-down> ] | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    yield | 
					
						
							|  |  |  |                    1 v push
 | 
					
						
							|  |  |  |                    yield | 
					
						
							|  |  |  |                    2 v push
 | 
					
						
							|  |  |  |                ] with-lock | 
					
						
							|  |  |  |                c count-down | 
					
						
							|  |  |  |            ] "Lock test 1" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    yield | 
					
						
							|  |  |  |                    3 v push
 | 
					
						
							|  |  |  |                    yield | 
					
						
							|  |  |  |                    4 v push
 | 
					
						
							|  |  |  |                ] with-lock | 
					
						
							|  |  |  |                c count-down | 
					
						
							|  |  |  |            ] "Lock test 2" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            c await | 
					
						
							|  |  |  |            v | 
					
						
							|  |  |  |     ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ V{ 1 3 2 4 } ] [ lock-test-0 ] unit-test | 
					
						
							|  |  |  | [ V{ 1 2 3 4 } ] [ lock-test-1 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 3 ] [ | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |     <reentrant-lock> dup [ | 
					
						
							|  |  |  |         [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |             3
 | 
					
						
							|  |  |  |         ] with-lock | 
					
						
							|  |  |  |     ] with-lock | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ ] [ <rw-lock> drop ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | [ ] [ <rw-lock> [ ] with-read-lock ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | [ ] [ <rw-lock> dup [ [ ] with-read-lock ] with-read-lock ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | [ ] [ <rw-lock> [ ] with-write-lock ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | [ ] [ <rw-lock> dup [ [ ] with-write-lock ] with-write-lock ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | [ ] [ <rw-lock> dup [ [ ] with-read-lock ] with-write-lock ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  | :: rw-lock-test-1 ( -- v )
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |     [let | l [ <rw-lock> ] | 
					
						
							|  |  |  |            c [ 1 <count-down> ] | 
					
						
							|  |  |  |            c' [ 1 <count-down> ] | 
					
						
							|  |  |  |            c'' [ 4 <count-down> ] | 
					
						
							|  |  |  |            v [ V{ } clone ] | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    1 v push
 | 
					
						
							|  |  |  |                    c count-down | 
					
						
							|  |  |  |                    yield | 
					
						
							|  |  |  |                    3 v push
 | 
					
						
							|  |  |  |                ] with-read-lock | 
					
						
							|  |  |  |                c'' count-down | 
					
						
							|  |  |  |            ] "R/W lock test 1" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							|  |  |  |                c await | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    4 v push
 | 
					
						
							| 
									
										
										
										
											2008-11-19 02:50:05 -05:00
										 |  |  |                    1 seconds sleep | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    5 v push
 | 
					
						
							|  |  |  |                ] with-write-lock | 
					
						
							|  |  |  |                c'' count-down | 
					
						
							|  |  |  |            ] "R/W lock test 2" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							|  |  |  |                c await | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    2 v push
 | 
					
						
							|  |  |  |                    c' count-down | 
					
						
							|  |  |  |                ] with-read-lock | 
					
						
							|  |  |  |                c'' count-down | 
					
						
							|  |  |  |            ] "R/W lock test 4" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							|  |  |  |                c' await | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    6 v push
 | 
					
						
							|  |  |  |                ] with-write-lock | 
					
						
							|  |  |  |                c'' count-down | 
					
						
							|  |  |  |            ] "R/W lock test 5" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            c'' await | 
					
						
							|  |  |  |            v | 
					
						
							|  |  |  |     ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ V{ 1 2 3 4 5 6 } ] [ rw-lock-test-1 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  | :: rw-lock-test-2 ( -- v )
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |     [let | l [ <rw-lock> ] | 
					
						
							|  |  |  |            c [ 1 <count-down> ] | 
					
						
							|  |  |  |            c' [ 2 <count-down> ] | 
					
						
							|  |  |  |            v [ V{ } clone ] | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    1 v push
 | 
					
						
							|  |  |  |                    c count-down | 
					
						
							| 
									
										
										
										
											2008-11-19 02:50:05 -05:00
										 |  |  |                    1 seconds sleep | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    2 v push
 | 
					
						
							|  |  |  |                ] with-write-lock | 
					
						
							|  |  |  |                c' count-down | 
					
						
							|  |  |  |            ] "R/W lock test 1" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            [ | 
					
						
							|  |  |  |                c await | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |                l [ | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  |                    3 v push
 | 
					
						
							|  |  |  |                ] with-read-lock | 
					
						
							|  |  |  |                c' count-down | 
					
						
							|  |  |  |            ] "R/W lock test 2" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            c' await | 
					
						
							|  |  |  |            v | 
					
						
							|  |  |  |     ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ V{ 1 2 3 } ] [ rw-lock-test-2 ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Test lock timeouts | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  | :: lock-timeout-test ( -- v )
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |     [let | l [ <lock> ] | | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             l [ 1 seconds sleep ] with-lock | 
					
						
							|  |  |  |         ] "Lock holder" spawn drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             l 1/10 seconds [ ] with-lock-timeout | 
					
						
							|  |  |  |         ] "Lock timeout-er" spawn-linked drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         receive | 
					
						
							|  |  |  |     ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ lock-timeout-test ] [ | 
					
						
							| 
									
										
										
										
											2008-08-30 22:19:06 -04:00
										 |  |  |     thread>> name>> "Lock timeout-er" =
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | ] must-fail-with | 
					
						
							| 
									
										
										
										
											2008-03-01 02:57:34 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     <rw-lock> dup [ | 
					
						
							|  |  |  |         1 seconds [ ] with-write-lock-timeout | 
					
						
							|  |  |  |     ] with-read-lock | 
					
						
							|  |  |  | ] must-fail | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     <rw-lock> dup [ | 
					
						
							|  |  |  |         dup [ | 
					
						
							|  |  |  |             1 seconds [ ] with-write-lock-timeout | 
					
						
							|  |  |  |         ] with-read-lock | 
					
						
							|  |  |  |     ] with-write-lock | 
					
						
							|  |  |  | ] must-fail | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ ] [ | 
					
						
							|  |  |  |     <rw-lock> dup [ | 
					
						
							|  |  |  |         dup [ | 
					
						
							|  |  |  |             1 seconds [ ] with-read-lock-timeout | 
					
						
							|  |  |  |         ] with-read-lock | 
					
						
							|  |  |  |     ] with-write-lock | 
					
						
							|  |  |  | ] unit-test |