NAME
    SCI_Filter_upload - Used in a message filter to uploads messages to another message filter or the parent

C Syntax
    #include <sci.h>
    int SCI_Filter_upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])

INPUT PARAMETERS
    filter_id
        The message filter id, set to SCI_FILTER_NULL means send to the parent directly (IN).
    group
        The group information of current message segment (IN).
    num_bufs
        The number of buffers of current message segment (IN).
    bufs
        The array of buffer locations of current message segment (IN).
    sizes
        The array of buffer sizes of current message segment (IN).

DESCRIPTION
    This subroutine is used to upload messages to another message filter or the parent. 
    Set filter_id to SCI_FILTER_NULL means send the message to the parent directly, 
    otherwise message filters can be used in a cascaded style.

    This is a non-blocking call. The caller cannot assume that message transfer has 
    completed upon the return of the function. Instead, the handler function defined in
    sci_info_t should be used to ensure the message arrival in the destination sides.

    For more information, please refer to SCI's online documents.

EXAMPLE
        {
                char msg[256];
                int sizes[1];
                void *bufs[1];
                ...
                bufs[0] = msg;
                sizes[0] = strlen(msg) + 1;
                SCI_Filter_upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
        }

ERRORS
    All SCI routines return an error value.
    
    SCI_ERR_UNINTIALIZED
        Uninitialized SCI execution environment
    SCI_ERR_INVALID_CALLER
        Can only be called in the filter
    SCI_ERR_NO_MEM
        Out of memory

SEE ALSO
    SCI_Filter_bcast(3)
