With the option {be, c_server}
the IDL Compiler generates
C server skeletons according to the IDL to C mapping, on top of
the Erlang distribution and gen_server protocols.
The developer has to write additional code, that together with
the generated C server skeletons, form a hidden Erlang
node. That additional code contains implementations of call-back
functions that implement the true server functionality, and also
code uses erl_interface
functions for defining the hidden
node and for establishing connections to other Erlang nodes.
The generated stub files are:
<Scoped Interface Name>__s.c
. Each operation of the
IDL interface is mapped to a C function (with scoped name)
in that file;
All C functions are exported (i.e. not declared static).
For each IDL operation a C skeleton function is generated, the
prototype of which is int <Scoped Function
Name>__exec(<Interface Object> oe_obj, CORBA_Environment
*oe_env)
, where <Interface Object>
, and
CORBA_Environment
are of the same type as for the
generated C client stubs code.
Each <Scoped Function Name>__exec()
function calls the
call-back function
<Scoped Function Name>_rs* <Scoped Function
Name>__cb(<Interface Object> oe_obj, <Parameters>,
CORBA_Environment *oe_env)
where the arguments are of the same type as those generated for C client stubs.
The return value <Scoped Function Name>_rs*
is a pointer
to a function with the same signature as the call-back function
<Scoped Function Name>_cb
, and is called after the call-back
function has been evaluated (provided that the pointer is not equal
to NULL
).
The developer has to implement code for establishing connections with other Erlang nodes, code for call-back functions and restore functions.
In addition, the developer also has to implement code for a
server loop, that receives messages and calls the relevant
__exec
function. For that purpose the IC library function
oe_server_receive()
function can be used.
To generate the C server skeletons type the following in an appropriate shell:
erlc -I ICROOT/include "+{be, c_server}" File.idl
,
where ICROOT
is the root of the IC application. The
-I ICROOT/include
is only needed if File.idl
refers to erlang.idl
.
When compiling a generated C skeleton file, the directories
ICROOT/include
and EICROOT/include
, have to be
specified as include directories, where EIROOT
is the
root directory of the Erl_interface application.
When linking object files the EIROOT/lib
and
ICROOT/priv/lib
directories have to be specified.
In this example the IDL specification file "random.idl" is used
for generating C server skeletons (the file is contained in the IC
/examples/c-server
directory):
module rmod { interface random { double produce(); oneway void init(in long seed1, in long seed2, in long seed3); }; };
Generate the C server skeletons:
erlc '+{be, c_server}' random.idl Erlang IDL compiler version X.Y.Z
Six files are generated.
Compile the C server skeletons:
Please read the ReadMe
file att the
examples/c-server
directory.
In the same directory you can find all the code for this
example. In particular you will find the server.c
file
that contains all the additional code that must be written to
obtain a complete server.
In the examples/c-server
directory you will also find
source code for an Erlang client, which can be used for testing
the C server.