TODO:

* Threading 
	+ bin redundant forwards in poa.c
	+ giop_recv_thread_fn - more work needed
	+ unsafe bits
		+ 'random' number generation - the per obj idx ?
	+ Lock order:
		POAManager
			POAObject
				POA (OAObject)
					ORB lock
	+ ** 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.