Erlang -- The C Server Back-end

User's Guide
Reference Manual
Release Notes
PDF
Top

ic
User's Guide
Version 4.4.1

Expand All
Contract All

Chapters

- Using the IC Compiler
  - Top of chapter
  - Introduction
  - Compilation of IDL Files
- OMG IDL
  - Top of chapter
  - OMG IDL - Overview
- IC Protocol
  - Top of chapter
  - Introduction
  - Language mappings and IDL operations
  - IC Protocol
  - Gen_server Protocol
  - Erlang Distribution Protocol
- Using the Plain Erlang Back-end
  - Top of chapter
  - Introduction
  - Compiling the Code
  - Writing the Implementation File
  - An Example
- Using the Erlang Generic Server Back-end
  - Top of chapter
  - Introduction
  - Compiling the Code
  - Writing the Implementation File
  - An Example
- IDL to C mapping
  - Top of chapter
  - Introduction
  - C Mapping Characteristics
  - Basic OMG IDL Types
  - Constructed OMG IDL Types
  - OMG IDL Constants
  - OMG IDL Operations
  - Exceptions
  - Access to Attributes
  - Summary of Argument/Result Passing for the C-client
  - Supported Memory Allocation Functions
  - Special Memory Deallocation Functions
  - Exception Access Functions
  - Special Types
  - A Mapping Example
- The C Client Back-end
  - Top of chapter
  - Introduction
  - Generated Stub Files
  - C Interface Functions
  - Generating, Compiling and Linking
  - An Example
- The C Server Back-end
  - Top of chapter
  - Introduction
  - Generated Stub Files
  - C Skeleton Functions
  - The Server Loop
  - Generating, Compiling and Linking
  - An Example
- CORBA_Environment C Structure
  - Top of chapter
  - C Structure
  - The CORBA Compatibility Part
  - The External Part
  - The Internal Part
  - Creating and Initiating the CORBA_Environment Structure
  - Setting System Exceptions
- IDL to Java language Mapping
  - Top of chapter
  - Introduction
  - Specialties in the Mapping
  - Basic OMG IDL Types
  - Constructed OMG IDL Types
  - Mapping for Constants
  - Invocations of Operations
  - Exceptions
  - Access to Attributes
  - Summary of Argument/Result Passing for Java
  - Communication Toolbox
  - The Package com.ericsson.otp.ic
  - The Term Class
  - Stub File Types
  - Client Stub Initialization, Methods Exported
  - Server Skeleton Initialization, Server Stub Implementation, Methods Exported
  - A Mapping Example
  - Running the Compiled Code

# 8 The C Server Back-end

### 8.1 Introduction

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.

### 8.2 Generated Stub Files

The generated stub files are:

- For each IDL interface, a C source file, the name of which is <Scoped Interface Name>__s.c. Each operation of the IDL interface is mapped to a C function (with scoped name) in that file;

- C source files that contain functions for type conversion, memory allocation, and data encoding/decoding;

- C header files that contain function prototypes and type definitions.

All C functions are exported (i.e. not declared static).

### 8.3 C Skeleton Functions

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).

### 8.4 The Server Loop

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.

### 8.5 Generating, Compiling and Linking

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.

### 8.6 An Example

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 in 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.