clay

Hex Artifact Content
Login
Become a Patron!

Artifact 625cb9e5c35d921dc35697c57b8038ff020fb7d7536c5efa3aa1b802f6ba98ed:

Wiki page [Event Handling] by hypnotoad 2018-09-19 05:08:09.
0000: 44 20 32 30 31 38 2d 30 39 2d 31 39 54 30 35 3a  D 2018-09-19T05:
0010: 30 38 3a 30 39 2e 39 31 31 0a 4c 20 45 76 65 6e  08:09.911.L Even
0020: 74 5c 73 48 61 6e 64 6c 69 6e 67 0a 4e 20 74 65  t\sHandling.N te
0030: 78 74 2f 78 2d 6d 61 72 6b 64 6f 77 6e 0a 55 20  xt/x-markdown.U 
0040: 68 79 70 6e 6f 74 6f 61 64 0a 57 20 34 32 31 36  hypnotoad.W 4216
0050: 0a 49 6e 20 62 65 74 77 65 65 6e 20 77 6f 72 6b  .In between work
0060: 20 61 6e 64 20 65 64 69 74 69 6e 67 20 63 6f 6e   and editing con
0070: 66 65 72 65 6e 63 65 20 70 61 70 65 72 73 2c 20  ference papers, 
0080: 49 20 68 61 64 20 61 20 62 72 61 69 6e 73 74 6f  I had a brainsto
0090: 72 6d 2e 20 41 6e 64 20 74 68 61 74 20 62 72 61  rm. And that bra
00a0: 69 6e 73 74 6f 72 6d 20 69 73 20 6e 6f 77 20 43  instorm is now C
00b0: 6c 61 79 27 73 20 6e 65 77 20 65 76 65 6e 74 20  lay's new event 
00c0: 65 6e 67 69 6e 65 2e 20 57 68 61 74 20 49 27 76  engine. What I'v
00d0: 65 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 69  e come up with i
00e0: 73 20 74 68 61 74 3a 0d 0a 0d 0a 31 2e 20 4f 62  s that:....1. Ob
00f0: 6a 65 63 74 73 20 69 6e 20 43 6c 61 79 20 77 69  jects in Clay wi
0100: 6c 6c 20 61 6c 6c 20 68 61 76 65 20 61 20 63 6f  ll all have a co
0110: 6d 6d 6f 6e 20 61 6e 63 65 73 74 6f 72 20 77 68  mmon ancestor wh
0120: 6f 20 75 6e 64 65 72 73 74 61 6e 64 73 20 61 6c  o understands al
0130: 6c 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  l of the framewo
0140: 72 6b 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 2e  rk interactions.
0150: 20 0d 0a 32 2e 20 4f 62 6a 65 63 74 73 20 64 75   ..2. Objects du
0160: 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 77 69  ring creation wi
0170: 6c 6c 20 62 6f 6c 74 20 6f 6e 20 61 64 64 69 74  ll bolt on addit
0180: 69 6f 6e 61 6c 20 62 65 68 61 76 69 6f 72 73 20  ional behaviors 
0190: 76 69 61 20 74 68 65 20 6d 69 78 69 6e 20 6d 65  via the mixin me
01a0: 63 68 61 6e 69 73 6d 20 69 6e 20 54 63 6c 4f 4f  chanism in TclOO
01b0: 2e 20 0d 0a 33 2e 20 49 6e 73 74 65 61 64 20 6f  . ..3. Instead o
01c0: 66 20 69 6e 76 6f 6b 69 6e 67 20 65 61 63 68 20  f invoking each 
01d0: 6f 74 68 65 72 27 73 20 6d 65 74 68 6f 64 73 20  other's methods 
01e0: 64 69 72 65 63 74 6c 79 2c 20 6f 62 6a 65 63 74  directly, object
01f0: 73 20 77 69 6c 6c 20 74 68 72 6f 77 20 6d 65 73  s will throw mes
0200: 73 61 67 65 73 20 61 74 20 65 61 63 68 20 6f 74  sages at each ot
0210: 68 65 72 20 74 68 72 6f 75 67 68 20 61 6e 20 73  her through an s
0220: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 0d 0a  qlite database..
0230: 0d 0a 54 68 65 20 69 73 73 75 65 20 49 27 6d 20  ..The issue I'm 
0240: 6c 6f 6f 6b 69 6e 67 20 61 74 20 64 6f 77 6e 20  looking at down 
0250: 74 68 65 20 72 6f 61 64 20 69 73 20 77 65 20 61  the road is we a
0260: 72 65 20 70 72 6f 62 61 62 6c 79 20 67 6f 69 6e  re probably goin
0270: 67 20 74 6f 20 77 61 6e 74 20 6c 61 72 67 65 72  g to want larger
0280: 20 43 6c 61 79 20 73 69 6d 75 6c 61 74 69 6f 6e   Clay simulation
0290: 73 20 74 6f 20 65 69 74 68 65 72 20 62 65 20 62  s to either be b
02a0: 72 6f 6b 65 6e 20 61 63 72 6f 73 73 20 6d 75 6c  roken across mul
02b0: 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 6f 72  tiple threads or
02c0: 20 65 76 65 6e 20 6d 75 6c 74 69 70 6c 65 20 73   even multiple s
02d0: 65 72 76 65 72 73 2e 20 57 65 20 61 72 65 20 61  ervers. We are a
02e0: 6c 73 6f 20 67 6f 69 6e 67 20 74 6f 20 77 61 6e  lso going to wan
02f0: 74 20 43 6c 61 79 20 73 69 6d 75 6c 61 74 69 6f  t Clay simulatio
0300: 6e 73 20 74 6f 20 72 75 6e 20 61 70 61 72 74 20  ns to run apart 
0310: 66 72 6f 6d 20 61 20 47 55 49 27 73 20 6d 61 69  from a GUI's mai
0320: 6e 20 74 68 72 65 61 64 2e 20 41 20 73 69 6d 75  n thread. A simu
0330: 6c 61 74 69 6f 6e 20 67 6f 69 6e 67 20 68 6f 74  lation going hot
0340: 20 61 6e 64 20 68 65 61 76 79 20 63 6f 75 6c 64   and heavy could
0350: 20 65 66 66 65 63 74 69 76 65 6c 79 20 62 6c 6f   effectively blo
0360: 63 6b 20 61 20 77 65 62 73 65 72 76 65 72 20 66  ck a webserver f
0370: 72 6f 6d 20 72 65 73 70 6f 6e 64 69 6e 67 2e 20  rom responding. 
0380: 41 6e 64 20 75 73 65 72 73 20 6c 69 6b 65 20 74  And users like t
0390: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  o know that the 
03a0: 70 72 6f 67 72 61 6d 20 69 73 20 6a 75 73 74 20  program is just 
03b0: 62 75 73 79 2c 20 6e 6f 74 20 6a 75 73 74 20 6c  busy, not just l
03c0: 6f 63 6b 65 64 20 75 70 2e 0d 0a 0d 0a 4e 6f 77  ocked up.....Now
03d0: 20 69 6e 20 61 20 63 6f 6e 76 65 6e 74 69 6f 6e   in a convention
03e0: 61 6c 20 4f 4f 20 70 72 6f 67 72 61 6d 2c 20 79  al OO program, y
03f0: 6f 75 72 20 6f 62 6a 65 63 74 73 20 61 72 65 20  our objects are 
0400: 61 6c 6c 20 69 6e 20 6f 6e 65 20 62 69 67 20 68  all in one big h
0410: 61 70 70 79 20 66 61 6d 69 6c 79 2e 20 54 68 65  appy family. The
0420: 79 20 63 61 6e 20 69 6e 76 6f 6b 65 20 65 61 63  y can invoke eac
0430: 68 20 6f 74 68 65 72 27 73 20 70 75 62 6c 69 63  h other's public
0440: 20 6d 65 74 68 6f 64 73 2e 20 41 6e 64 20 65 76   methods. And ev
0450: 65 6e 20 64 6f 20 63 6f 6f 6c 20 74 68 69 6e 6b  en do cool think
0460: 73 20 6c 69 6b 65 20 74 68 72 65 61 64 20 61 20  s like thread a 
0470: 63 6f 72 6f 75 74 69 6e 65 20 74 68 72 6f 75 67  coroutine throug
0480: 68 20 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c  h the method cal
0490: 6c 73 2e 0d 0a 0d 0a 4c 65 74 27 73 20 74 61 6b  ls.....Let's tak
04a0: 65 20 61 20 73 69 6d 70 6c 65 20 69 6e 74 65 72  e a simple inter
04b0: 61 63 74 69 6f 6e 20 66 72 6f 6d 20 6d 79 20 64  action from my d
04c0: 61 79 73 20 6f 66 20 63 6f 64 69 6e 67 20 48 4c  ays of coding HL
04d0: 41 2c 20 74 68 72 6f 77 69 6e 67 20 61 20 62 65  A, throwing a be
04e0: 61 63 68 20 62 61 6c 6c 3a 0d 0a 0d 0a 20 20 20  ach ball:....   
04f0: 20 3a 3a 73 63 65 6e 65 3a 3a 6f 62 6a 65 63 74   ::scene::object
0500: 20 63 72 65 61 74 65 20 41 0d 0a 20 20 20 20 3a   create A..    :
0510: 3a 73 63 65 6e 65 3a 3a 6f 62 6a 65 63 74 20 63  :scene::object c
0520: 72 65 61 74 65 20 42 0d 0a 20 20 20 41 20 74 68  reate B..   A th
0530: 72 6f 77 5f 62 61 6c 6c 20 42 0d 0a 0d 0a 54 68  row_ball B....Th
0540: 65 20 67 6c 6f 62 61 6c 20 70 72 6f 67 72 61 6d  e global program
0550: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 76   is actually inv
0560: 6f 6b 69 6e 67 20 41 27 73 20 6d 65 74 68 6f 64  oking A's method
0570: 73 20 64 69 72 65 63 74 6c 79 2e 20 41 6e 64 20  s directly. And 
0580: 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68  we can assume th
0590: 61 74 20 62 65 68 69 6e 64 20 74 68 65 20 73 63  at behind the sc
05a0: 65 6e 65 73 20 74 68 61 74 20 2a 74 68 72 6f 77  enes that *throw
05b0: 5f 62 61 6c 6c 2a 20 69 73 20 70 72 6f 62 61 62  _ball* is probab
05c0: 6c 79 20 64 6f 69 6e 67 20 74 68 69 6e 67 73 20  ly doing things 
05d0: 77 69 74 68 20 42 27 73 20 6d 65 74 68 6f 64 73  with B's methods
05e0: 3a 0d 0a 0d 0a 20 20 20 20 6d 65 74 68 6f 64 20  :....    method 
05f0: 74 68 72 6f 77 5f 62 61 6c 6c 20 74 61 72 67 65  throw_ball targe
0600: 74 20 7b 0d 0a 20 20 20 20 20 20 20 24 74 61 72  t {..       $tar
0610: 67 65 74 20 77 61 73 5f 68 69 74 20 5b 73 65 6c  get was_hit [sel
0620: 66 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 6d  f]..    }..    m
0630: 65 74 68 6f 64 20 68 61 73 5f 68 69 74 20 77 68  ethod has_hit wh
0640: 6f 20 7b 0d 0a 20 20 20 20 20 20 20 70 75 74 73  o {..       puts
0650: 20 22 4f 75 63 68 22 0d 0a 20 20 20 20 7d 0d 0a   "Ouch"..    }..
0660: 0d 0a 57 68 65 6e 20 61 6c 6c 20 6f 66 20 79 6f  ..When all of yo
0670: 75 72 20 6f 62 6a 65 63 74 73 20 68 61 76 65 20  ur objects have 
0680: 61 6e 20 69 6e 73 74 61 6e 63 65 20 69 6e 20 74  an instance in t
0690: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20  he interpreter, 
06a0: 74 68 69 73 20 69 73 6e 27 74 20 61 6e 20 69 73  this isn't an is
06b0: 73 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 77 68  sue. However, wh
06c0: 61 74 20 69 66 20 41 20 61 6e 64 20 42 20 61 72  at if A and B ar
06d0: 65 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74  e in different t
06e0: 68 72 65 61 64 73 3f 20 57 68 61 74 20 69 66 20  hreads? What if 
06f0: 74 68 61 74 20 61 72 65 20 69 6e 20 64 69 66 66  that are in diff
0700: 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 3f  erent processes?
0710: 20 57 68 61 74 20 69 66 20 6f 62 6a 65 63 74 20   What if object 
0720: 41 20 61 6e 64 20 42 20 61 72 65 20 69 6e 20 73  A and B are in s
0730: 69 6d 75 6c 61 74 69 6f 6e 73 20 6f 6e 20 64 69  imulations on di
0740: 66 66 65 72 65 6e 74 20 63 6f 6d 70 75 74 65 72  fferent computer
0750: 73 3f 0d 0a 0d 0a 57 65 6c 6c 20 74 68 65 6e 20  s?....Well then 
0760: 61 6c 6c 20 6f 66 20 79 6f 75 72 20 63 61 6c 6c  all of your call
0770: 73 2c 20 66 72 6f 6d 20 74 68 65 20 73 69 6d 70  s, from the simp
0780: 6c 65 73 74 20 74 6f 20 74 68 65 20 6d 6f 73 74  lest to the most
0790: 20 63 6f 6d 70 6c 65 78 20 69 6e 76 6f 6c 76 65   complex involve
07a0: 20 61 20 6c 6f 74 20 6f 66 20 77 72 61 70 70 69   a lot of wrappi
07b0: 6e 67 20 63 6f 64 65 20 74 6f 20 64 69 72 65 63  ng code to direc
07c0: 74 20 6d 65 73 73 61 67 65 73 20 74 6f 20 74 68  t messages to th
07d0: 65 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20  e object on the 
07e0: 6f 74 68 65 72 20 65 6e 64 2c 20 61 6e 64 20 61  other end, and a
07f0: 77 61 69 74 20 61 20 72 65 70 6c 79 2e 0d 0a 0d  wait a reply....
0800: 0a 20 20 20 20 20 6d 65 74 68 6f 64 20 74 65 6c  .     method tel
0810: 6c 20 7b 6f 62 6a 65 63 74 20 77 68 61 74 20 61  l {object what a
0820: 72 67 73 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  rgs} {..        
0830: 73 65 74 20 6c 6f 63 61 74 69 6f 6e 20 5b 3a 3a  set location [::
0840: 77 68 65 72 65 69 73 3a 3a 6f 62 6a 65 63 74 20  whereis::object 
0850: 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20 20 20 20  $object]..      
0860: 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20    if {$location 
0870: 65 71 20 5b 6d 79 20 6c 6f 63 61 74 69 6f 6e 5d  eq [my location]
0880: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
0890: 24 6f 62 6a 65 63 74 20 24 77 68 61 74 20 7b 2a  $object $what {*
08a0: 7d 24 61 72 67 73 0d 0a 20 20 20 20 20 20 20 20  }$args..        
08b0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
08c0: 20 20 20 20 20 20 74 61 69 6c 63 61 6c 6c 20 3a        tailcall :
08d0: 3a 72 70 63 3a 3a 73 65 6e 64 20 24 7b 6f 62 6a  :rpc::send ${obj
08e0: 65 63 74 7d 40 24 7b 6c 6f 63 61 74 69 6f 6e 7d  ect}@${location}
08f0: 20 24 77 68 61 74 20 24 61 72 67 73 0d 0a 20 20   $what $args..  
0900: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 7d 20        }..     } 
0910: 0d 0a 20 20 20 20 20 6d 65 74 68 6f 64 20 74 68  ..     method th
0920: 72 6f 77 5f 62 61 6c 6c 20 74 61 72 67 65 74 20  row_ball target 
0930: 7b 0d 0a 20 20 20 20 20 20 20 20 20 6d 79 20 74  {..         my t
0940: 65 6c 6c 20 24 74 61 72 67 65 74 20 77 61 73 5f  ell $target was_
0950: 68 69 74 20 5b 73 65 6c 66 5d 0d 0a 20 20 20 20  hit [self]..    
0960: 20 20 7d 0d 0a 20 20 20 20 20 20 6d 65 74 68 6f    }..      metho
0970: 64 20 6f 75 63 68 69 65 20 7b 77 68 6f 7d 20 7b  d ouchie {who} {
0980: 0d 0a 20 20 20 20 20 20 20 20 20 70 75 74 73 20  ..         puts 
0990: 22 24 77 68 6f 20 73 61 79 73 20 6f 75 63 68 69  "$who says ouchi
09a0: 65 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  e"..      }..   
09b0: 20 20 20 6d 65 74 68 6f 64 20 68 61 73 5f 68 69     method has_hi
09c0: 74 20 77 68 6f 20 7b 0d 0a 20 20 20 20 20 20 20  t who {..       
09d0: 20 20 6d 79 20 74 65 6c 6c 20 24 77 68 6f 20 6f    my tell $who o
09e0: 75 63 68 69 65 20 5b 73 65 6c 66 5d 0d 0a 20 20  uchie [self]..  
09f0: 20 20 20 20 7d 0d 0a 0d 0a 57 68 69 63 68 20 77      }....Which w
0a00: 6f 72 6b 73 2c 20 75 70 20 74 6f 20 61 20 70 6f  orks, up to a po
0a10: 69 6e 74 2e 20 41 6e 64 20 74 68 61 74 20 70 6f  int. And that po
0a20: 69 6e 74 20 69 73 20 77 68 65 6e 20 79 6f 75 20  int is when you 
0a30: 68 61 76 65 20 61 20 66 65 77 20 68 75 6e 64 72  have a few hundr
0a40: 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
0a50: 65 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ere written to d
0a60: 65 6d 61 6e 64 20 69 6e 73 74 61 6e 74 20 67 72  emand instant gr
0a70: 61 74 69 66 69 63 61 74 69 6f 6e 20 74 6f 20 74  atification to t
0a80: 68 65 69 72 20 61 6e 73 77 65 72 73 20 64 6f 69  heir answers doi
0a90: 6e 67 20 61 6c 6c 20 73 6f 72 74 73 20 6f 66 20  ng all sorts of 
0aa0: 62 6c 6f 63 6b 69 6e 67 20 77 68 69 6c 65 20 74  blocking while t
0ab0: 68 65 20 6e 65 74 77 6f 72 6b 20 74 72 69 65 73  he network tries
0ac0: 20 74 6f 20 6b 65 65 70 20 75 70 2e 0d 0a 0d 0a   to keep up.....
0ad0: 54 68 65 20 6d 6f 64 65 6c 20 49 20 68 61 76 65  The model I have
0ae0: 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 69 73   come up with is
0af0: 20 6d 6f 72 65 20 6c 69 6b 65 20 61 6e 20 6f 6c   more like an ol
0b00: 64 20 66 61 73 68 69 6f 6e 65 64 20 63 6f 72 72  d fashioned corr
0b10: 65 73 70 6f 6e 64 65 6e 63 65 20 67 61 6d 65 20  espondence game 
0b20: 6f 66 20 63 68 65 73 73 2e 20 54 68 65 20 70 6c  of chess. The pl
0b30: 61 79 65 72 73 20 6d 61 69 6c 20 74 68 65 69 72  ayers mail their
0b40: 20 6d 6f 76 65 73 20 74 6f 20 6f 6e 65 20 61 6e   moves to one an
0b50: 6f 74 68 65 72 2c 20 61 6e 64 20 64 6f 6e 27 74  other, and don't
0b60: 20 6d 61 6b 65 20 61 6e 6f 74 68 65 72 20 6d 6f   make another mo
0b70: 76 65 20 75 6e 74 69 6c 20 74 68 65 79 20 67 65  ve until they ge
0b80: 74 20 74 68 65 20 6e 65 78 74 20 6d 6f 76 65 20  t the next move 
0b90: 66 72 6f 6d 20 74 68 65 69 72 20 6f 70 70 6f 6e  from their oppon
0ba0: 65 6e 74 2e 0d 0a 0d 0a 20 20 20 20 6d 65 74 68  ent.....    meth
0bb0: 6f 64 20 74 65 6c 6c 20 7b 68 65 61 64 65 72 73  od tell {headers
0bc0: 20 63 6f 6e 74 65 6e 74 7d 20 7b 0d 0a 20 20 20   content} {..   
0bd0: 20 20 20 20 20 23 20 43 6f 64 65 20 74 6f 20 67       # Code to g
0be0: 65 6e 65 72 61 74 65 20 61 6e 64 20 73 71 6c 20  enerate and sql 
0bf0: 72 65 63 6f 72 64 0d 0a 20 20 20 20 20 20 20 72  record..       r
0c00: 65 74 75 72 6e 20 24 6d 73 67 5f 75 75 69 64 0d  eturn $msg_uuid.
0c10: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 6d  .    }....     m
0c20: 65 74 68 6f 64 20 74 68 72 6f 77 5f 62 61 6c 6c  ethod throw_ball
0c30: 20 7b 77 68 6f 7d 20 7b 0d 0a 20 20 20 20 20 20   {who} {..      
0c40: 20 20 73 65 74 20 6d 73 67 5f 75 75 69 64 20 5b    set msg_uuid [
0c50: 6d 79 20 74 65 6c 6c 20 5b 6c 69 73 74 20 6d 73  my tell [list ms
0c60: 67 5f 72 63 70 74 20 77 68 6f 20 6d 73 67 5f 73  g_rcpt who msg_s
0c70: 75 62 6a 65 63 74 20 68 61 73 5f 68 69 74 5d 20  ubject has_hit] 
0c80: 7b 7d 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 50  {}]..        # P
0c90: 6f 6c 6c 20 75 6e 74 69 6c 20 77 65 20 67 65 74  oll until we get
0ca0: 20 61 20 72 65 70 6c 79 0d 0a 20 20 20 20 20 20   a reply..      
0cb0: 20 20 77 68 69 6c 65 20 31 20 7b 0d 0a 20 20 20    while 1 {..   
0cc0: 20 20 20 20 20 20 20 20 20 6d 79 20 3c 64 62 3e           my <db>
0cd0: 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a 20   eval {select * 
0ce0: 66 72 6f 6d 20 6d 65 73 73 61 67 65 73 20 77 68  from messages wh
0cf0: 65 72 65 20 6d 73 67 5f 72 65 70 6c 79 3d 3a 6d  ere msg_reply=:m
0d00: 73 67 5f 75 75 69 64 7d 20 7b 0d 0a 20 20 20 20  sg_uuid} {..    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0d20: 72 6e 20 24 6d 73 67 5f 63 6f 6e 74 65 6e 74 0d  rn $msg_content.
0d30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
0d40: 20 20 20 20 20 20 20 20 79 69 65 6c 64 0d 0a 20          yield.. 
0d50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 7d         }..     }
0d60: 0d 0a 0d 0a 0d 0a 20 20 20 20 20 6d 65 74 68 6f  ......     metho
0d70: 64 20 73 74 65 70 20 7b 7d 20 7b 0d 0a 20 20 20  d step {} {..   
0d80: 20 20 20 20 20 20 73 65 74 20 72 63 70 74 20 5b        set rcpt [
0d90: 6d 79 20 75 75 69 64 5d 0d 0a 20 20 20 20 20 20  my uuid]..      
0da0: 20 20 20 6d 79 20 3c 64 62 3e 20 65 76 61 6c 20     my <db> eval 
0db0: 7b 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 6d  {select * from m
0dc0: 65 73 73 61 67 65 20 77 68 65 72 65 20 6d 73 67  essage where msg
0dd0: 5f 72 63 70 74 3d 3a 75 75 69 64 7d 20 72 65 63  _rcpt=:uuid} rec
0de0: 6f 72 64 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ord {..         
0df0: 20 20 20 6d 79 20 72 65 61 63 74 20 24 6d 73 67     my react $msg
0e00: 5f 73 75 62 6a 65 63 74 20 5b 61 72 72 61 79 20  _subject [array 
0e10: 67 65 74 20 72 65 63 6f 72 64 5d 0d 0a 20 20 20  get record]..   
0e20: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 7d 0d        }..     }.
0e30: 0a 20 20 20 20 20 6d 65 74 68 6f 64 20 72 65 61  .     method rea
0e40: 63 74 20 7b 73 75 62 6a 65 63 74 20 6d 73 67 69  ct {subject msgi
0e50: 6e 66 6f 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  nfo} {..        
0e60: 20 20 64 69 63 74 20 77 69 74 68 20 6d 73 67 69    dict with msgi
0e70: 6e 66 6f 20 7b 7d 0d 0a 20 20 20 20 20 20 20 20  nfo {}..        
0e80: 20 20 69 66 20 7b 24 73 75 62 6a 65 63 74 20 65    if {$subject e
0e90: 71 20 22 68 61 73 5f 68 69 74 22 7d 20 7b 0d 0a  q "has_hit"} {..
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20               my 
0eb0: 74 65 6c 6c 20 24 6d 73 67 5f 73 65 6e 64 65 72  tell $msg_sender
0ec0: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
0ed0: 20 20 20 20 20 20 20 20 20 20 6d 73 67 5f 72 63            msg_rc
0ee0: 70 74 20 24 6d 73 67 5f 73 65 6e 64 65 72 20 5c  pt $msg_sender \
0ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0f00: 20 20 6d 73 67 5f 73 75 62 6a 65 63 74 20 6f 75    msg_subject ou
0f10: 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ch \..          
0f20: 20 20 20 20 20 20 6d 73 67 5f 72 65 70 6c 79 20        msg_reply 
0f30: 24 6d 73 67 5f 75 75 69 64 20 5c 0d 0a 20 20 20  $msg_uuid \..   
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73 67               msg
0f50: 5f 63 6f 6e 74 65 6e 74 20 7b 4f 75 63 68 7d 5d  _content {Ouch}]
0f60: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0f70: 20 20 20 20 7d 0d 0a 0d 0a 41 6c 6c 20 6f 66 20      }....All of 
0f80: 74 68 65 20 70 72 6f 63 65 73 73 65 73 20 61 6e  the processes an
0f90: 64 20 74 68 72 65 61 64 73 20 72 75 6e 6e 69 6e  d threads runnin
0fa0: 67 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6d 61  g on the same ma
0fb0: 63 68 69 6e 65 20 63 61 6e 20 73 68 61 72 65 20  chine can share 
0fc0: 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74 65 20  a single sqlite 
0fd0: 64 61 74 61 62 61 73 65 2e 20 46 6f 72 20 63 6c  database. For cl
0fe0: 75 73 74 65 72 20 70 72 6f 63 65 73 73 65 73 2c  uster processes,
0ff0: 20 49 20 63 6f 75 6c 64 20 73 65 65 20 61 20 6d   I could see a m
1000: 65 63 68 61 6e 69 73 6d 20 62 79 20 77 68 69 63  echanism by whic
1010: 68 20 61 6e 20 6f 75 74 73 69 64 65 20 70 72 6f  h an outside pro
1020: 63 65 73 73 20 63 6f 6e 74 72 6f 6c 73 20 74 68  cess controls th
1030: 65 20 74 69 6d 73 65 74 65 70 2c 20 61 6e 64 20  e timsetep, and 
1040: 74 68 65 6e 20 72 65 70 6c 69 63 61 74 65 73 20  then replicates 
1050: 6d 65 73 73 61 67 65 73 20 6f 76 65 72 20 55 44  messages over UD
1060: 50 20 6f 72 20 76 69 61 20 68 74 74 70 2e 0d 0a  P or via http...
1070: 0d 0a 49 6e 20 6d 79 20 6e 65 78 74 20 69 6e 73  ..In my next ins
1080: 74 61 6c 6c 6d 65 6e 74 20 49 27 6c 6c 20 62 65  tallment I'll be
1090: 20 67 6f 69 6e 67 20 6f 76 65 72 20 74 68 65 20   going over the 
10a0: 6d 69 78 69 6e 20 73 74 75 66 66 2e 20 46 6f 72  mixin stuff. For
10b0: 20 6e 6f 77 20 73 6c 65 65 70 20 69 73 20 63 61   now sleep is ca
10c0: 6c 6c 69 6e 67 2e 2e 2e 2e 0a 5a 20 63 35 37 62  lling.....Z c57b
10d0: 39 32 34 34 35 62 66 30 31 36 61 65 34 37 65 65  92445bf016ae47ee
10e0: 37 33 32 33 36 63 63 61 34 36 34 38 0a           73236cca4648.