| Thrift Erlang Library | 
 |  | 
 | README Author: Chris Piro (cpiro@facebook.com) | 
 | Last Modified: 2007-Sep-17 | 
 |  | 
 | Thrift is distributed under the Thrift open source software license. | 
 | Please see the included LICENSE file. | 
 |  | 
 | Using Thrift with Erlang | 
 | ======================== | 
 |  | 
 | The Thrift Erlang binding is built using GNU make.  Run `make' in | 
 | lib/erl to generate the necessary .beam object files in lib/erl/ebin/. | 
 | Although the directories are laid out much like an OTP application, | 
 | these bindings (as you will soon discover) are not an OTP application | 
 | proper.  When starting the Erlang emulator (interpreter) you must use | 
 | `-pa /path/to/thrift/lib/erl/ebin' to load the bindings. | 
 |  | 
 | Running the Tutorial | 
 | ==================== | 
 |  | 
 | It is recommended to pattern your own servers after the tutorial | 
 | included in tutorial/.  Generate the gen-erl/ directory by running | 
 | tutorial.thrift, then cd to tutorial/erl/ and run server.sh.  This | 
 | script includes the commmands necessary to compile the generated | 
 | Erlang source, compile the tutorial server itself, and open the Erlang | 
 | emulator.  At the emulator prompt, type `server:start()' to begin | 
 | listening for connections. | 
 |  | 
 | Note that there is no tutorial client; you may use a supplied client | 
 | in another language. | 
 |  | 
 | Implementation Notes | 
 | ==================== | 
 |  | 
 | tExecptions and t*Factorys are straight "new" -- e.g. TF = | 
 | tTransportFactory:new() everything else is start_new | 
 | (i.e. gen_server:start_link) -- this spawns a process and returns a | 
 | pid | 
 |  | 
 | tErlProcessor is a shim around the generated code (which is not | 
 | actually a gen_server).  Of course tErlProcessor isn't a gen_server | 
 | either ... thrift_oop_server is a shim to make our "Thrift objects" | 
 | gen_servers.  Maybe we should remove some layers? | 
 |  | 
 | get/set never means process dictionary | 
 |  | 
 | Use tErlServer and tErlAcceptor.  tSimpleServer and tServerSocket as | 
 | are present in the other bindings are incompatible by design ... the | 
 | call trace is spastic across the process tree.  tErlServer and | 
 | tErlAcceptor follow the same model as iserve: | 
 |  | 
 |  * the top level code spawns a tErlServer, which listens on a socket | 
 |  * a tErlAcceptor is spawned and calls accept() on the listening | 
 | socket | 
 |  * when accept() finishes, the tErlAcceptor | 
 |    * tells the tErlServer to spawn a new acceptor | 
 |    * handles the requests by spawning a processor, a transport, and a | 
 | protocol | 
 |  * (the tricky part) when the socket closes, the protocol exits, so: | 
 |    * the transport exits because it's the one caller of the protocol | 
 |    * likewise, the processor exits because it's the caller of the | 
 | transport | 
 |    * the tErlAcceptor traps the protocol's exit and exits with an | 
 | acceptor_done | 
 |    * the tErlServer sees that the acceptor exited and does nothing | 
 | since there is already another acceptor accept()ing on the listen | 
 | socket | 
 |  | 
 | For info about iserve: http://www.trapexit.org/A_fast_web_server_demonstrating_some_undocumented_Erlang_features | 
 |  | 
 | Final Thoughts | 
 | ============== | 
 |  | 
 | This binding is a work in progress.  It's certainly less thoroughly | 
 | tested than the other, older bindings.  Despite using parts from | 
 | otp_base it is not packaged well, nor is it an OTP application (not to | 
 | mention its many smaller transgressions).  This implementation | 
 | intentionally patterns after the other bindings (which is why there's | 
 | oop.erl and thrift_oop_server), but regretfully it departs from | 
 | idiomatic Erlang.  Please see the included TODO and contribute your | 
 | improvements back to the project. |