| 
									
										
										
										
											2008-02-18 10:08:59 -05:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | USING: dlists kernel threads math concurrency.conditions | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  | continuations accessors summary locals fry ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 06:07:40 -05:00
										 |  |  | IN: concurrency.semaphores | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: semaphore count threads ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-29 02:00:39 -04:00
										 |  |  | ERROR: negative-count-semaphore ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: negative-count-semaphore summary | 
					
						
							|  |  |  |     drop "Cannot have semaphore with negative count" ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | : <semaphore> ( n -- semaphore )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 02:00:39 -04:00
										 |  |  |     dup 0 < [ negative-count-semaphore ] when
 | 
					
						
							| 
									
										
										
										
											2008-04-13 16:06:27 -04:00
										 |  |  |     <dlist> semaphore boa ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 06:07:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | : wait-to-acquire ( semaphore timeout -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 02:00:39 -04:00
										 |  |  |     [ threads>> ] dip "semaphore" wait ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 06:07:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | : acquire-timeout ( semaphore timeout -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 02:00:39 -04:00
										 |  |  |     over count>> zero?
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  |     [ dupd wait-to-acquire ] [ drop ] if
 | 
					
						
							| 
									
										
										
										
											2008-08-29 02:00:39 -04:00
										 |  |  |     [ 1- ] change-count drop ;
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : acquire ( semaphore -- )
 | 
					
						
							|  |  |  |     f acquire-timeout ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 06:07:40 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : release ( semaphore -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 02:00:39 -04:00
										 |  |  |     [ 1+ ] change-count | 
					
						
							|  |  |  |     threads>> notify-1 ;
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  | :: with-semaphore-timeout ( semaphore timeout quot -- )
 | 
					
						
							|  |  |  |     semaphore timeout acquire-timeout | 
					
						
							|  |  |  |     quot [ semaphore release ] [ ] cleanup ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-22 00:47:06 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-18 17:20:18 -05:00
										 |  |  | : with-semaphore ( semaphore quot -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  |     swap dup acquire '[ _ release ] [ ] cleanup ; inline
 |