TODO:
* Ensure that we can have our 'non-threaded' thread be any thread.
* Turn off the global 'fast_calls' variable, to knobble
old stubs, and go with the new ABI.
* Cross thread Object references
+ I think the way to fix this is by using a different
interface->adaptor_type: ORBIT_ADAPTOR_POA_THREADED,
such that the fast case will always drop through to
small_invoke_stub_n, where we can get far more creative.
* Threading
+ GIOPMessageQueueEntry needs to hold a cnx ref.
+ orb->current_invocations needs to be per-thread ...
also, we should push a stack-data pointer.
+ Need to emit 'broken' connection - via the listen/unlisten
stuff in the main thread ... [ and garentee the same
invariants as previously ? cnx status etc. ? ]
+ Create a per-object policy 'PROCESS_REENTERANTLY', using our
VPVID space; takes a boolean ... set it on the object ...
[ make some libbonobo wrappers to improve the situation ]
+ CORBA_Object_non_existant - needs to do a blocking
check for CONNECTED / DISCONNETED.
+ bin redundant forwards in poa.c
+ giop_recv_thread_fn - more work needed
+ ** ERROR **: Need to handle zapped cnx' async callbacks
* User friendliness
+ tolerate NULL CORBA_Environments in stubs
+ 'sequence from GList' API.
+ always return initialized memory on exception
+ add an X like 'event' processing API for incoming bits (?)
* GIOP fragments
/ + need to handle a cancel request in the middle of a fragment stream
* It seems the local case optimization can go wrong when
invoking bogus methods from a different interface on an Object ref.
+ this is to do with
a) not checking the vepv offset we get
b) not expanding the lookup of the vepv offset at all.
* Thread safety
+ For independent clients, we need some way to
arbitrate the giop_recv_buffer_get method - so
that either: a single thread does the poll and the
rest block, or we all poll.
+ apparently g_object_ref / unref are not thread safe
we need linc_object_ref / unref instead that does
a LINC_MUTEX_LOCK on the global object lifecycle lock
that needs to move into linc ... sigh !
+ we need to ensure that linc does no signal emissions,
since these are horribly slow and again not safe.
* Optimization
+ we need 2 de-marshalling routines, 1 with (slow)
byteswap and 1 without it, save scads and scads of
branch cache misses; easy to do too; make it a virtual
method on the recv buffer (?) [ for easy chaining ]
+ we need some concept of align == native align flagged
on TypeCodes, so we can blat things quickly with memcpy
in a generic way - eg. sequences of octets.
+ we need to implement 'wait for completion' on
shutdown so that we can activate async unrefs in
bonobo.
* Dragons:
+ giop_recv_buffer.c (giop_connection_handle_input)
manages to go through the error condition a whole
load; _why_ is this ? - is it a recursive effect on
the method ? why are we called if there is no data ?
+ We need a typecast in an _allocbuf which we know is
aliased, eg. PortableServer_POAList_allocbuf, since
it gets assigned to a CORBA_Object *, and the cast
is bogus.
Copyright 2K16 - 2K18 Indonesian Hacker Rulez