Commit Graph

202 Commits

Author SHA1 Message Date
Charlie Groves 8a7f4c4121 Clarify that SetListeners get all Entry events, not just the ones for a particular set
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4939 542714f4-19e9-0310-aa3c-eee0fc999fb1
2008-02-19 23:05:30 +00:00
Charlie Groves 7564f88796 Expose the type on Entry* events to SetListener and SetAdapter
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4938 542714f4-19e9-0310-aa3c-eee0fc999fb1
2008-02-19 20:40:09 +00:00
Michael Bayne 13fe8fc930 On second thought, reference equality is really the only appropriate thing for
DObject. There will never be multiple instances with the same oid that
represent "equal" objects and it's possible that in certain (controlled and
limited) cirumstances, objects with different object managers might have the
same oid even though they are different objects.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4853 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-10-20 18:50:27 +00:00
Michael Bayne 4280391d03 Implemented hashCode() and equals() as it could come in handy if we want to
stick objects in a collection.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4852 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-10-20 18:48:06 +00:00
Michael Bayne 810969f6f9 Pass a message along with a FailureResponse.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4819 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-08-22 01:15:39 +00:00
Michael Bayne 9a150ebcda Some widening.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4818 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-08-22 01:12:02 +00:00
Michael Bayne 3c4c633b60 Created a ResultListenerList that maps the InvocationService.ResultListener
interface to a list of listeners. Also made RootDObjectManager a RunQueue so
that we can pass around references to the interface rather than requiring a
PresentsDObjectMgr.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4789 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-07-27 20:48:18 +00:00
Dave Hoover 3b701ef57d Tabs -> spaces
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4742 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-06-26 00:07:36 +00:00
Michael Bayne 2fa6146d93 Have CompoundEvent handle propagating setTargetOid() to its internal events and
clean things up for the callers.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4731 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-06-13 23:15:20 +00:00
Michael Bayne 17e36673d0 Beans, frank!
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4717 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-05-18 23:23:13 +00:00
Michael Bayne 9bcca099ac Implemented a Ray-proposed solution where we keep track of events that were
(pre-applied and) posted before we received our object but processed (and hence
dispatched to us) after we received our object.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4715 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-05-18 03:37:14 +00:00
Michael Bayne db3fe80e9d No need for that variable.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4714 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-05-18 02:47:25 +00:00
Michael Bayne 0c90344e6b Widened, added a workaround for a "doesn't actually break anything and is too
complex to properly fix right now" bug.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4713 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-05-18 02:46:47 +00:00
Michael Bayne f8ef4aeebc Instead of doing two instanceofs on every compare, just wrap bare keys in a
fake Entry implementation. This also avoids breakage if a DSet entry's key
itself implements DSet.Entry (which just happened for the first time in Narya
history).


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4673 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-04-23 18:59:29 +00:00
Ray Greenwell c4fac45b9c Created a ServerMessageEvent that is just like a normal MessageEvent
except that messages will never leave the server. If generated on a client,
they'll go to the server and be processed like a normal event there
(event handlers will be called) but the event will not leave the server and
be sent to subscribing clients.

Changed the ManagerCaller used by PlaceObjects to use ServerMessageEvents.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4648 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-04-06 19:00:41 +00:00
Michael Bayne 30a2269c32 Log a warning to go with our stack trace and add a comment to explain why we
don't in the other case.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4630 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-03-18 17:02:57 +00:00
Michael Bayne 09f0bee0f3 Yet more header patrol.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4602 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-02-24 00:39:27 +00:00
Michael Bayne 9c03e16434 Added Iterable<E> constructor; widened.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4575 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-02-13 19:12:17 +00:00
Michael Bayne 03dab36e3e Asynchronous programming is hard. We have long had the problem where code would
queue up an invoker unit which would go off and do some database stuff and then
by the time it came back and was ready to publish its results to a distributed
object, the object in question would have been destroyed for any of a variety
of fairly natural reasons (client disconnected or logged off, game was
abandoned, dog ate homework).

One "solution" to this problem would be to litter our games' code with
thousands of calls to isActive() in the handleResult() methods of our invoker
units. We've done a bit of that in Yohoho but I've resisted starting down that
path in our other games.

Another solution would be to create an Invoker.Unit wrapper that takes a
reference to the distributed object (or objects) that it will be modifying and
have the common unit code check that the object(s) in question are still alive
at the end of the asynchronous operation and not call handleResult() if they
are not. This has numerous problems: what do you do if one object is alive but
not another, how do you incorporate this functionality in with the numerous
other Invoker.Unit derivations we have that simplify our lives in other ways
(without getting crazy and starting to use something like AOP), do you silently
abort the operation or log something?

So instead, I've come around to the idea that this is simply a dirty fact of
life in asynchronous programming and the fact that we can accept modifications
to distributed state after the distribted object in question is dead is a good
thing. We used to log a warning every time this happened and freak out even
more substantially if one tried to start a transaction on a dead object. Now we
will simply log an informational message (I don't think this sort of thing
should be silently ignored because there are some cases where it is an
indication of incorrect code, those are simply more rare). We will also allow a
transaction to be started on a dead object and when the transaction is
committed, all the events involved will be dropped just like a single
modification would have been dropped on that object.

This allows the most sensible thing to happen which is any results that are
published to still live objects will actually be published and results
published to dead objects will be dropped without making a big fuss. Since a
dead object by definition cannot have subscribers, no one could possibly have
cared about the dropped events anyway.

Also widened.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4545 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-02-09 20:33:47 +00:00
Michael Bayne b49fd02c7d Widened added setTargetOid().
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4528 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-02-03 01:12:12 +00:00
Mike Thomas 5640073272 Add a new value accessor for byte values.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4504 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-01-16 21:43:42 +00:00
Michael Bayne 84e21d0125 Yay for varargs!
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4498 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-01-05 00:27:00 +00:00
Michael Bayne 35082bbaca New and improved lint removal.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4438 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-10-26 23:00:20 +00:00
Andrzej Kapolka 83b9ce29d2 I believe this should be null, rather than Object.class; the system was
looking for something assignable from Object (rather than the other 
way around) when the argument was null.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4346 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-08-25 19:13:04 +00:00
Michael Bayne 6a47c766cc Switched to a better name.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4345 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-08-24 18:42:22 +00:00
Michael Bayne b4d66588c1 Added some magic on the road toward more elegant support for dynamic languages
like Groovy and JRuby. Created a DynamicEventDispatcher that automatically maps
attribute, element and set events to methods. Say you have a field:

  public DSet occupantInfo;

you can create a method in any class:

  public void occupantInfoAdded (BodyObject source, OccupantInfo entry);

and then bind that class as a listener using the dynamic event dispatcher:

  _myobj.addListener(new DynamicEventDispatcher(object));

I also created a nicer replacement for the MessageHandler system which is
clunky but still way simpler than using a full InvocationService. Basically we
dispatch MessageEvent as if it were a method call. 

For example, in AtlantiManager I define:

    public void placeTile (BodyObject placer, AtlantiTile tile)

which receives a request by a player to place a tile on their turn. Then in
AtlantiController, I simply call:

   _atlobj.manager.invoke("placeTile", tile);

Of course, in JRuby and Groovy, that's going to look like:

   _atlobj.manager.placeTile(tile);

which is all part of the fun.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4344 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-08-24 17:35:32 +00:00
Michael Bayne bc9f53396c Revamped distributed object creation. There was no particular reason to create
distributed objects by reflection since we don't allow clients to create
objects, furthermore we needn't do it asynchronously. The object creation
methods were moved into the server-side only interface and made "immediate", so
the caller creates a derived instance of DObject and registers it with the
system instead of creating it with a Subscriber callback.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4342 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-08-23 23:46:48 +00:00
Michael Bayne e1b68c4cd9 Display the entry first then the set.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4311 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-08-09 02:47:50 +00:00
Michael Bayne 5def25058a Avoid sticking a fork in things if we are asked to remove a null key.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4268 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-07-18 01:08:31 +00:00
Ray Greenwell fc91faf25f Standardized what we do in cases where a CloneNotSupportedException occurs
where we don't think it ever will.
Instead of returning null, or the exception, always throw a runtime
with just the CloneNotSupportedException as the argument, as this will
contain the most information and will preserve the stack trace.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4264 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-07-13 18:07:27 +00:00
Michael Bayne 8afd0316ec I decided to go hog wild and clean up all the type use in Presents which
required some serious bending and folding of the generic type system, but for
the most part we managed to avoid any mutilating. The gendobj task now
generates properly typed "addToXXX" and "updateXXX" DSet methods based on the
parameterized type of the DSet. This might cause unrecompiled code to break,
but I don't think there are many cases in the base toolkit where people call
DSet adders or updaters. We'll see and I'll add backwards compatibility
versions for cases where we need them to support GG games (everything else we
can just recompile).


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4245 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-07-05 00:55:05 +00:00
Michael Bayne 0a5953bf17 Chipping away at proper type safety for all of the Narya code.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4232 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-06-27 17:46:36 +00:00
Michael Bayne c0a244cb8d Hold onto your hats kids, it's the biggest little refactor this side of the
Pecos. I'll sort out the per-project niggling bits in just a moment.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4209 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-06-23 18:12:45 +00:00
Michael Bayne 2f3ecdf86d Some backwards compatibility bits.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4207 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-06-21 08:40:20 +00:00
Ray Greenwell 79c6427c21 StringBuffer -> StringBuilder.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4191 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-06-13 22:42:20 +00:00
Michael Bayne 331c3b285f A whole monkey load of type-safety and the addition of typedClone() which
returns a properly typed clone of the DSet in question.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4164 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-05-31 04:14:42 +00:00
Michael Bayne b2896dc7ff Minna daisuki type safety.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4075 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-04-28 18:29:46 +00:00
Ray Greenwell 481722188d Removed some unneeded casts now that the _entries array
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4064 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-04-26 21:32:09 +00:00
Michael Bayne 0e27af2af4 Because we defined DSet as parameterized on <E extends DSet.Entry> it rewrites
all generic references to E as DSet.Entry rather than Object which is what I
was assuming. So when I write:

(E[])new Object[...]

that gets rewritten to:

(Entry[])new Object[...]

which causes le freakout. We need to use Entry[] everywhere, which we happened
to be doing for everything except toArray().

I rewrote things to use E[] everywhere now that I know it will get rewritten to
Entry[]. I thought it was going to get rewritten to Object[] before so I didn't
genericize that stuff.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4059 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-04-26 02:13:10 +00:00
Michael Bayne 918d38a3b1 Implement Iterable. Whee!
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4054 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-04-25 02:07:32 +00:00
Michael Bayne a4c7ecb5e3 Made DSet (sort of) type safe. To be really really typesafe DSet.Entry would
have to be parameterized on the type of the Comparable that is returned by
getKey(), but that turns out to be a twisty maze of generics that is not
obvious to me how to express using Java's generics syntax and it opens up
various cans of worms that I don't have time to solve right now. So we'll
settle for the DSet itself being parameterized on the Entry class and the Entry
class being non-type safe.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4051 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-04-24 22:02:48 +00:00
Michael Bayne ad49401543 Proguard fucks up if we use clone(). There's no apparent way to find out why it
magically booches and causes an IncompatibleClassChangeError, so we're just
going to work around it.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4008 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-04-10 20:16:44 +00:00
Ray Greenwell 333d476a4a Use array cloning rather than creating a new one and copying into it.
(It may be the same thing under the hood, but our pal Occam would approve.)


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3958 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-03-17 22:29:00 +00:00
Ray Greenwell 7336f11d6f Shrink capacity in DSets upon element removal if the capacity is 8x larger
than it needs to be.
Broke streaming compatibility in order to be much more efficient over the wire.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3938 542714f4-19e9-0310-aa3c-eee0fc999fb1
2006-03-11 02:43:32 +00:00
Ray Greenwell 5bd90aa797 Stop using TrackedObjects.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3726 542714f4-19e9-0310-aa3c-eee0fc999fb1
2005-10-11 19:17:43 +00:00
Ray Greenwell 16322b1422 Added some warnings for illegal DSet operations and added a small
optimization in the process.
Previously, we dumped stack on the server if a entry add was illegal but
did nothing for update/remove.
On the client, we complained for updates and (indirectly) adds, but not
removes.
Now we complain everywhere.
And- as an added bonus, on the server we now do only one binary search for
updates and removals. Whee!


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3528 542714f4-19e9-0310-aa3c-eee0fc999fb1
2005-04-29 02:30:23 +00:00
Ray Greenwell ec31df7a99 Removed cruft.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3486 542714f4-19e9-0310-aa3c-eee0fc999fb1
2005-04-14 20:39:56 +00:00
Ray Greenwell be8a755dad The generic set updaters weren't working because proguard renamed the
methods they were looking for.

Since it's probably impossible to have proguard generically skip renaming
for these generated method names, let's update the fields in a different way.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3434 542714f4-19e9-0310-aa3c-eee0fc999fb1
2005-03-28 22:31:46 +00:00
Ray Greenwell 12b267dbae One day we hope to implement Iterable, let's implement the standard
'iterator()' name and deprecate the old 'entries()' method.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3405 542714f4-19e9-0310-aa3c-eee0fc999fb1
2005-03-15 01:40:22 +00:00
Michael Bayne aa80b920c8 More documentation updates.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3315 542714f4-19e9-0310-aa3c-eee0fc999fb1
2005-01-27 04:48:00 +00:00