.\"Copyright 2008-2010 IBM Corp.
.TH SCI_Initialize 3 "Dec 4, 2009" "1.0.0" "SCI"

.SH NAME
\fBSCI_Initialize\fP \- Initializes the SCI execution environment

.SH SYNTAX
.ft R

.SH C Syntax
.nf
#include <sci.h>
int SCI_Initialize(sci_info_t *\fIinfo\fP)

.SH INPUT PARAMETERS
.ft R
.TP 1i
info
Pointer to the SCI startup information (IN).

.SH DESCRIPTION
.ft R
This routine must be called before any other SCI routines are called.
SCI can be initialized more than once; subsequent calls to SCI_Initialize
are erroneous unless SCI_Terminate be called.
.sp
All SCI programs must contain a call to SCI_Initialize. SCI_Initialize 
accepts \fIinfo\fP as its argument:
.sp
.nf
        typedef union {
                sci_end_type_t   type;
                sci_fe_info_t    fe_info;
                sci_be_info_t    be_info;
        } sci_info_t;
.fi
.sp
\fItype\fP can be \fBSCI_FRONT_END\fP or \fBSCI_BACK_END\fP.
.sp
In \fIsci_fe_info_t\fP:
.sp
.nf
        typedef struct {
                sci_end_type_t   type;
                sci_mode_t       mode;
                SCI_msg_hndlr    *hndlr;
                void             *param;
                SCI_err_hndlr    *err_hndlr;
                char             *hostfile;
                char             *bepath;
                char             **beenvp;
                char             reserve[64];
        } sci_fe_info_t;
.fi
.sp
\fImode\fP indicates the working mode of the front end, can be interrupt mode
(\fBSCI_INTERRUPT\fP) or polling mode (\fBSCI_POLLING\fP), \fIhndlr\fP specified
the message handler and it can't be \fBNULL\fP, \fIparam\fP specifies user-defined 
parameter in the message handler, \fIerr_hndlr\fP specifies the error handler when
errors occur and it can be \fBNULL\fP, \fIhostfile\fP specifies the host list to initialize
back ends, \fIbepath\fP specifies the command to run a back end, \fIbeenvp\fP specifies
any additional environment variables user wants to pass to back ends and it should
be ended with a \fBNULL\fP sign.
.sp
In \fIsci_be_info_t\fP:
.sp
.nf
        typedef struct {
                sci_end_type_t   type;
                sci_mode_t       mode;
                SCI_msg_hndlr    *hndlr;
                void             *param;
                SCI_err_hndlr    *err_hndlr;
                char             reserve[64];
        } sci_be_info_t;
.fi
.sp
\fImode\fP indicates the working mode of the front end, can be interrupt mode
(\fBSCI_INTERRUPT\fP) or polling mode (\fBSCI_POLLING\fP), \fIhndlr\fP specified
the message handler and it can't be \fBNULL\fP, \fIparam\fP specifies user-defined 
parameter in the message handler, \fIerr_hndlr\fP specifies the error handler when
errors occur and it can be \fBNULL\fP.
.sp
Each program can be started as a front end or a back end, and can
work in polling mode or interrupt mode, furthermore, besides sci_info_t,
the following environment variables begin with the prefix "SCI_" can be 
used to tune SCI programs (if a data field in sci_info_t indicates the same
attribute as an environment variable, it will be overwritten):
.sp
.TP 1i
SCI_HOST_FILE
host file, same as fe_info.hostfile in sci_info_t
.TP 1i
SCI_BACKEND_NUM
number of back ends when startup
.TP 1i
SCI_DEBUG_FANOUT
fanout of the SCI tree structure, the default value is 32
.TP 1i
SCI_BACKEND_PATH
command to start a back end, same as fe_info.bepath in sci_info_t, can contain 
arguments, e.g., "/usr/bin/pdb_be 2"
.TP 1i
SCI_USE_EXTLAUNCHER
set to "yes" to indicate all back ends are started by an external launcher, the
default value is "no"
.TP 1i
SCI_ENABLE_FAILOVER
set to "yes" to indicate SCI will try to recover connections when facing connection
problems, the default value is "no"
.TP 1i
SCI_REMOTE_SHELL
can be "rsh", "ssh" or "", indicates how underlying SCI processes (agents, back ends)
will be started, "rsh" means using rshell, "ssh" means using ssh, "" means using sci
daemon, it's the default value
.TP 1i
SCI_DEVICE_NAME
can be "" or an ifconfig interface name, e.g., "ib0", if set to "", the connection path
indicated by the first interface will be used, otherwise the specified connection path
will be used, the default value is the first ifconfig device name
.TP 1i
SCI_SEGMENT_SIZE
message segment size used in SCI pipeline mechanism, when the size of downstream
messages exceed a threshold (1.5 * size), this mechanism will be enabled
automatically by splitting the large message into smaller segments to 
increase the overall bandwidth, the default size is 46720 (bytes)
.TP 1i
SCI_SYNC_INIT
if set to yes, the SCI_Initilize will block until all the backends are launched, 
otherwise it will return immediately. The default value is no.
.TP 0i
.sp
For more information, please refer to SCI's online documents.

.SH EXAMPLE
.ft R
.nf
        void handler(void *user_param, sci_group_t group, void *buffer, int size)
        {
                ...
        }
        
        {
                sci_info_t info;
                info.type = SCI_FRONT_END;
                info.fe_info.mode = SCI_INTERRUPT;
                info.fe_info.hostfile = "./host.list";
                info.fe_info.bepath = "/usr/bin/pdb_be";
                info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
                info.fe_info.param = NULL;
                SCI_Initialize(&info);
                ... 
                SCI_Terminate();
        }
.fi

.SH ERRORS
.ft R
All SCI routines return an error value.
.sp
.TP 1i
SCI_ERR_INVALID_ENDTYPE
Invalid end type, can only be SCI_FRONT_END or SCI_BACK_END
.TP 1i
SCI_ERR_NO_MEM
Out of memory
.TP 1i
SCI_ERR_INVALID_JOBKEY
Invalid job key specified by SCI_JOB_KEY (only for BE)
.TP 1i
SCI_ERR_INVALID_HOSTFILE
Invalid host file (only for FE)
.TP 1i
SCI_ERR_UNKNOWN_INFO
Unknown back end info (only for FE)
.TP 1i
SCI_ERR_LAUNCH_FAILED
Failed to launch client(s) (only for FE)
.TP 1i
SCI_ERR_INITIALIZE_FAILED
Initialization failed

.SH SEE ALSO
.ft R
.nf
\fBSCI_Terminate\fP(3)
