Boost logo

Boost :

From: Chris Thomasson (cristom_at_[hidden])
Date: 2006-11-04 03:08:11


I found and killed a race-condition; the following three functions need to
be changed:

atomic::sys::once_dec(...)

template<typename T>
atomic::sys::once_def_POD<T>::release()

Here is the fix:

// System API Def
namespace atomic {
namespace sys {

    [...]

  // Dec the refcount if its >= 0.
  // returns true for the last ref,
  // otherwise false
  bool once_dec(refs_t *_this) throw() {
    refs_t local, cmp, xchg;
    do {
      local = ::ac_mb_load_naked(_this);
      if (local < 0) { return false; }
      xchg = (local == 1) ? -1 : local - 1;
      cmp = local;
      local = ac_atomic_cas_release(_this, local, xchg);
    } while(cmp != local);
    std::printf("atomic::sys::once_dec(); - %i\n", local - 1);

    return (local == 1);
  }

   [...]

  // define is a POD that holds a once POD
  template<typename T>
  struct once_def_POD {
    [...]

    // Acquires a reference and calls ctor for first ref.
    // returns pointer to ref,
    // otherwise NULL
    type_t* acquire() {
      type_t *local = 0, *cmp;

      do {
        if (local) { ac_atomic_dec_release(&s_this.m_refs); }
        local = (type_t*)ac_mb_loadptr_depends(&s_this.m_state);
        if (! local) {
          // hashed_mutex::guard_t lock(&_this);
          local = (type_t*)ac_mb_loadptr_depends(&s_this.m_state);
          if (! once_inc(&s_this.m_refs)) { return 0; }
          if (! local) {
            try { local = new type_t; }
            catch(...) {
              (void)once_dec(&s_this.m_refs);
              throw;
            }
            dbg_allocs_inc();
            std::printf("\n(%p)once_def_POD::acquire(); - %p\n",
(void*)this, (void*)local);
            ac_mb_storeptr_release(&s_this.m_state, local);
            return local;
          }
        } else if(! once_inc(&s_this.m_refs)) {
          return 0;
        }

        cmp = (type_t*)ac_mb_loadptr_depends(&s_this.m_state);
      } while(local != cmp);

      return local;
    }

    // Releases a reference and calls dtor if last ref.
    // returns nothing,
    // otherwise false
    void release() {
      type_t *local = (type_t*)ac_mb_loadptr_depends(&s_this.m_state);
      if (once_dec(&s_this.m_refs)) {
        ac_mb_storeptr_fence(&s_this.m_state, 0);
        ac_mb_store_fence(&s_this.m_refs, 0);
        if (local) {
          delete local;
          std::printf("(%p)once_def_POD::release(); - %p\n\n", (void*)this,
(void*)local);
          dbg_allocs_dec();
        }
      }
    }

  };

  [...]

}} // namespace atomic::sys

I attached the complete fixed code; once-experimental.cpp. The
race-condition allowed a thread to load a state pointer and inc a reference
count to a static object that was possibly being dtor'd. I fixed this by
zeroing the state pointer and invalidating the reference count when the
count dropped to zero. I also had to make a thread double check the load of
a state pointer after incrementing a valid reference count. Now I can't seem
to find any other race-conditions after this... Can you?

;^)

IMHO, this particular algorithm may be worth spending a little time on...
Humm...

begin 666 once-experimental.cpp
M(VEN8VQU9&4@/&-A<W-E<G0^#0HC:6YC;'5D92 \8W-T9&EO/@T*(VEN8VQU
M9&4@/&%P<&-O<F4N:#X-"@T*#0HO+R!5<V5R($%022!$96-L#0IN86UE<W!A
M8V4_at_871O;6EC('L@#0H@('1E;7!L871E/'1Y<&5N86UE(%0^(&-L87-S(&]N
M8V5?<'1R.PT*(" -"GT@+R\@;F%M97-P86-E(&%T;VUI8PT*#0H-"B\O(%-Y
M<W1E;2!!4$D_at_1&5C; T*;F%M97-P86-E(&%T;VUI8R![( T*;F%M97-P86-E
M('-Y<R![( T*("!T>7!E9&5F(&%C7VEN='=O<F1?="!R969S7W0[(" -"B @
M=&5M<&QA=&4\='EP96YA;64_at_5#X@<W1R=6-T(&]N8V5?4$]$.PT*("!T96UP
M;&%T93QT>7!E;F%M92!4/B!S=')U8W0@;VYC95]D969?4$]$.R @#0H@('-T
M871I8R!B;V]L(&]N8V5?:6YC*')E9G-?="HI('1H<F]W*"D[#0H@('-T871I
M8R!B;V]L(&]N8V5?9&5C*')E9G-?="HI('1H<F]W*"D[(" -"B @<W1A=&EC
M('9O:60_at_9&)G7V%L;&]C<U]I;F,H*2!T:')O=R_at_[hidden]*("!S=&%T:6,@=F]I
M9"!D8F=?86QL;V-S7V1E8R_at_I('1H<F]W*"D[(" -"B @#0I]?2 O+R!N86UE
M<W!A8V4_at_871O;6EC.CIS>7,-"@T*(" -"B\O(%-Y<W1E;2!!4$D_at_1&5F#0IN
M86UE<W!A8V4_at_871O;6EC('L@#0IN86UE<W!A8V4@<WES('L@(" -"B @(" @
M(" @(" -"B @+R\@1&5B=6<@8V]U;G1E<B -"B @<W1A=&EC(&%C7VEN='=O
M<F1?="!D8F=?86QL;V-S(#T@,#L@(" @(" @(" @#0H-"@T*(" O+R!);F,@
M=&AE(&1E8G5G(&-O=6YT97(@(" @(" @(" @(" -"B @=F]I9"!D8F=?86QL
M;V-S7VEN8R_at_I('1H<F]W*"D@>PT*(" @(&%C7VEN='=O<F1?="!A;&QO8W,@
M/2!A8U]A=&]M:6-?:6YC7V%C<75I<F4H)F1B9U]A;&QO8W,I.PT*(" @('-T
M9#HZ<')I;G1F*")A=&]M:6,Z.G-Y<SHZ9&)G7V%L;&]C<U]I;F,@+2 E:5QN
M(BP_at_86QL;V-S*3L@(" @(" @(" @( T*("!]#0H@( T*(" -"B @+R\@26YC
M('1H92!D96)U9R!C;W5N=&5R#0H@('9O:60_at_9&)G7V%L;&]C<U]D96,H*2!T
M:')O=R_at_I('L-"B @("!A8U]I;G1W;W)D7W0_at_86QL;V-S(#T_at_86-?871O;6EC
M7V1E8U]A8W%U:7)E*"9D8F=?86QL;V-S*3L-"B @("!S=&0Z.G!R:6YT9B_at_B
M871O;6EC.CIS>7,Z.F1B9U]A;&QO8W-?9&5C("T@)6E<;B(L(&%L;&]C<RD[
M(" -"B @?0T*(" @(" @(" @(" @(" -"B @(" @#0H@("\O($EN8R!T:&4@
M<F5F8V]U;G0@:68@:71S(#X](# N#0H@("\O(')E='5R;G,@=')U92!I9B!T
M:&4@<F5F8V]U;G0@=V%S(&EN8R=D+ T*(" O+R!O=&AE<G=I<V4_at_9F%L<V4@
M(" @#0H@(&)O;VP@;VYC95]I;F,H<F5F<U]T("I?=&AI<RD@=&AR;W<H*2![
M#0H@(" @<F5F<U]T(&QO8V%L+"!C;7 [#0H@(" @9&\@>PT*(" @(" @;&]C
M86P@/2 Z.F%C7VUB7VQO861?;F%K960H7W1H:7,I.PT*(" @(" @:68@*&QO
M8V%L(#P@,"D@>R!R971U<FX_at_9F%L<V4[('T-"B @(" @(&-M<" ](&QO8V%L
M.PT*(" @(" @;&]C86P@/2!A8U]A=&]M:6-?8V%S7V%C<75I<F4H7W1H:7,L
M(&QO8V%L+"!L;V-A;" K(#$I.PT*(" @('T@=VAI;&4H8VUP("$](&QO8V%L
M*3L-"B @("!S=&0Z.G!R:6YT9B_at_B871O;6EC.CIS>7,Z.F]N8V5?:6YC*"D[
M("T@)6E<;B(L(&QO8V%L("L@,2D[(" @( T*(" @( T*(" @(')E='5R;B!T
M<G5E.PT*("!]( T*(" @( T*(" @( T*(" O+R!$96,@=&AE(')E9F-O=6YT
M(&EF(&ET<R ^/2 P+@T*(" O+R!R971U<FYS('1R=64_at_9F]R('1H92!L87-T
M(')E9BP-"B @+R\@;W1H97)W:7-E(&9A;'-E#0H@(&)O;VP@;VYC95]D96,H
M<F5F<U]T("I?=&AI<RD@=&AR;W<H*2![#0H@(" @<F5F<U]T(&QO8V%L+"!C
M;7 L('AC:&<[#0H@(" @9&\@>PT*(" @(" @;&]C86P@/2 Z.F%C7VUB7VQO
M861?;F%K960H7W1H:7,I.PT*(" @(" @:68@*&QO8V%L(#P@,"D@>R!R971U
M<FX_at_9F%L<V4[('T-"B @(" @('AC:&<@/2 H;&]C86P@/3T@,2D@/R M,2 Z
M(&QO8V%L("T@,3L-"B @(" @(&-M<" ](&QO8V%L.PT*(" @(" @;&]C86P@
M/2!A8U]A=&]M:6-?8V%S7W)E;&5A<V4H7W1H:7,L(&QO8V%L+"!X8VAG*3L-
M"B @("!]('=H:6QE*&-M<" A/2!L;V-A;"D[( T*(" @('-T9#HZ<')I;G1F
M*")A=&]M:6,Z.G-Y<SHZ;VYC95]D96,H*3L@+2 E:5QN(BP@;&]C86P@+2 Q
M*3L@#0H@( T*(" @(')E='5R;B H;&]C86P@/3T@,2D[#0H@('T-"B @#0H@
M( T*(" O+R!O;F-E(&ES(&$@4$]$#0H@("-D969I;F4_at_051/34E#7T].0T5?
M4UE37U-4051)0TE.250H*2![,"P@,'T-"B @=&5M<&QA=&4\='EP96YA;64@
M5#X-"B @<W1R=6-T(&]N8V5?4$]$('L-"B @("!T>7!E9&5F(%0@='EP95]T
M.PT*(" @('1Y<&5D968@;VYC95]D969?4$]$/&]N8V5?4$]$/B!D969I;F5?
M4$]$7W0[#0H@(" @<F5F<U]T(&U?<F5F<SL@(" @#0H@(" @='EP95]T("IM
M7W-T871E.PT*("!].R @( T*(" -"B @#0H@("\O(&1E9FEN92!I<R!A(%!/
M1"!T:&%T(&AO;&1S(&$@;VYC92!03T0-"B @=&5M<&QA=&4\='EP96YA;64@
M5#X-"B @<W1R=6-T(&]N8V5?9&5F7U!/1"![#0H@(" @='EP961E9B!T>7!E
M;F%M92!4.CIT>7!E7W0@='EP95]T.PT*(" @('-T871I8R!4('-?=&AI<SL-
M"B @(" -"B @(" -"B @(" O+R!!8W%U:7)E<R!A(')E9F5R96YC92!A;F0@
M8V%L;',@8W1O<B!F;W(@9FER<W0@<F5F+@T*(" @("\O(')E='5R;G,@<&]I
M;G1E<B!T;R!R968L#0H@(" @+R\@;W1H97)W:7-E($Y53$P@( T*(" @('1Y
M<&5?="H_at_86-Q=6ER92_at_I('L-"B @(" @('1Y<&5?=" J;&]C86P@/2 P+" J
M8VUP.PT*(" @(" @#0H@(" @("!D;R![#0H@(" @(" @(&EF("AL;V-A;"D@
M>R!A8U]A=&]M:6-?9&5C7W)E;&5A<V4H)G-?=&AI<RYM7W)E9G,I.R!]#0H@
M(" @(" @(&QO8V%L(#T@*'1Y<&5?="HI86-?;6)?;&]A9'!T<E]D97!E;F1S
M*"9S7W1H:7,N;5]S=&%T92D[#0H@(" @(" @(&EF("@A(&QO8V%L*2![#0H@
M(" @(" @(" @+R\@:&%S:&5D7VUU=&5X.CIG=6%R9%]T(&QO8VLH)E]T:&ES
M*3L-"B @(" @(" @("!L;V-A;" ]("AT>7!E7W0J*6%C7VUB7VQO861P=')?
M9&5P96YD<R_at_F<U]T:&ES+FU?<W1A=&4I.PT*(" @(" @(" @(&EF("@A(&]N
M8V5?:6YC*"9S7W1H:7,N;5]R969S*2D@>R!R971U<FX@,#L@?0T*(" @(" @
M(" @(&EF("@A(&QO8V%L*2![#0H@(" @(" @(" @("!T<GD@>R!L;V-A;" ]
M(&YE=R!T>7!E7W0[('T@#0H@(" @(" @(" @("!C871C:"@N+BXI('L-"B @
M(" @(" @(" @(" @*'9O:60I;VYC95]D96,H)G-?=&AI<RYM7W)E9G,I.PT*
M(" @(" @(" @(" @("!T:')O=SL-"B @(" @(" @(" @('T-"B @(" @(" @
M(" @(&1B9U]A;&QO8W-?:6YC*"D[#0H@(" @(" @(" @("!S=&0Z.G!R:6YT
M9B_at_B7&XH)7 I;VYC95]D969?4$]$.CIA8W%U:7)E*"D[("T@)7!<;B(L("AV
M;VED*BET:&ES+" H=F]I9"HI;&]C86PI.PT*(" @(" @(" @(" @86-?;6)?
M<W1O<F5P=')?<F5L96%S92_at_F<U]T:&ES+FU?<W1A=&4L(&QO8V%L*3L-"B @
M(" @(" @(" @(')E='5R;B!L;V-A;#L-"B @(" @(" @("!]#0H@(" @(" @
M('T_at_96QS92!I9B_at_A(&]N8V5?:6YC*"9S7W1H:7,N;5]R969S*2D@>PT*(" @
M(" @(" @(')E='5R;B P.PT*(" @(" @("!]#0H@(" @(" @( T*(" @(" @
M("!C;7 @/2 H='EP95]T*BEA8U]M8E]L;V%D<'1R7V1E<&5N9',H)G-?=&AI
M<RYM7W-T871E*3L-"B @(" @('T@=VAI;&4H;&]C86P@(3T_at_8VUP*3L-"B @
M(" @( T*(" @(" @<F5T=7)N(&QO8V%L.PT*(" @('T@( T*(" -"B @#0H@
M(" @+R\@4F5L96%S97,@82!R969E<F5N8V4_at_86YD(&-A;&QS(&1T;W(@:68@
M;&%S="!R968N#0H@(" @+R\@<F5T=7)N<R!N;W1H:6YG+ T*(" @("\O(&]T
M:&5R=VES92!F86QS92 @#0H@(" @=F]I9"!R96QE87-E*"D@>R @(" @( T*
M(" @(" @='EP95]T("IL;V-A;" ]("AT>7!E7W0J*6%C7VUB7VQO861P=')?
M9&5P96YD<R_at_F<U]T:&ES+FU?<W1A=&4I.PT*(" @(" @:68@*&]N8V5?9&5C
M*"9S7W1H:7,N;5]R969S*2D@>PT*(" @(" @("!A8U]M8E]S=&]R97!T<E]F
M96YC92_at_F<U]T:&ES+FU?<W1A=&4L(# I.PT*(" @(" @("!A8U]M8E]S=&]R
M95]F96YC92_at_F<U]T:&ES+FU?<F5F<RP@,"D[(" @(" @(" @(" @(" -"B @
M(" @(" @:68@*&QO8V%L*2![#0H@(" @(" @(" @9&5L971E(&QO8V%L.R -
M"B @(" @(" @("!S=&0Z.G!R:6YT9B_at_B*"5P*6]N8V5?9&5F7U!/1#HZ<F5L
M96%S92_at_I.R M("5P7&Y<;B(L("AV;VED*BET:&ES+" H=F]I9"HI;&]C86PI
M.PT*(" @(" @(" @(&1B9U]A;&QO8W-?9&5C*"D[#0H@(" @(" @('T-"B @
M(" @('T-"B @("!]( T*(" @( T*(" @(" @+R\@<W1A=&EC(%!/1"!I;FET
M( T*("!].R @=&5M<&QA=&4\='EP96YA;64_at_5#X@#0H@(" @("!4(&]N8V5?
M9&5F7U!/1#Q4/CHZ<U]T:&ES(#T_at_051/34E#7T].0T5?4UE37U-4051)0TE.
M250H*3L-"B @#0I]?2 O+R!N86UE<W!A8V4_at_871O;6EC.CIS>7,-"@T*#0HO
M+R!5<V5R($%022!$968-"FYA;65S<&%C92!A=&]M:6,@>PT*(" -"B @+R\@
M2&]L9',@86X_at_86-Q=6ER960@<F5F97)E;F-E+@T*("!T96UP;&%T93QT>7!E
M;F%M92!4/@T*("!C;&%S<R!O;F-E7W!T<B![#0H@('!U8FQI8SH-"B @("!T
M>7!E9&5F('1Y<&5N86UE('-Y<SHZ;VYC95]03T0\5#XZ.F1E9FEN95]03T1?
M="!D969I;F5?4$]$7W0[#0H-"B @(" -"B @<')I=F%T93H@(" @#0H@(" @
M9&5F:6YE7U!/1%]T("IM7V]N8V4[(" @#0H@(" @5" J;5]S=&%T93L-"B @
M(" -"B @(" -"B @<')I=F%T93H-"B @("!4*B!A8W%U:7)E*"D@>PT*(" @
M(" @<F5T=7)N("AM7V]N8V4I(#\@;5]O;F-E+3YA8W%U:7)E*"D_at_.B P.PT*
M(" @('T-"B @(" -"B @("!V;VED(')E;&5A<V4H*2![#0H@(" @("!I9B H
M;5]O;F-E*2![(&%S<V5R="AM7W-T871E*3L@;5]O;F-E+3YR96QE87-E*"D[
M('T-"B @("!](" @( T*#0H-"B @<'5B;&EC._at_T*(" @(&]N8V5?<'1R*"D@
M=&AR;W<H*2 Z(&U?;VYC92_at_P*2P@;5]S=&%T92_at_P*2![?0T*(" @(" @(" -
M"B @("!O;F-E7W!T<BAD969I;F5?4$]$7W0@)E]O;F-E*2 -"B @(" @(#H@
M;5]O;F-E*"9?;VYC92DL(&U?<W1A=&4H7V]N8V4N86-Q=6ER92_at_I*2![?0T*
M(" @( T*(" @('YO;F-E7W!T<B_at_I('L@<F5L96%S92_at_I.R!]#0H@(" @#0H@
M(" @#0H@('!U8FQI8SH-"B @("!O;F-E7W!T<BAO;F-E7W!T<B!C;VYS=" F
M<FAS*2 -"B @(" @(#H@;5]O;F-E*')H<RYM7V]N8V4I+"!M7W-T871E*')H
M<RYA8W%U:7)E*"DI('M]#0H@(" @#0H@(" @;VYC95]P='(@8V]N<W0F(&]P
M97)A=&]R(#TH;VYC95]P='(@)G)H<RD@>PT*(" @(" @9&5F:6YE7U!/1%]T
M("IO;&0@/2!M7V]N8V4[#0H@(" @("!I9B H;VQD("$](')H<RYM7V]N8V4I
M('L-"B @(" @(" @9&5F:6YE7U!/1%]T("I?;VYC92 ](')H<RYM7V]N8V4[
M#0H@(" @(" @(%0@*E]S=&%T92 ](')H<RYA8W%U:7)E*"D[#0H@(" @(" @
M(')E;&5A<V4H*3L-"B @(" @(" @;5]O;F-E(#T_at_7V]N8V4[#0H@(" @(" @
M(&U?<W1A=&4@/2!?<W1A=&4[#0H@(" @("!]#0H@(" @("!R971U<FX@*G1H
M:7,[#0H@(" @?0T*(" @( T*(" @(&]N8V5?<'1R(&-O;G-T)B!O<&5R871O
M<B ]*&1E9FEN95]03T1?=" F<FAS*2![#0H@(" @("!D969I;F5?4$]$7W0@
M*F]L9" ](&U?;VYC93L-"B @(" @(&EF("AO;&0@(3T@)G)H<RD@>PT*(" @
M(" @("!D969I;F5?4$]$7W0@*E]O;F-E(#T@)G)H<SL-"B @(" @(" @5" J
M7W-T871E(#T@<FAS+F%C<75I<F4H*3L-"B @(" @(" @<F5L96%S92_at_[hidden]*
M(" @(" @("!M7V]N8V4@/2!?;VYC93L-"B @(" @(" @;5]S=&%T92 ](%]S
M=&%T93L-"B @(" @('T-"B @(" @(')E='5R;B J=&AI<SL-"B @("!](" @
M( T*(" @(" @(" -"B @(" @(" @(" @( T*("!P=6)L:6,Z#0H@(" @5"H@
M;&]A9"@I(&-O;G-T('1H<F]W*"D@>R!R971U<FX@;5]S=&%T93L@?0T*#0H-
M"B @<'5B;&EC.B @(" -"B @("!4*B!O<&5R871O<B M/B_at_I('L@<F5T=7)N
M(&QO860H*3L@?0T*(" @(%0F(&]P97)A=&]R("HH*2![(')E='5R;B J;&]A
M9"@I.R!]#0H@(" @#0H@(" @#0H@('!U8FQI8SH-"B @("!O<&5R871O<B!B
M;V]L*"D@=&AR;W<H*2![(')E='5R;B H;5]S=&%T92 A/2 P*3L@?0T*(" @
M(&)O;VP@;W!E<F%T;W(@(2_at_I('1H<F]W*"D@>R!R971U<FX@*&U?<W1A=&4@
M/3T@,"D[('T-"B @?3L-"B @#0I]("\O(&YA;65S<&%C92!A=&]M:6,-"@T*
M#0H-"@T*+R\@2&5R92!I<R!S86UP;&4@=7-A9V4Z#0IS=')U8W0_at_9F]O,2![
M( T*("!T>7!E9&5F(&%T;VUI8SHZ;VYC95]P='(\9F]O,3X@;VYC95]P=')?
M=#L-"B @#0H@('9O:60@=VAA=&5V97(H*2![#0H@(" @<W1D.CIP<FEN=&8H
M(B_at_E<"EF;V\Q.CIW:&%T979E<B_at_I.UQN(BP@*'9O:60J*71H:7,I.PT*("!]
M#0H@( T*("!F;V\Q*"D@>R!S=&0Z.G!R:6YT9B_at_B*"5P*69O;S$Z.F9O;S$H
M*3M<;B(L("AV;VED*BET:&ES*3L@?0T*(" -"B @?F9O;S$H*2![('-T9#HZ
M<')I;G1F*"(H)7 I9F]O,3HZ?F9O;S$H*3M<;B(L("AV;VED*BET:&ES*3L@
M?0T*?3L-"@T*#0IS=&%T:6,@=F]I9"!F=6YC85]F;W)?;75L=&EP;&5?=&AR
M96%D<R_at_I('L-"B @<W1A=&EC(&9O;S$Z.F]N8V5?<'1R7W0Z.F1E9FEN95]0
M3T1?="!S7V9O;SL-"@T*("!F;V\Q.CIO;F-E7W!T<E]T(&UY9F]O,2AS7V9O
M;RD[#0H@(&EF("AM>69O;S$I('L-"B @("!M>69O;S$M/G=H871E=F5R*"D[
M#0H@('T-"GT-"@T*#0IS=')U8W0_at_9F]O,B![( T*("!T>7!E9&5F(&%T;VUI
M8SHZ;VYC95]P='(\9F]O,3X@;VYC95]P=')?=#L-"B @#0H@('9O:60@=VAA
M=&5V97(H*2![#0H@(" @<W1D.CIP<FEN=&8H(B_at_E<"EF;V\R.CIW:&%T979E
M<B_at_I.UQN(BP@*'9O:60J*71H:7,I.PT*(" @(&9U;F-A7V9O<E]M=6QT:7!L
M95]T:')E861S*"D[#0H@('T@( T*(" -"B @9F]O,B_at_I('L@#0H@(" @<W1A
M=&EC(&9O;S$Z.F]N8V5?<'1R7W0Z.F1E9FEN95]03T1?="!S7V9O;SL@(" @
M(" @( T*(" @(&9O;S$Z.F]N8V5?<'1R7W0@;7EF;V\Q*'-?9F]O*3L-"B @
M("!I9B H;7EF;V\Q*2![#0H@(" @("!M>69O;S$M/G=H871E=F5R*"D[#0H@
M(" @?2 @#0H@(" @(" -"B @("!S=&0Z.G!R:6YT9B_at_B*"5P*69O;S(Z.F9O
M;S(H*3M<;B(L("AV;VED*BET:&ES*3L-"B @?2 @#0H@( T*("!^9F]O,B_at_I
M('L@<W1D.CIP<FEN=&8H(B_at_E<"EF;V\R.CI^9F]O,B_at_I.UQN(BP@*'9O:60J
M*71H:7,I.R!]#0I].PT*#0H-"G-T<G5C="!F;V\S('L@#0H@('1Y<&5D968@
M871O;6EC.CIO;F-E7W!T<CQF;V\S/B!O;F-E7W!T<E]T.PT*(" -"B @<W1A
M=&EC(&9O;S$Z.F]N8V5?<'1R7W0Z.F1E9FEN95]03T1?="!S7V9O;S$[(" -
M"B @#0H@('9O:60@=VAA=&5V97(H*2![#0H@(" @<W1D.CIP<FEN=&8H(B_at_E
M<"EF;V\S.CIW:&%T979E<B_at_I.UQN(BP@*'9O:60J*71H:7,I.PT*(" @(&9O
M;S$Z.F]N8V5?<'1R7W0@;7EF;V\Q*'-?9F]O,2D[#0H@(" @:68@*&UY9F]O
M,2D@>PT*(" @(" @;7EF;V\Q+3YW:&%T979E<B_at_[hidden]*(" @('T@( T*(" @
M(&9U;F-A7V9O<E]M=6QT:7!L95]T:')E861S*"D[(" @( T*("!](" -"B @
M#0H@(&9O;S,H*2![( T*(" @('-T871I8R!F;V\R.CIO;F-E7W!T<E]T.CID
M969I;F5?4$]$7W0@<U]F;V\R.R @( T*(" @( T*(" @(&9O;S(Z.F]N8V5?
M<'1R7W0@;7EF;V\R*'-?9F]O,BDL(&UY9F]O,F$[#0H@(" @:68@*&UY9F]O
M,BD@>PT*(" @(" @;7EF;V\R+3YW:&%T979E<B_at_I.R @(" @(" @(" @(" @
M(" -"B @(" @(&9O;S$Z.F]N8V5?<'1R7W0@;7EF;V\Q*'-?9F]O,2D[#0H@
M(" @("!M>69O;S)A(#T@;7EF;V\R.PT*(" @(" @:68@*&UY9F]O,2D@>PT*
M(" @(" @("!M>69O;S$M/G=H871E=F5R*"D[#0H@(" @("!](" @(" @(" @
M(" @(" @(" @#0H@(" @("!M>69O;S)A+3YW:&%T979E<B_at_[hidden]*(" @('T@
M(" @#0H-"B @("!S=&0Z.G!R:6YT9B_at_B*"5P*69O;S,Z.F9O;S,H*3M<;B(L
M("AV;VED*BET:&ES*3L-"B @?2 @#0H@( T*("!^9F]O,R_at_I('L@#0H@(" @
M=VAA=&5V97(H*3L-"B @("!S=&0Z.G!R:6YT9B_at_B*"5P*69O;S,Z.GYF;V\S
M*"D[7&XB+" H=F]I9"HI=&AI<RD[( T*("!]#0I].R @9F]O,3HZ;VYC95]P
M=')?=#HZ9&5F:6YE7U!/1%]T(&9O;S,Z.G-?9F]O,3L-"@T*#0IS=&%T:6,@
M=F]I9"!F=6YC8E]F;W)?;75L=&EP;&5?=&AR96%D<R_at_I('L-"B @9G5N8V%?
M9F]R7VUU;'1I<&QE7W1H<F5A9',H*3L@(" @#0H@('-T871I8R!F;V\R.CIO
M;F-E7W!T<E]T.CID969I;F5?4$]$7W0@<U]M>69O;S)A.R @(" -"B @9G5N
M8V%?9F]R7VUU;'1I<&QE7W1H<F5A9',H*3L-"B @#0H@(&9O;S(Z.F]N8V5?
M<'1R7W0@<VUY9F]O82AS7VUY9F]O,F$I+"!S;7EF;V]A83L-"B @:68@*'-M
M>69O;V$I('L-"B @("!S;7EF;V]A+3YW:&%T979E<B_at_[hidden]*("!](" @(" @
M( T*(" -"B @>PT*(" @(&9U;F-A7V9O<E]M=6QT:7!L95]T:')E861S*"D[
M#0H@(" @#0H@(" @<W1A=&EC(&9O;S(Z.F]N8V5?<'1R7W0Z.F1E9FEN95]0
M3T1?="!S7VUY9F]O,F([#0H@(" @#0H@(" @9F]O,2!M>69O;S$[(" @(" -
M"B @(" -"B @("!F;V\R.CIO;F-E7W!T<E]T('-M>69O;V$H<U]M>69O;S)A
M*3L-"B @("!I9B H<VUY9F]O82D@>PT*(" @(" @<VUY9F]O86$@/2!S;7EF
M;V]A.PT*(" @(" @<VUY9F]O86$M/G=H871E=F5R*"D[#0H@(" @?2 @(" @
M#0H@(" @(" @(" @(" -"B @("!F;V\R(&UY9F]O,CL@(" -"B @(" @(" @
M(" @(" @#0H@(" @>PT*(" @(" @;7EF;V\Q+G=H871E=F5R*"D[#0H@(" @
M(" -"B @(" @(&9O;S(Z.F]N8V5?<'1R7W0@<VUY9F]O,BAS7VUY9F]O,F$I
M.PT*(" @(" @:68@*'-M>69O;S(I('L-"B @(" @(" @<VUY9F]O,BT^=VAA
M=&5V97(H*3L-"B @(" @('T@(" @(" -"B @(" @( T*(" @(" @;7EF;V\R
M+G=H871E=F5R*"D[(" @( T*(" @(" @#0H@(" @("!F=6YC85]F;W)?;75L
M=&EP;&5?=&AR96%D<R_at_I.R @(" -"B @(" @(" @(" @(" @(" @(" @(" @
M( T*(" @(" @>PT*(" @(" @("!F;V\S(&UY9F]O,SL-"B @(" @(" @;7EF
M;V\S+G=H871E=F5R*"D[(" @( T*(" @(" @(" @(" @#0H@(" @(" @(&9O
M;S(@;7EF;V\R.PT*(" @(" @("!M>69O;S(N=VAA=&5V97(H*3L@(" @(" @
M(" -"B @(" @('T-"B @(" @( T*(" @(" @;7EF;V\R+G=H871E=F5R*"D[
M(" @(" @( T*(" @('T-"B @(" -"B @("!F;V\S(&UY9F]O,SL-"B @(" -
M"B @("!F;V\R.CIO;F-E7W!T<E]T('-M>69O;S(H<U]M>69O;S)B*3L-"B @
M("!I9B H<VUY9F]O,BD@>PT*(" @(" @<VUY9F]O,BT^=VAA=&5V97(H*3L-
M"B @(" @(&9U;F-A7V9O<E]M=6QT:7!L95]T:')E861S*"D[#0H@(" @("!M
M>69O;S,N=VAA=&5V97(H*3L@( T*(" @('T@( T*(" @( T*(" @(&9U;F-A
M7V9O<E]M=6QT:7!L95]T:')E861S*"D[#0H@('T-"B @#0H@(&EF("AS;7EF
M;V]A82D@>PT*(" @('-M>69O;V%A+3YW:&%T979E<B_at_[hidden]*("!](" @(" @
M#0H@( T*("!F=6YC85]F;W)?;75L=&EP;&5?=&AR96%D<R_at_[hidden]*?0T*#0H-
M"FEN="!M86EN*&EN="!A<F=C+"!C:&%R("IA<F=V6UTI#0I[#0H@(&9U;F-A
M7V9O<E]M=6QT:7!L95]T:')E861S*"D[(" @( T*("!F=6YC8E]F;W)?;75L
M=&EP;&5?=&AR96%D<R_at_[hidden]*("!F=6YC85]F;W)?;75L=&EP;&5?=&AR96%D
M<R_at_I.R @(" -"B @9G5N8V)?9F]R7VUU;'1I<&QE7W1H<F5A9',H*3L@( T*
6#0H@(')E='5R;B P.PT*?0T*#0H-"@``
`
end


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk