I've got the latest version of cthrift, and added a couple of tweaks to the server that may be worth considering for thrift.

1. The memory allocated by the deserialization process will automatically be cleaned up after the server-side RPC is called, unless some specific parts are being marked as "keep". The interesting twist is that not only will that part be kept, but so will any substructures of it.

For example, assume that we had a list of structures that contained strings. This would have several allocation points:
- the list
- each structure within the list
- each strings containted within each structure.
Without user-intervention, after the RPC function is invoked, all of these would get freed. However, if we marked a specific structure as being "keep", then that structure _and_ the strings contained in it will not be freed.

It's relatively straight-forward to implement. Since thrift structures are trees, if we keep a pointer (to a structure), we must also keep all pointers to substructures. Treating the pointers as a node in the thrift type tree, if we keep a pointer, we must keep all pointers in the sub-tree rooted at that pointer. By keeping track of the pre-order and post-order numbers of the memory allocated in the tree, we can identify the descendants of a keep node and not free them. The pre-order is the same as the order in which memory is allocated. The post-order is a little more complicated; in the cthrift implementation, we have a parse stack, and can keep track of the post-order number that way.

2. A cleanup function is introduced. This is a function that is called after the server-side RPC call is finished and the result has been written to the socket. It is possible for the call to setup cookies that can be passed from the RPC call to the cleanup.

I haven't paid too much attention to the thrift server side implementation; does equivalent function exist? Perhaps it can be modeled as a destructor or finalizer?


Reply via email to