Commit Graph

24 Commits

Author SHA1 Message Date
Keith Rothman
dbc9debbbf Move exported functions used in capabilityHelper.h from extern "C" to api.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2020-03-02 06:49:59 -08:00
Keith Rothman
3b2eedb741 Rearrange declarations to avoid circular imports.
Circular imports make import pxd's order sensitive, and violating this
order results in hard to understand errors.  As far as I can tell, this
rearrangement removes the circular nature, and has no other side
affects.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2020-02-28 16:43:28 -08:00
Andrey Cizov
7bce2f751a fix #181 2019-12-26 22:13:34 -08:00
Jacob Alexander
f6dd08dda6 Removing deprecated Restorer and ezRestore references
- Not recommended to be used in new designs
- Just pollutes warning messages during compilation (hiding ones that
should be fixed)
- Updated test code to use bootstrap
- Sped up some of the test code that was just sleeping while waiting for
the server (now polling for the socket)
2019-10-14 23:19:39 -07:00
Jacob Alexander
8915ef79f1 TwoWayPipe and basic asyncio support
Note: I've tried not to break any behaviour of the previously working APIs

Python API Changes / Additions
- capnp/lib/capnp.pyx
  * class _RemotePromise
    + [Added] cpdef _wait(self)
      = Exception raising code that used to be inside of wait(self)
    + [Modified] def wait(self)
      = Same functionality as before
    + [Added] async def a_wait(self)
      = Cannot use await as that's a reserved keyword
      = Uses pollRemote and asyncio.sleep(0) to make call asynchronous
  * class _TwoPartyVatNetwork
    + [Added] cdef _init_pipe(self, _TwoWayPipe pipe, Side side,
    schema_cpp.ReaderOptions opts)
      = Instanciates a TwoPartyVatNetwork using a TwoWayPipe (instead of
      using a file handle or connection as before)
  * class TwoPartyClient
    + [Modified] def __init__(self, socket=None, restorer=None,
    traversal_limit_in_words=None, nesting_limit=None)
      = Changes the socket parameter to be optional
      = If socket is not specified, default to using a TwoWayPipe
    + [Added] async def read(self, bufsize)
      = awaitable function that blocks until data has been read
      = bufsize defines the maximum amount of data to be read back
        (e.g. 4096 bytes)
      = Reads data from TwoWayPipe
    + [Added] def write(self, data)
      = Write data to TwoWayPipe
      = Not awaitable as the write interface of the TwoWayPipe doesn't
      have poll functionality
  * class TwoPartyServer
    + [Modified] def __init__(self, socket=None, restorer=None,
    server_socket=None, bootstrap=None, traversal_limit_in_words=None,
    nesting_limit=None)
      = Changes the socket parameter to be optional
      = If socket is not specified, default to using a TwoWayPipe
      = Simplified code by removing an else (self._connect)
    + [Added] async def read(self, bufsize)
      = awaitable function that blocks until data has been read
      = bufsize defines the maximum amount of data to be read back
        (e.g. 4096 bytes)
      = Reads data from TwoWayPipe
    + [Added] def write(self, data)
      = Write data to TwoWayPipe
      = Not awaitable as the write interface of the TwoWayPipe doesn't
      have poll functionality
    + [Added] async def poll_forever(self)
      = asyncio equivalent of run_forever()
  * class _TwoWayPipe
    + Wrapper class for TwoWayPipe

Other Additions
- capnp/helpers/asyncHelper.h
  * pollWaitScope
    + Pumps the kj event handler
    + Used for the TwoWayServer
  * pollRemote
    + Polls a remote promise
    + i.e. a capnp RPC call
- capnp/helpers/asyncIoHelper.h
  * AsyncIoStreamReadHelper
    + I wasn't able to figure out Promise[size_t] using Cython so this was
    the next best thing I could think of doing
    + Was needed to handle read polling from a read promise
      = Polling is used for asyncio as kj waits need a wrapper to be
      compatible
- capnp/lib/capnp.pyx
  * makeTwoWayPipe
    + Wrapper for kj newTwoWayPipe function
  * poll_once
    + Single pump of the kj event handler (used with pollWaitScope)

TwoWayClient Usage - TwoWayPipe
- See examples/async_client.py

TwoWayServer Usage - TwoWayPipe
- See examples/async_server.py

capnp/helpers/asyncIoHelper.h

Misc Changes
- Fixed thread_server.py and thread_client.py to use bootstrap instead
of ez_restore
- async_client.py and async_server.py examples
  * Uses the same thread.capnp as thread_client.py and thread_server.py
  * They are compatible, so you can mix and match client and server for
  compatibility testing
  * async_client.py and async_server.py require <address>:<port>
  formatting (unlike autodetection from thread_client.py and
  thread_server.py)
2019-09-26 21:42:48 -07:00
Jason Paryani
7ff67ebf4a Add bootstrap method to TwoPartyServer 2015-06-04 16:49:46 -07:00
Jason Paryani
e00bff6ef8 Fix problems with TwoPartyServer
Fixes #61

It turns out I messed up the Server initialization code for the case
where a string is passed in as the address. The tests only cover the
cases where a raw socket is passed in. This will be rectified in a
following commit.
2015-04-13 14:14:40 -07:00
Jason Paryani
6e94182a3e Add bootstrap RPC methods
This is the new way for initializing RPC connections. It replaces the
deprecated restore functionality
2015-02-24 11:22:43 -08:00
Jason Paryani
f14bcb1e85 Fix build for Cython 0.21
Conflicts:
	capnp/helpers/helpers.pxd
	capnp/lib/capnp.pyx
	requirements.txt
	setup.py
2014-10-19 20:30:23 -07:00
Jason Paryani
18fce3fe78 Fix up various bugs that arose when trying to cimport capnp 2014-09-03 23:25:39 -07:00
Jason Paryani
a1f7d32853 Make pycapnp GIL friendly
Now calling `wait` from one thread will not block all threads
2014-07-09 00:49:35 -07:00
Jason Paryani
c2b9d14268 Fix up cancel and timer a bit 2014-04-13 18:15:36 -07:00
Jason Paryani
f58f5d4846 Add timer functionality 2014-04-10 19:08:24 -07:00
Jason Paryani
ba4e5e46cb Allow restoring a null objectId by passing None to restore 2014-04-09 17:06:34 -07:00
Jason Paryani
9f06f0f3e8 Fix bug in to_bytes_packed when packed size > unpacked size. 2014-02-24 14:06:28 -08:00
Jason Paryani
55dcff0dad Fix TwoPartyServer to handle more than one client at a time. Fixes #23
Also fix various memleaks in RpcServer/Client
2014-02-13 22:10:05 -08:00
Jason Paryani
3d8dc6daa9 Change which method to be a property and return an enum type.
Old code using which() will still work since the enum type has a
__call__ method.
2014-02-13 19:24:06 -08:00
Jason Paryani
aa317e7324 Change to_bytes_packed() to be more efficient 2014-01-15 22:43:19 -08:00
Jason Paryani
e7e95abeed Allow setting of fields with python dicts.
This change was a bit complicated because of a bug in cython fused
types. I had to flatten DynamicStruct.Builder to DynamicStruct_Builder
in order to get fused template specialization working.
2014-01-13 16:28:05 -08:00
Jason Paryani
e92f7b56c6 Various fixups to the RPC api.
* change how restorer works
* fix join_promises
* add incref's all around to make sure we aren't freeing objects early
* make it so we return PyPromises everywhere and make chains collapsible
2013-12-10 22:57:21 -08:00
Jason Paryani
618097dec1 Add ability for passing AnyPointer to restore in RPCClient 2013-12-09 19:18:54 -08:00
Jason Paryani
e4a38a5efa Refactor to actually use new helpers 2013-12-08 18:03:31 -08:00
Jason Paryani
1e87bed8c7 Refactor capnp.pyx to be in lib subdirectory 2013-12-08 17:43:08 -08:00
Jason Paryani
cff551c774 Refactor layout of pxd files 2013-12-08 17:27:59 -08:00