7 changed files with 199 additions and 115 deletions
			
			
		| @ -0,0 +1,87 @@ | |||||||
|  | # -*- tcl -*- | ||||||
|  | # Maintenance Instruction: leave the 999999.xxx.x as is and use 'pmix make' or src/make.tcl to update from <pkg>-buildversion.txt | ||||||
|  | # | ||||||
|  | # Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. | ||||||
|  | # Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. | ||||||
|  | # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ | ||||||
|  | # (C) 2023 | ||||||
|  | # | ||||||
|  | # @@ Meta Begin | ||||||
|  | # Application zzzload 999999.0a1.0 | ||||||
|  | # Meta platform     tcl | ||||||
|  | # Meta license      <unspecified> | ||||||
|  | # @@ Meta End | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ | ||||||
|  | ##  Requirements | ||||||
|  | ##e.g package require frobz | ||||||
|  | 
 | ||||||
|  | package require Thread | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ | ||||||
|  | namespace eval zzzload { | ||||||
|  |     variable loader_tid  ;#thread id  | ||||||
|  |     set loader_tid [thread::create -preserved] | ||||||
|  | 
 | ||||||
|  |     proc pkg_require {pkgname args} { | ||||||
|  |         variable loader_tid | ||||||
|  |         if {![tsv::exists zzzload_pkg $pkgname]} { | ||||||
|  |             tsv::set zzzload_pkg $pkgname "loading" | ||||||
|  |             tsv::set zzzload_pkg_mutex $pkgname [thread::mutex create] | ||||||
|  |             set cond [thread::cond create] | ||||||
|  |             tsv::set zzzload_pkg_cond $pkgname $cond | ||||||
|  |             thread::send -async $loader_tid [string map [list <pkg> $pkgname <cond> $cond] { | ||||||
|  |                 if {![catch {package require <pkg>} ver]} { | ||||||
|  |                     tsv::set zzzload_pkg <pkg> $ver  | ||||||
|  |                 } else { | ||||||
|  |                     tsv::set zzzload_pkg <pkg> "failed" | ||||||
|  |                 } | ||||||
|  |                 thread::cond notify <cond> | ||||||
|  |             }] | ||||||
|  |             return "loading" | ||||||
|  |         } else { | ||||||
|  |             return [tsv::get zzzload_pkg $pkgname] | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     proc pkg_wait {pkgname} { | ||||||
|  |         set pkgstate [tsv::get zzzload_pkg $pkgname] | ||||||
|  |         if {$pkgstate eq "loading"} { | ||||||
|  |             set mutex [tsv::get zzzload_pkg_mutex $pkgname] | ||||||
|  |             thread::mutex lock $mutex | ||||||
|  |             set cond [tsv::get zzzload_pkg_cond $pkgname] | ||||||
|  |             while {[tsv::get zzzload_pkg $pkgname] eq "loading"} { | ||||||
|  |                 thread::cond wait $cond $mutex 3000                | ||||||
|  |             } | ||||||
|  |             set result [tsv::get zzzload_pkg $pkgname] | ||||||
|  |             thread::mutex unlock $mutex | ||||||
|  |             return $result | ||||||
|  |         } else { | ||||||
|  |             return $pkgstate | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ | ||||||
|  | ##  Ready    | ||||||
|  | package provide zzzload [namespace eval zzzload { | ||||||
|  |     variable version | ||||||
|  |     set version 999999.0a1.0  | ||||||
|  | }] | ||||||
|  | return | ||||||
					Loading…
					
					
				
		Reference in new issue