亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? event.sml

?? 這是我們參加06年全國開源軟件的競賽作品
?? SML
字號:
(* event.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The representation of event values and the event combinators. * * Some important requirements on the implementation of base event values: * *  1)	The pollFn, doFn, and blockFn are always called from inside *	atomic regions. * *  2)	The pollFn returns an integer priority: this is 0 when not enabled, *	~1 for fixed priority, and a positive value for dynamic priority. *	The standard scheme is to associate a counter with the underlying *	synchronization object, and to increase it by one for each *	synchronization attempt. * *  3)  The blockFn is responsible for exiting the atomic region; the doFns *	should NOT leave the atomic region. * *  4)  The blockFn is responsible for executing the "cleanUp" action *	prior to leaving the atomic region. *)structure Event : sig    include EVENT    val atomicCVarSet : RepTypes.cvar -> unit    val cvarGetEvt    : RepTypes.cvar -> unit event  end = struct    structure R = RepTypes    structure S = Scheduler    val capture = SMLofNJ.Cont.capture    val escape = SMLofNJ.Cont.escape    val callcc = SMLofNJ.Cont.callcc    val throw = SMLofNJ.Cont.throw  (* Some inline functions to improve performance *)    fun map f = let	  fun mapf [] = []	    | mapf [a] = [f a]	    | mapf [a, b] = [f a, f b]	    | mapf [a, b, c] = [f a, f b, f c]	    | mapf (a::b::c::d::r) = (f a)::(f b)::(f c)::(f d)::(mapf r)	  in	    mapf	  end    fun app f = let	  fun appf [] = ()	    | appf (x::r) = (f x; appf r)	  in	    appf	  end    fun foldl f init l = let	  fun foldf ([], accum) = accum	    | foldf (x::r, accum) = foldf(r, f(x, accum))	  in	    foldf (l, init)	  end    fun error msg = raise Fail msg    datatype event_status = datatype RepTypes.event_status    type 'a base_evt = 'a RepTypes.base_evt    datatype event = datatype RepTypes.event  (** Condition variables.  Because these variables are set inside atomic   ** regions, we have to use different conventions for clean-up, etc.   ** Instead of requiring the blockFn continuation to call the cleanUp   ** action and to leave the atomic region, we call the cleanUp function   ** when setting the condition variable (in atomicCVarSet), and have the   ** invariant that the blockFn continuation is dispatched outside the   ** atomic region.   **)  (* set a condition variable; we assume that this function is always   * executed in an atomic region.   *)    fun atomicCVarSet (R.CVAR state) = (case !state	   of (R.CVAR_unset waiting) => let		val R.Q{rear, ...} = S.rdyQ1		fun add [] = !rear		  | add ({transId=ref R.CANCEL, ...}::r) = add r		  | add ({transId as ref(R.TRANS tid), cleanUp, kont}::r) = (		      transId := R.CANCEL;		      cleanUp();		      (tid, kont) :: (add r))		in		  state := R.CVAR_set 1;		  rear := add waiting		end	    | _ => error "cvar already set"	  (* end case *))  (* the event constructor for waiting on a cvar *)    fun cvarGetEvt (R.CVAR(state)) = let	  fun blockFn {transId, cleanUp, next} = callcc (fn k => let		val (R.CVAR_unset waiting) = !state		val item = {transId=transId, cleanUp=cleanUp, kont=k}		in		  state := R.CVAR_unset(item :: waiting);		  next ()		end)	  fun pollFn () = (case !state		 of (R.CVAR_set n) => let		      fun doFn () = (state := R.CVAR_set 1; S.atomicEnd())		      in			state := R.CVAR_set(n+1);			ENABLED{prio=n, doFn=doFn}		      end		  | _ => BLOCKED blockFn		(* end case *))	  in	    BEVT[pollFn]	  end    fun alwaysEvt v = BEVT[fn () => R.ENABLED{	    prio= ~1, doFn=fn () => (S.atomicEnd(); v)	  }]    val never = BEVT[]    val guard = GUARD    val withNack = W_NACK    fun choose (el : 'a event list) = let	  fun gatherBEvts ([], l) = BEVT l	    | gatherBEvts (BEVT[] :: r, l) = gatherBEvts (r, l)	    | gatherBEvts (BEVT[bev] :: r, bevs') = gatherBEvts (r, bev::bevs')	    | gatherBEvts (BEVT bevs :: r, bevs') = gatherBEvts (r, bevs @ bevs')	    | gatherBEvts (evts, []) = gather (evts, [])	    | gatherBEvts (evts, l) = gather (evts, [BEVT l])	  and gather ([], [evt]) = evt	    | gather ([], evts) = CHOOSE evts	    | gather (CHOOSE evts :: r, evts') = gather (r, evts @ evts')	    | gather (BEVT bevs :: r, BEVT bevs' :: r')		= gather (r, BEVT(bevs @ bevs') :: r')	    | gather (evt :: r, evts') = gather (r, evt :: evts')	  in	    gatherBEvts (rev el, [])	  end    fun wrap (evt, wfn) = let	  fun wrapBaseEvt pollFn () = (case pollFn()		 of ENABLED{prio, doFn} => ENABLED{prio=prio, doFn = wfn o doFn}		  | (BLOCKED blockFn) => BLOCKED(wfn o blockFn)		(* end case *))	  fun wrap' (BEVT bevs) = BEVT(map wrapBaseEvt bevs)	    | wrap' (CHOOSE evts) = CHOOSE(map wrap' evts)	    | wrap' (GUARD g) = GUARD(fn () => wrap(g(), wfn))	    | wrap' (W_NACK f) = W_NACK(fn evt => wrap(f evt, wfn))	  in	    wrap' evt	  end    fun wrapHandler (evt, hfn) = let	  fun wrap f x = ((f x) handle exn => hfn exn)	  fun wrapBaseEvt pollFn () = (case pollFn()		 of ENABLED{prio, doFn} => ENABLED{prio=prio, doFn = wrap doFn}		  | (BLOCKED blockFn) => BLOCKED(wrap blockFn)		(* end case *))	  fun wrap' (BEVT bevs) = BEVT(map wrapBaseEvt bevs)	    | wrap' (CHOOSE evts) = CHOOSE(map wrap' evts)	    | wrap' (GUARD g) = GUARD(fn () => wrapHandler(g(), hfn))	    | wrap' (W_NACK f) = W_NACK(fn evt => wrapHandler(f evt, hfn))	  in	    wrap' evt	  end    datatype 'a event_group      = BASE_GRP of 'a base_evt list      | GRP of 'a event_group list      | NACK_GRP of (R.cvar * 'a event_group)(*+DEBUGfun sayGrp (msg, eg) = let      fun f (BASE_GRP l, sl) = "BASE_GRP("::Int.toString(List.length l)::")"::sl	| f (GRP l, sl) = "GRP(" :: g(l, ")"::sl)	| f (NACK_GRP l, sl) = "NACK_GRP(" :: f(#2 l, ")"::sl)      and g ([], sl) = sl	| g ([x], sl) = f(x, sl)	| g (x::r, sl) = f(x, "," :: g(r, sl))      in	Debug.sayDebug(String.concat(msg :: ": " :: f(eg, ["\n"])))      end-DEBUG*)  (* force the evaluation of any guards in an event group. *)    fun force (BEVT l) = BASE_GRP l      | force evt = let	  fun force' (GUARD g) = force' (g ())	    | force' (W_NACK f) = let		val cvar = R.CVAR(ref(R.CVAR_unset []))		in		  NACK_GRP(cvar, force' (f (cvarGetEvt cvar)))		end	    | force' (BEVT grp) = BASE_GRP grp	    | force' (CHOOSE evts) = let		fun forceBL ([], bevs) = BASE_GRP bevs		  | forceBL (evt::r, bevs') = (case (force' evt)		       of (BASE_GRP bevs) => forceBL (r, bevs @ bevs')			| (GRP grp) => forceL (r, grp @ [BASE_GRP bevs'])			| grp => forceL (r, [grp, BASE_GRP bevs'])		      (* end case *))		and forceL ([], [grp]) = grp		  | forceL ([], l) = GRP l		  | forceL (evt :: r, l) = (		      case (force' evt, l)		       of (BASE_GRP bevs, BASE_GRP bevs' :: r') =>			    forceL (r, BASE_GRP(bevs @ bevs') :: r')			| (GRP grp, l) => forceL (r, grp @ l)			| (grp, l) => forceL (r, grp :: l)		      (* end case *))		in		  forceBL (evts, [])		end	  in	    force' evt	  end    local      val cnt = ref 0      fun random i = let val j = !cnt	    in	      if (j = 1000000) then cnt := 0 else cnt := j+1;	      Int.rem(j, i)	    end    in    fun selectDoFn ([(_, doFn)], _) = doFn      | selectDoFn (l, n) = let	  fun priority ~1 = n	    | priority p = p	  fun max ((p, doFn)::r, maxP, k, doFns) = let		val p = priority p		in		  if (p > maxP) then max(r, p, 1, [doFn])		  else if (p = maxP) then max(r, maxP, k+1, doFn::doFns)		  else max(r, maxP, k, doFns)		end	    | max ([], _, k, [doFn]) = doFn	    | max ([], _, k, doFns) = List.nth(doFns, random k)	  in	    max (l, 0, 0, [])	  end    end    fun mkFlg () = let val flg = ref(R.TRANS(S.getCurThread()))	  in	    (flg, fn () => flg := R.CANCEL)	  end    fun syncOnOneEvt (pollFn : 'a base_evt) = (	  S.atomicBegin ();	  case (pollFn())	   of ENABLED{doFn, ...} => doFn()	    | (BLOCKED blockFn) => let val (flg, setFlg) = mkFlg()		in		  blockFn{transId=flg, cleanUp=setFlg, next=S.atomicDispatch}		end	  (* end case *))  (* this function handles the case of synchronizing on a list of   * base events (w/o any negative acknowledgements).  It also handles   * the case of synchronizing on NEVER.   *)    fun syncOnBEvts [] = S.dispatch()      | syncOnBEvts [bev] = syncOnOneEvt bev      | syncOnBEvts bevs = let	  fun ext ([], blockFns) = capture (fn k => let		val escape = escape k		val (transId, setFlg) = mkFlg()		fun log [] = S.atomicDispatch ()		  | log (blockFn :: r) =		      escape (blockFn {			  transId = transId,			  cleanUp = setFlg,			  next = fn () => log r			})		in		  log blockFns; error "[log]"		end)	    | ext (pollFn :: r, blockFns) = (case pollFn()		 of ENABLED{prio, doFn} => extRdy (r, [(prio, doFn)], 1)		  | (BLOCKED blockFn) => ext (r, blockFn::blockFns)		(* end case *))(** NOTE: maybe we should just keep track of the max priority? ** What about fairness to fixed priority events (e.g., always, timeout?) **)	  and extRdy ([], doFns, n) = selectDoFn (doFns, n) ()	    | extRdy (pollFn :: r, doFns, n) = (case pollFn()		 of ENABLED{prio, doFn} => extRdy (r, (prio, doFn)::doFns, n+1)		  | _ => extRdy (r, doFns, n)		(* end case *))	  in	    S.atomicBegin();	    ext (bevs, [])	  end  (* walk the event group tree, collecting the base events (with associated   * ack flags), and a list of flag sets.  A flag set is a (cvar * ack flag list)   * pairs, where the flags are those associated with the events covered by the   * nack cvar.   *)    fun collect grp = let	  val unWrappedFlg = ref false	  fun gatherWrapped (grp, bl, flgSets) = let		fun gather (BASE_GRP bevs, bl, allFlgs, flgSets) = let		      fun append ([], bl, allFlgs) = (bl, allFlgs)			| append (bev::r, bl, allFlgs) = let			    val flg = ref false			    in			      append (r, (bev, flg)::bl, flg::allFlgs)			    end		      val (bl', allFlgs') = append (bevs, bl, allFlgs)		      in		        (bl', allFlgs', flgSets)		      end		  | gather (GRP grp, bl, allFlgs, flgSets) = let		      fun f (grp', (bl', allFlgs', flgSets')) =			    gather (grp', bl', allFlgs', flgSets')		      in			foldl f (bl, allFlgs, flgSets) grp		      end		  | gather (NACK_GRP(cvar, grp), bl, allFlgs, flgSets) = let		      val (bl', allFlgs', flgSets') =			    gather (grp, bl, [], flgSets)		      in			(bl', allFlgs' @ allFlgs, (cvar, allFlgs') :: flgSets')		      end		val (bl, _, flgSets) = gather (grp, bl, [], flgSets)		in		  (bl, flgSets)		end	  in	    case grp	     of (GRP _) => let		  val unWrappedFlg = ref false		  fun append ([], bl) = bl		    | append (bev::r, bl) = append(r, (bev, unWrappedFlg)::bl)		  fun gather (BASE_GRP bevs, bl, flgSets) =			(append(bevs, bl), flgSets)		    | gather (GRP grp, bl, flgSets) = let			fun f (grp', (bl', flgSets')) =			      gather(grp', bl', flgSets')			in			  foldl f (bl, flgSets) grp			end		    | gather (grp as NACK_GRP _, bl, flgSets) =			gatherWrapped (grp, bl, flgSets)		  in		    gather (grp, [], [])		  end	      | grp => gatherWrapped (grp, [], [])	    (* end case *)	  end  (* this function handles the more complicated case of synchronization   * on groups of events where negative acknowledgements are involved.   *)    fun syncOnGrp grp = let	  val (bl, flgSets) = collect grp	  fun chkCVars () = let		fun chkCVar (cvar, flgs) = let		      fun chkFlgs [] = atomicCVarSet cvar			| chkFlgs ((ref true)::_) = ()			| chkFlgs (_::r) = chkFlgs r		      in			chkFlgs flgs		      end		in		  app chkCVar flgSets		end	  fun ext ([], blockFns) = capture (fn k => let		val escape = escape k		val transId = ref(R.TRANS(S.getCurThread()))		fun setFlg flg () = (		      transId := R.CANCEL; flg := true; chkCVars())		fun log [] = S.atomicDispatch ()		  | log ((blockFn, flg) :: r) =		      escape (blockFn {			  transId = transId,			  cleanUp = setFlg flg,			  next = fn () => log r			})		in		  log blockFns; error "[log]"		end)	    | ext ((pollFn, flg) :: r, blockFns) = (case pollFn()		 of ENABLED{prio, doFn} => extRdy (r, [(prio, (doFn, flg))], 1)		  | (BLOCKED blockFn) => ext (r, (blockFn, flg)::blockFns)		(* end case *))(** NOTE: maybe we should just keep track of the max priority? ** What about fairness to fixed priority events (e.g., always, timeout?) **)	  and extRdy ([], doFns, n) = let		val (doFn, flg) = selectDoFn (doFns, n)		in		  flg := true;		  chkCVars ();		  doFn()		end	    | extRdy ((pollFn, flg) :: r, doFns, n) = (case pollFn()		 of ENABLED{prio, doFn} =>		      extRdy (r, (prio, (doFn, flg))::doFns, n+1)		  | _ => extRdy (r, doFns, n)		(* end case *))	  in	    case bl	     of [(bev, _)] => syncOnOneEvt bev	      | _ => (S.atomicBegin(); ext (bl, []))	    (* end case *)	  end    fun sync ev = (case (force ev)	   of (BASE_GRP bevs) => syncOnBEvts bevs	    | grp => syncOnGrp grp	  (* end case *))    fun select evts = let	  fun forceBL ([], bevs) = BASE_GRP bevs	    | forceBL (evt::r, bevs') = (case (force' evt)		       of (BASE_GRP bevs) => forceBL (r, bevs @ bevs')			| (GRP grp) => forceL (r, grp @ [BASE_GRP bevs'])			| grp => forceL (r, [grp, BASE_GRP bevs'])		      (* end case *))	  and forceL ([], [grp]) = grp	    | forceL ([], l) = GRP l	    | forceL (evt :: r, l) = (		case (force' evt, l)		 of (BASE_GRP bevs, BASE_GRP bevs' :: r') =>		      forceL (r, BASE_GRP(bevs @ bevs') :: r')		  | (GRP grp, l) => forceL (r, grp @ l)		  | (grp, l) => forceL (r, grp :: l)		(* end case *))	  and force' (GUARD g) = force' (g ())	    | force' (W_NACK f) = let		val cvar = R.CVAR(ref(R.CVAR_unset []))		in		  NACK_GRP(cvar, force' (f (cvarGetEvt cvar)))		end	    | force' (BEVT grp) = BASE_GRP grp	    | force' (CHOOSE evts) = forceBL (evts, [])	  in	    case forceBL(evts, [])	     of (BASE_GRP bevs) => syncOnBEvts bevs	      | grp => syncOnGrp grp	    (* end case *)	  end  end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本成人中文字幕在线视频| 亚洲电影第三页| 91久久精品一区二区三区| 粉嫩一区二区三区在线看| 久久五月婷婷丁香社区| 国产一区二区在线视频| 国产精品久久免费看| 欧美四级电影网| 国产一区二区三区四区五区入口| 久久综合久久综合久久综合| 国产成人亚洲精品青草天美| 一区二区三区四区在线免费观看| 欧美日韩精品欧美日韩精品 | 色综合激情久久| 国产一区二区三区精品视频| 丰满亚洲少妇av| 久久午夜老司机| 在线精品视频小说1| 天天操天天色综合| 国产精品国产三级国产普通话99 | 国产在线不卡一区| 亚洲素人一区二区| 91精品国产麻豆国产自产在线| 国产成人日日夜夜| 天堂一区二区在线| 国产精品福利电影一区二区三区四区| 欧美美女喷水视频| 色哟哟一区二区| 国产精品影视在线观看| 蜜臂av日日欢夜夜爽一区| 亚洲伦理在线免费看| 久久蜜桃av一区二区天堂| 欧美视频自拍偷拍| 一本大道久久精品懂色aⅴ| 另类小说综合欧美亚洲| 丝袜美腿成人在线| 亚洲一级在线观看| 亚洲日本青草视频在线怡红院| 久久久一区二区三区| 日韩精品一区二区在线| 91精品国产综合久久福利| 日韩欧美在线123| 欧美日韩亚洲综合在线| 在线亚洲免费视频| 欧美在线观看一二区| 色婷婷综合久色| 欧美这里有精品| 欧美图片一区二区三区| 欧美日韩国产影片| 欧美日韩免费高清一区色橹橹| 白白色亚洲国产精品| 99在线精品一区二区三区| a亚洲天堂av| 欧美综合在线视频| 91麻豆精品国产91久久久资源速度 | 欧美日本精品一区二区三区| 在线日韩一区二区| 欧美日韩情趣电影| 日韩免费高清av| 欧美激情一区二区三区全黄| 中文字幕中文乱码欧美一区二区| 亚洲欧美另类小说| 日韩和欧美一区二区| 美女www一区二区| 成人免费毛片a| 日本精品视频一区二区| 日韩欧美中文字幕精品| 中文在线一区二区| 亚洲高清久久久| 日韩成人午夜电影| 国产91露脸合集magnet | 91精品国产手机| 国产喂奶挤奶一区二区三区| 亚洲老司机在线| 精品在线播放免费| 99久久国产综合精品色伊| 欧美久久久久久久久久| 婷婷亚洲久悠悠色悠在线播放 | 欧美xxxxx裸体时装秀| 久久人人爽爽爽人久久久| 亚洲欧洲制服丝袜| 久久草av在线| 欧美日韩另类国产亚洲欧美一级| 精品国产青草久久久久福利| 亚洲视频电影在线| 国产成人自拍在线| 欧美日本精品一区二区三区| 国产精品欧美久久久久无广告 | 一区在线播放视频| 国产综合色视频| 7777精品伊人久久久大香线蕉经典版下载 | 三级亚洲高清视频| 午夜精品免费在线| av中文字幕亚洲| 日韩三级精品电影久久久| 亚洲人成影院在线观看| 国产夫妻精品视频| 亚洲免费视频中文字幕| 粉嫩一区二区三区性色av| 欧美一区二区三区思思人| 樱桃视频在线观看一区| 成人激情免费电影网址| 精品国产乱码91久久久久久网站| 视频在线观看国产精品| 欧美综合视频在线观看| 亚洲免费色视频| 在线一区二区三区四区| 国产精品灌醉下药二区| 国产一区二区三区四区五区入口 | 欧美一二三在线| 日本亚洲三级在线| 欧美一级理论片| 亚洲va国产va欧美va观看| 欧美网站一区二区| 日韩主播视频在线| 日韩一区二区三区av| 另类调教123区| 欧美mv日韩mv| 成人一区在线看| 自拍视频在线观看一区二区| 日本高清不卡在线观看| 一区二区三区在线视频播放| 色美美综合视频| 日本少妇一区二区| 精品sm捆绑视频| 92国产精品观看| 亚洲va在线va天堂| 樱桃视频在线观看一区| 日韩天堂在线观看| 国产大陆a不卡| 洋洋av久久久久久久一区| 欧洲精品一区二区| 极品美女销魂一区二区三区免费| 国产清纯白嫩初高生在线观看91 | 久久色.com| 欧美午夜精品一区二区蜜桃| 韩国精品一区二区| 亚洲欧美日韩国产另类专区| 日韩一区二区免费高清| 成人精品鲁一区一区二区| 婷婷激情综合网| 久久久久久久综合狠狠综合| 欧美色图一区二区三区| 国产乱码字幕精品高清av| 亚洲一区中文日韩| 欧美韩国一区二区| 日韩久久久久久| 欧洲av一区二区嗯嗯嗯啊| 国产精品一区二区三区99| 亚洲一二三四在线| 国产农村妇女精品| 日韩欧美一二区| 欧美视频在线一区| 波多野结衣视频一区| 欧美视频第二页| 国产成人免费xxxxxxxx| 热久久国产精品| 亚洲蜜臀av乱码久久精品| 色综合天天视频在线观看| 国产在线精品视频| 午夜精品一区二区三区电影天堂| 亚洲丝袜自拍清纯另类| 久久久蜜桃精品| 久久久亚洲国产美女国产盗摄| 欧美日韩久久不卡| 精品视频在线看| 91网站在线播放| 91在线免费视频观看| 国产成人aaa| 高清av一区二区| 粉嫩av一区二区三区粉嫩| 国产激情视频一区二区在线观看| 久久国产精品色| 久久er99热精品一区二区| 久久99精品久久久久婷婷| 九九视频精品免费| 国产一区二区电影| 国产精品1区2区3区| 国产精品综合一区二区三区| 国产一区日韩二区欧美三区| 国产一区不卡精品| 国产一区二区女| 成人一区二区在线观看| 99久久久无码国产精品| 91精品福利视频| 56国语精品自产拍在线观看| 日韩欧美中文一区| 久久久精品黄色| 亚洲欧美综合色| 香蕉成人伊视频在线观看| 在线中文字幕不卡| 在线观看av不卡| 337p亚洲精品色噜噜| 国产视频亚洲色图| 亚洲一区二区在线观看视频| 亚洲成人一区二区在线观看| 国产精品1区2区3区| 欧美在线视频全部完| 日韩免费观看2025年上映的电影| 欧美精品精品一区|