TIB RV C Reference
TIB RV C Reference
C Reference
Software Release 8.4
February 2012
Important Information
SOME TIBCO SOFTWARE EMBEDS OR BUNDLES OTHER TIBCO SOFTWARE. USE OF SUCH EMBEDDED
OR BUNDLED TIBCO SOFTWARE IS SOLELY TO ENABLE THE FUNCTIONALITY (OR PROVIDE LIMITED
ADD-ON FUNCTIONALITY) OF THE LICENSED TIBCO SOFTWARE. THE EMBEDDED OR BUNDLED
SOFTWARE IS NOT LICENSED TO BE USED OR ACCESSED BY ANY OTHER TIBCO SOFTWARE OR FOR
ANY OTHER PURPOSE.
USE OF TIBCO SOFTWARE AND THIS DOCUMENT IS SUBJECT TO THE TERMS AND CONDITIONS OF A
LICENSE AGREEMENT FOUND IN EITHER A SEPARATELY EXECUTED SOFTWARE LICENSE
AGREEMENT, OR, IF THERE IS NO SUCH SEPARATE AGREEMENT, THE CLICKWRAP END USER
LICENSE AGREEMENT WHICH IS DISPLAYED DURING DOWNLOAD OR INSTALLATION OF THE
SOFTWARE (AND WHICH IS DUPLICATED IN THE LICENSE FILE) OR IF THERE IS NO SUCH SOFTWARE
LICENSE AGREEMENT OR CLICKWRAP END USER LICENSE AGREEMENT, THE LICENSE(S) LOCATED
IN THE “LICENSE” FILE(S) OF THE SOFTWARE. USE OF THIS DOCUMENT IS SUBJECT TO THOSE TERMS
AND CONDITIONS, AND YOUR USE HEREOF SHALL CONSTITUTE ACCEPTANCE OF AND AN
AGREEMENT TO BE BOUND BY THE SAME.
This document contains confidential information that is subject to U.S. and international copyright laws and
treaties. No part of this document may be reproduced in any form without the written authorization of TIBCO
Software Inc.
TIBCO, The Power of Now, TIB, Information Bus, Rendezvous, TIBCO Rendezvous and Messaging Appliance
are either registered trademarks or trademarks of TIBCO Software Inc. in the United States and/or other
countries.
EJB, Java EE, J2EE, and all Java-based trademarks and logos are trademarks or registered trademarks of Sun
Microsystems, Inc. in the U.S. and other countries.
All other product and company names and marks mentioned in this document are the property of their
respective owners and are mentioned for identification purposes only.
THIS SOFTWARE MAY BE AVAILABLE ON MULTIPLE OPERATING SYSTEMS. HOWEVER, NOT ALL
OPERATING SYSTEM PLATFORMS FOR A SPECIFIC SOFTWARE VERSION ARE RELEASED AT THE SAME
TIME. SEE THE README FILE FOR THE AVAILABILITY OF THIS SOFTWARE VERSION ON A SPECIFIC
OPERATING SYSTEM PLATFORM.
THIS DOCUMENT IS PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR
IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
THIS DOCUMENT COULD INCLUDE TECHNICAL INACCURACIES OR TYPOGRAPHICAL ERRORS.
CHANGES ARE PERIODICALLY ADDED TO THE INFORMATION HEREIN; THESE CHANGES WILL BE
INCORPORATED IN NEW EDITIONS OF THIS DOCUMENT. TIBCO SOFTWARE INC. MAY MAKE
IMPROVEMENTS AND/OR CHANGES IN THE PRODUCT(S) AND/OR THE PROGRAM(S) DESCRIBED IN
THIS DOCUMENT AT ANY TIME.
THE CONTENTS OF THIS DOCUMENT MAY BE MODIFIED AND/OR QUALIFIED, DIRECTLY OR
INDIRECTLY, BY OTHER DOCUMENTATION WHICH ACCOMPANIES THIS SOFTWARE, INCLUDING
BUT NOT LIMITED TO ANY RELEASE NOTES AND "READ ME" FILES.
Copyright © 1997–2012 TIBCO Software Inc. ALL RIGHTS RESERVED.
TIBCO Software Inc. Confidential Information
Contents iii
|
Contents
Figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xv
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Manual Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
Related Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxi
TIBCO Rendezvous Documentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxi
Typographical Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
Connecting with TIBCO Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
How to Join TIBCOmmunity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
How to Access All TIBCO Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
How to Contact TIBCO Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
Chapter 3 Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Message Operations by Functional Group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Message Operations in Alphabetical Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Message Ownership and Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Validity of Data Extracted From Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Scalar Snapshot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Pointer Snapshot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Deleting Snapshot References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Multiple Subscription Snapshots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Field Names and Field Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Finding a Field Instance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Strings and Character Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
tibrvLocalData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
tibrvMsg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
tibrvMsgDateTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
tibrvMsgField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
tibrvMsg_AddField() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Add Scalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Add Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Add Nested Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Add String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Add Opaque Byte Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Add XML Byte Sequence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Add DateTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
tibrvMsg_ClearReferences() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
tibrvMsg_ConvertToString() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
tibrvMsg_Create() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
tibrvMsg_CreateCopy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .393
Figures
Tables
IBM i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
tibrvcmTransport_CreateDistributedQueue(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
tibrvcmTransport_SetWorkerTasks() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Preface
This manual describes the TIBCO Rendezvous API for C programmers. It is part
of the documentation set for Rendezvous Software Release 8.4.0.
Topics
Manual Organization
The organization of this book mirrors the underlying object structure of the
Rendezvous C API. Each chapter describes a group of closely related objects and
the functions that pertain to them.
Within each chapter, functions appear in alphabetical order.
Related Documentation
z/OS Only
z/OS Installation
Installation Concepts and Configuration
COBOL
Administration C Reference
Reference
C++ Reference
Configuration
COM Reference
Tools
Java Reference
RVDM JMX
MBean API
.NET Reference
Reference Pages
Typographical Conventions
Convention Use
TIBCO_HOME Many TIBCO products must be installed within the same home directory. This
directory is referenced in documentation as TIBCO_HOME. The value of
ENV_HOME
TIBCO_HOME depends on the operating system. For example, on Windows
TIBRV_HOME systems, the default value is C:\tibco.
Other TIBCO products are installed into an installation environment. Incompatible
products and multiple instances of the same product are installed into different
installation environments. An environment home directory is referenced in
documentation as ENV_HOME. The default value of ENV_HOME depends on the
operating system. For example, on Windows systems the default value is
C:\tibco.
code font Code font identifies commands, code examples, filenames, pathnames, and
output displayed in a command window. For example:
Use MyCommand to start the foo process.
Convention Use
italic font Italic font is used in the following ways:
• To indicate a document title. For example: See TIBCO FTL Concepts.
• To introduce new terms For example: A portal page may contain several
portlets. Portlets are mini-applications that run in a portal.
• To indicate a variable in a command or code syntax that you must replace.
For example: MyCommand PathName
Key Key name separated by a plus sign indicate keys pressed simultaneously. For
combinations example: Ctrl+C.
Key names separated by a comma and space indicate keys pressed one after the
other. For example: Esc, Ctrl+Q.
The note icon indicates information that is of special interest or importance, for
example, an additional action required only in certain circumstances.
The tip icon indicates an idea that could be useful, for example, a way to apply
the information provided in the current section to achieve a specific result.
The warning icon indicates the potential for a damaging situation, for example,
data loss or corruption if certain steps are taken or not taken.
Convention Use
[ ] An optional item in a command or code syntax.
For example:
MyCommand [optional_parameter] required_parameter
| A logical OR that separates multiple items of which only one may be chosen.
For example, you can select only one of the following parameters:
MyCommand para1 | param2 | param3
Convention Use
{ } A logical group of items in a command. Other syntax notations may appear
within each logical group.
For example, the following command requires two parameters, which can be
either the pair param1 and param2, or the pair param3 and param4.
MyCommand {param1 param2} | {param3 param4}
In the next example, the command requires two parameters. The first parameter
can be either param1 or param2 and the second can be either param3 or param4:
MyCommand {param1 | param2} {param3 | param4}
In the next example, the command can accept either two or three parameters.
The first parameter must be param1. You can optionally include param2 as the
second parameter. And the last parameter is either param3 or param4.
MyCommand param1 [param2] {param3 | param4}
Topics
Programming Environment
Code
• Include the appropriate Rendezvous C header files; see Include These Header
Files on page 4.
• Include the same header files whether the program communicates through a
Rendezvous daemon or using TIBCO Rendezvous® Server In-Process Module
(IPM).
Compile
• Compile programs with an ANSI-compliant C compiler.
• VMS requires programmers to define the compile command; see VMS on
page 10.
Link
• Link with the appropriate Rendezvous C library files; see Link These Library
Files on page 5.
• VMS requires programmers to define the link command; see VMS on page 10.
Run
• Be sure that the Rendezvous daemon can run on each application host
computer. The user’s path must contain a version appropriate for the
application host. For more information, see Rendezvous Daemon (rvd) on
page 41 in TIBCO Rendezvous Administration.
• Be sure that the Rendezvous daemon process (or the application program
process with IPM) can access the Rendezvous license ticket file, tibrv.tkt.
The user’s path must contain this file. For more information, see Licensing
Information on page 11 in TIBCO Rendezvous Administration.
Programming Restrictions
Rendezvous C programs must include the appropriate header files from this list.
Fault Tolerance
tibrv/ft.h Include this header file for the Rendezvous fault tolerance
C API. Including ft.h automatically includes tibrv.h
too.
tibrv/sd.h Include this header file for the Rendezvous secure daemon
C API.
Rendezvous C programs must link the appropriate library files. Choose from the
appropriate table based on operating system platform:
• 32-Bit UNIX, page 5
• 64-Bit UNIX, page 6
• Microsoft Windows, page 7
• VMS, page 10
• IBM i, page 12
32-Bit UNIX
In 32-bit UNIX environments, both shared and static libraries are available. We
recommend shared libraries to ease forward migration.
Secure Daemon
-ltibrvft Programs that use fault tolerance features must link using
this library flag.
Programs that use distributed queues must link using this
library flag.
-ltibrvcmq Programs that use distributed queues must link using this
library flag.
In addition, distributed queue programs also use
communications, certified message delivery, and fault
tolerance libraries; they must link with appropriate flags
from those groups.
64-Bit UNIX
In 64-bit UNIX environments, both shared and static libraries are available. We
recommend shared libraries to ease forward migration. In this release, 64-bit
libraries are available on HP-UX, Solaris and AIX platforms.
Secure Daemon
-ltibrvft64 Programs that use fault tolerance features must link using
this library flag.
Programs that use distributed queues must link using this
library flag.
-ltibrvcmq64 Programs that use distributed queues must link using this
library flag.
In addition, distributed queue programs also use
communications, certified message delivery, and fault
tolerance libraries; they must link with appropriate flags
from those groups.
Microsoft Windows
Release 8.4.0 supports the following combinations:
• 32-bit Windows (XP, Server 2003, Server 2008, Vista)
• 64-bit Windows (XP, Server 2003, Server 2008, Vista)
Both DLLs and static libraries are available. We recommend DLLs to ease forward
migration.
Secure Daemon
Programs that connect to secure daemons (rvsd, rvsrd) must link only one of
these sets of libraries.
Distributed Queue
Programs that use distributed queues must link only one of these libraries.
In addition, distributed queue programs also use certified message delivery,
and fault tolerance libraries; they must link appropriate libraries from those
groups.
VMS
In VMS environments, both shared and static libraries are available. We
recommend shared libraries to ease forward migration.
Forward Migration
In general, applications linked with shareable images migrate forward to new
versions of TIBCO Rendezvous without any need to relink; they usually operate
smoothly with newer shareable images.
Exception: In Rendezvous release 8.0, we reorganized the Rendezvous shareable
image libraries on OpenVMS platforms, in order to resolve issues with third-party
libraries. As a result, you must relink applications linked with shareable image
libraries when you upgrade across this division (from 7.5.4 or earlier, to 8.0 or
later, on OpenVMS).
Compile
On VMS platforms, Rendezvous programmers must define the C-compile
command appropriately.
For the HP C compiler:
$ CC :== CC/FLOAT=IEEE/IEEE_MODE=UNDERFLOW_TO_ZERO -
/PREFIX=ALL/INCLUDE_DIRECTORY=("/tibrv/include",[])
Link
Rendezvous API libraries are multi-threaded, so VMS scheduler upcalls can yield
significant performance improvements:
$ LINK/THREADS_ENABLE=UPCALLS
Library Files
Secure Daemon
Programs that connect to secure daemons (rvsd, rvsrd) must link only one of
these sets of libraries.
Distributed Queue
Programs that use distributed queues must link only one of these libraries.
In addition, distributed queue programs also use certified message delivery,
and fault tolerance libraries; they must link appropriate libraries from those
groups.
IBM i
This section contains information specific to IBM i platforms.
In the following command lines, the slash character (/) is a literal; it does not
mean either or.
2. Compile:
CRTCMOD MODULE(module_library_name/module_name)
SRCFILE(source_library_name/source_file_name) SRCMBR(source_member)
LANGLVL(*EXTENDED) PFROPT(*STRDONLY) DEFINE(_MULTI_THREADED)
3. Link:
CRTPGM PGM(program_library/program_name)
MODULE(module_library_name/module_name)
BNDSRVPGM(optional_RV_libraries LIBTIBRV)
Library Files
Fault Tolerance
Programs that use fault tolerance must link this library.
Programs that use distributed queues must link this library.
Distributed Queue
Programs that use distributed queues must link this library.
In addition, distributed queue programs also use certified message delivery
and fault tolerance libraries; they must link those libraries.
IPM Library
Library Instructions
Rendezvous Standard Ensure that the subdirectory TIBCO_HOME/lib appears before
Communications Library TIBCO_HOME/lib/ipm in your library path environment variable.
For static linking, you may reference the standard library by an
explicit pathname (TIBCO_HOME/lib/library_name).
Chapter 2 Environment
This chapter describes the functions relating to the global internal machinery
upon which Rendezvous software depends.
Topics
Secure Daemon
EBCDIC
tibrv_Close()
Function
Reference Count A reference count protects against interactions between programs and third-party
packages that call tibrv_Open() and tibrv_Close(). Each call to tibrv_Open()
increments an internal counter; each call to tibrv_Close() decrements that
counter. A call to tibrv_Open() actually creates internal machinery only when
the reference counter is zero; subsequent calls merely increment the counter, but
do not duplicate the machinery. A call to tibrv_Close() actually destroys the
internal machinery only when the call decrements the counter to zero; other calls
merely decrement the counter. In each program, the number of calls to
tibrv_Open() and tibrv_Close() must match.
tibrv_IsIPM()
Function
Remarks You can use this call to determine whether an application program process has
linked the IPM library. You can test that your program dynamically links the
correct library. You can program different behavior depending on which library is
linked.
TIBRV_TRUE indicates that the program links the IPM library (from the lib/ipm/
subdirectory).
TIBRV_FALSE indicates that the program links the standard Rendezvous library
(from the lib/ directory).
tibrv_Open()
Function
tibrv_status tibrv_OpenEx(
const char *pathname);
Remarks This call creates the internal machinery that Rendezvous software requires for its
operation:
• Internal data structures.
• Default event queue.
• Intra-process transport.
• Event driver.
Until the first call to tibrv_Open() creates the internal machinery, all events,
queues, and transports are unusable. However, calls that manipulate messages do
not require this machinery, and programs may use them before calling
tibrv_Open().
Reference Count A reference count protects against interactions between programs and third-party
packages that call tibrv_Open() and tibrv_Close(). Each call to tibrv_Open()
increments an internal counter; each call to tibrv_Close() decrements that
counter. A call to tibrv_Open() actually creates internal machinery only when
the reference counter is zero; subsequent calls merely increment the counter, but
do not duplicate the machinery. A call to tibrv_Close() actually destroys the
internal machinery only when the call decrements the counter to zero; other calls
merely decrement the counter. In each program, the number of calls to
tibrv_Open() and tibrv_Close() must match.
IPM Programs that use IPM can start the Rendezvous machinery either with
tibrv_Open or with tibrv_OpenEx. The extended call is available only with IPM.
When IPM is not available, the extended call fails with error status.
Parameter Description
pathname Programs that use IPM can supply a filepath name, which
explicitly specifies a configuration file. IPM reads parameter
values from that file.
For details, see Configuring IPM on page 248 in TIBCO
Rendezvous Concepts.
When IPM is not available, this version of the method fails with
error status.
Not supported for Visual Basic.
tibrv_SetCodePages()
Function
Purpose Set code pages for automatic string conversion on EBCDIC platforms (namely,
IBM i and z/OS).
String Rendezvous software uses the operating system’s iconv() call to automatically
Conversion convert strings. This automatic conversion applies to strings within message
fields, field names, subject names, and other strings associated with messages
(even when they are not strictly inside a message). Conversion occurs only as
needed:
• Programs running in EBCDIC environments represent all strings using an
EBCDIC code page (called the host code page). Before inserting strings into a
message object, Rendezvous software converts those strings to an ASCII
character set (the network code page).
• Conversely, when extracting strings from a message object, Rendezvous
software converts those strings to the EBCDIC host code page before
presenting the strings to the program.
Remarks This call sets the host and network code pages for string conversions in EBCDIC
environments. On other operating system platforms, this call has no effect, and
returns without error.
Call this function when the system code pages differ from the Rendezvous default
code pages (see the table of Default Code Pages on page 22). Throughout an
enterprise, all sending and receiving programs must use the same code pages.
Both arguments are string names of code pages. To determine valid code page
names for your operating system, see documentation from the operating system
vendor.
Programs may call this function at most once. The call must precede the first call
to tibrv_Open().
(Sheet 1 of 2)
Parameter Description
host_codepage Set this code page as the native (EBCDIC) character encoding for the host
computer.
(Sheet 2 of 2)
Parameter Description
net_codepage Set this code page as the ASCII character set for the network.
Default Code To use a default code page, programs may supply NULL for either parameter.
Pages Using the default code pages in both parameter positions has the same effect as
not calling this function at all.
tibrv_SetRVParameters()
Function
Remarks The Rendezvous daemon process (rvd) accepts several command line parameters.
When IPM serves the role of the daemon, this function lets you supply those
parameters from within the application program.
This call is optional. When this call is present, it must precede the call to
tibrv_Open(). For interaction semantics, see Parameter Configuration—
Precedence and Interaction on page 249 in TIBCO Rendezvous Concepts.
This call is available only with IPM. When IPM is not available, this call fails with
error status.
Parameter Description
argc Supply the number of strings in the argument vector.
tibrv_Version()
Function
tibrvSecureDaemon_SetDaemonCert()
Function
Remarks When any program transport connects to a secure daemon, it verifies the
daemon’s identity using SSL protocols. Certificates registered using this function
identify trustworthy daemons. Programs divulge user names and passwords to
daemons that present registered certificates.
Parameter Description
daemonName Register a certificate for a secure daemon with this name. For
the syntax and semantics of this parameter, see Daemon
Name, below.
daemonCert Register this public certificate. The text of this certificate must
be in PEM encoding.
See also Certificate on page 26.
This string must be identical to the string you supply as the daemon argument to
the transport creation call; see tibrvTransport_Create() on page 211.
Colon characters (:) separate the three parts.
ssl indicates the protocol to use when attempting to connect to the daemon.
host indicates the host computer of the secure daemon. You can specify this host
either as a network IP address, or a hostname. Omitting this part specifies the
local host.
port_number specifies the port number where the secure daemon listens for SSL
connections.
(This syntax is similar to the syntax connecting to remote daemons, with the
addition of the prefix ssl.)
In place of this three-part string, you can also supply the constant
TIBRV_SECURE_DAEMON_ANY_NAME. This form lets you register a catch-all
certificate that applies to any secure daemon for which you have not explicitly
registered another certificate. For example, you might use this form when several
secure daemons share the same certificate.
Certificate For important details, see CA-Signed Certificates on page 177 in TIBCO
Rendezvous Administration.
In place of an actual certificate, you can also supply the constant
TIBRV_SECURE_DAEMON_ANY_CERT. The program accepts any certificate from the
named secure daemon. For example, you might use this form when testing a
secure daemon configuration, before generating any actual certificates.
tibrvSecureDaemon_SetUserCertWithKey()
Function
Purpose Register a (PEM) certificate with private key for identification to secure daemons.
Remarks When any program transport connects to a secure daemon, the daemon verifies
the program’s identity using SSL protocols.
The Rendezvous API includes two functions that achieve similar effects:
• This call accepts a certificate in PEM text format.
• tibrvSecureDaemon_SetUserCertWithKeyBin() accepts a certificate in
PKCS #12 binary format.
Parameter Description
userCertWithKey Register this user certificate with private key. The text of
these certificates must be in PEM encoding.
CA-Signed You can also supply a certificate signed by a certificate authority (CA). To use a
Certificate CA-signed certificate, you must supply not only the certificate and private key,
but also the CA’s public certificate (or a chain of such certificates). Concatenate
these items in one string. For important details, see CA-Signed Certificates on
page 177 in TIBCO Rendezvous Administration.
Errors Error status code TIBRV_INVALID_FILE can indicate either disk I/O failure, or
invalid certificate data, or an incorrect password.
tibrvSecureDaemon_SetUserCertWithKeyBin()
Function
Purpose Register a (PKCS #12) certificate with private key for identification to secure
daemons.
Remarks When any program transport connects to a secure daemon, the daemon verifies
the program’s identity using SSL protocols.
The Rendezvous API includes two functions that achieve similar effects:
• This call accepts a certificate in PKCS #12 binary format.
• tibrvSecureDaemon_SetUserCertWithKey() accepts a certificate in PEM
text format.
Parameter Description
userCertWithKey Register this user certificate with private key. The binary data of this
certificate must be in PKCS #12 format.
CA-Signed You can also supply a certificate signed by a certificate authority (CA). To use a
Certificate CA-signed certificate, you must supply not only the certificate and private key,
but also the CA’s public certificate (or a chain of such certificates). For important
details, see CA-Signed Certificates on page 177 in TIBCO Rendezvous
Administration.
Errors Error status code TIBRV_INVALID_FILE can indicate either disk I/O failure, or
invalid certificate data, or an incorrect password.
tibrvSecureDaemon_SetUserNameWithPassword()
Function
Purpose Register a user name with password for identification to secure daemons.
Remarks When any program transport connects to a secure daemon, them daemon verifies
the program’s identity using SSL protocols.
Parameter Description
userName Register this user name for communicating with secure
daemons.
Chapter 3 Messages
Topics
(Sheet 1 of 4)
Message Attributes
Address Attributes
(Sheet 2 of 4)
Add Scalar 59
Add Array 61
Add String 64
Add DateTime 67
Get Scalar 86
Get Array 88
Get String 92
Get DateTime 98
(Sheet 3 of 4)
Dispatch Attributes
Utilities
(Sheet 4 of 4)
Custom Datatypes
(Sheet 1 of 4)
Add Scalar 59
Add Array 61
Add String 64
Add DateTime 67
(Sheet 2 of 4)
(Sheet 3 of 4)
Get Scalar 86
Get Array 88
Get String 92
Get DateTime 98
(Sheet 4 of 4)
When a C program creates a message, the program owns that message. The
program is responsible for destroying that message when it no longer needs the
storage. That is, every create message operation must be paired with a destroy
message operation.
In contrast, when Rendezvous software creates a message, then Rendezvous
software owns that message. This situation occurs only in the case of inbound
messages presented to a callback function; Rendezvous software destroys such
messages when the callback function returns, unless the program explicitly
detaches the message first. After a detach operation, the program owns the
message, and must explicitly destroy it to reclaim the storage.
Rendezvous software controls the storage in which all messages reside—even
messages that the program owns. Programs must not directly modify the storage
in which a message resides. Programs may change the contents of a message only
by using Rendezvous functions that add, remove or update fields.
To extract data values from a message, programs use a set of get convenience
functions. All of these functions extract a snapshot of the message data—that is,
the data value as it exists at a particular time. If the program later modifies the
message by removing or updating the field, the snapshot remains unchanged.
Rendezvous messages implement snapshot semantics using two separate
strategies for scalar data and pointer data.
Scalar Snapshot
To extract the value of a scalar field, a program declares a scalar in
program-owned storage, and passes its address to the get function; the get
function copies a snapshot of the scalar field value from the message into
program storage.
The program can modify its snapshot at any time without affecting the original
message. The program can update or delete the message field at any time without
affecting the snapshot copy.
Message
1
Snapshot Copy of
Scalar Field Get Field
Scalar Value
Update Field
Pointer Snapshot
Pointer data is a broad category, which includes arrays, strings, opaque byte
sequences, XML data, and submessages.
To extract the value of a pointer field, a program declares a typed pointer in
program-owned storage, and passes its address to the get function; the get
function copies a pointer to the field value into the program’s pointer address. The
function does not copy data into program-owned storage; the data still resides in
storage associated with the message. Nonetheless, Rendezvous software protects
the integrity of snapshot pointer data from subsequent changes to the message
field.
Pointer to
Array
Array
Value
Snapshot Array
Pointer to
Snapshot
Array Value
of Array 1
Snapshot Array 1
Pointer to
Snapshot of Submsg 1
Snapshot Submsg 1
This pointer remains valid until the
Updated Field in message is destroyed.
Snapshot of Submsg 1
Subsequent calls to get the field from the
Pristine Copy of snapshot submessage extract this new value.
Submsg 1
Unchanged Field in
Copy of Submsg 1
• tibrvMsg_ClearReferences()
When a program repeatedly extracts snapshot references data and does not
destroy the parent messages, consider using these functions to control the
proliferation of references.
Regular message functions specify fields using a field name. Extended functions
specify fields using a combination of a field name and a unique field identifier.
To compare the speed and space characteristics of these two options, see Search
Characteristics on page 47.
3. Regular functions begin here. Extended functions also begin here when the
program supplied zero as the identifier (supplying zero is equivalent to not
supplying a field identifier, so the behavior is equivalent to the corresponding
regular function).
Search for a field with the specified name—even if that name is NULL. On
failure, return the status code TIBRV_NOT_FOUND.
If a message contains several fields with the same name, searching by name finds
the first instance of the field with that name.
Search Characteristics
In general, an identifier search completes in constant time. In contrast, a name
search completes in linear time proportional to the number of fields in the
message. Name search is quite fast for messages with 16 fields or fewer; for
messages with more than 16 fields, identifier search is faster.
Space Characteristics
The smallest field name is a one-character string, which occupies three bytes in
Rendezvous wire format. That one ASCII character yields a name space of 127
possible field names; a larger range requires additional characters.
Field identifiers are 16 bits, which also occupy three bytes in Rendezvous wire
format. However, those 16 bits yield a space of 65535 possible field identifiers;
that range is fixed, and cannot be extended.
All these strings (both in C and in wire format) use the character encoding
appropriate to the ISO locale of the sender. For example, the United States is locale
en_US, and uses the Latin-1 character encoding (also called ISO 8859-1); Japan is
locale ja_JP, and uses the Shift-JIS character encoding.
When two programs exchange messages within the same locale, strings are
always correct. However, when a message sender and receiver use different
character encodings, the receiving program must convert between encodings as
needed. Rendezvous software does not convert automatically.
EBCDIC
For information about string encoding in EBCDIC environments, see
tibrv_SetCodePages() on page 21.
tibrvLocalData
Type
Purpose This type is the union of all the datatypes that a Rendezvous message can contain
as data in a message field.
(Sheet 1 of 2)
Accessor Description
msg Rendezvous message
boolean boolean
i8 8-bit integer
(Sheet 2 of 2)
Accessor Description
i16 16-bit integer
tibrvMsg
Type
tibrvMsgDateTime
Type
Accessor Description
sec Signed 64-bit integer representing seconds.
Representation Details
Within C Seconds as a 64-bit signed integer, plus nanoseconds as a 32-bit unsigned
programs integer.
However, values are restricted to the range and granularity supported by
Rendezvous wire format. Forcing larger or finer values into this representation
produces an error.
Two constants bracket the available (restricted) range of values within
programs— TIBRVMSG_DATETIME_SEC_MAX and TIBRVMSG_DATETIME_SEC_MIN.
tibrvMsgField
Type
Purpose Fields hold data within messages. Programs manipulate the content of field
structs using the public struct accessors of this type.
Accessor Description
name The field’s name. NULL signifies the empty string as the field name.
Field name strings use the ISO 8859-1 character encoding.
count The number of values in an array field. For array types, count is the number of
array elements.
For example, when a field contains a array of ten 32-bit integers, its size is 4, and
its count is 10.
(For scalar types, strings, opaque byte sequences and XML data, count is 1. That is,
the field contains one string—not an array of characters; one opaque value—not an
array of bytes.)
id The field’s identifier. Identifiers are optional, but must be unique within each
message.
type A Rendezvous datatype token denoting the type of the field’s data.
tibrvMsg_AddField()
Function
Remarks This function copies the data into the new message field. All related convenience
functions behave similarly.
Parameter Description
message Add the new field to this message.
Adding Fields to Earlier releases of Rendezvous software allowed programs to append fields to a
a Nested nested submessage under certain conditions. Starting with release 6, Rendezvous
Message software no longer supports this special case convenience. Instead, programs
must use this three-step process:
1. Extract the nested submessage, using tibrvMsg_getMsg().
2. Add the new fields to the extracted submessage, using type-specific
convenience functions or this function. The field is added to a snapshot copy
of the submessage, and modifies the copy rather than the original parent
message.
3. Store the modified submessage back into the field of the parent message,
using TibrvMsg_UpdateMsg().
Avoiding Whenever possible, we recommend storing arrays in message fields using one of
Common the Rendezvous array types. This strategy makes the most efficient use of storage
Mistakes space, processor time, and network bandwidth.
If you must store array elements as individual fields, be careful mapping array
indices to field identifiers. Zero-based arrays are common in C programs, but zero
has a special meaning as a field identifier—it represents the absence of an
identifier. Do not map the zeroth element of an array (myArray[0]) to a field with
identifier zero; it is impossible to retrieve such a field by its identifier (because it
does not have one).
It is illegal to add a field that has both a NULL field name, and a non-zero field
identifier.
The field name _data_ is reserved. Programs may not add fields with this name.
More generally, all fields that begin with the underbar character are reserved.
Field Name The constant TIBRVMSG_FIELDNAME_MAX (127) determines the longest possible
Length field name.
Convenience When the datatype of a field is determined during execution, use this general
Functions function. When you can determine the datatype of a field before compile-time, we
recommend using type-specific convenience functions instead of this general
function. Type-specific functions yield these advantages when adding fields:
• Code readability.
• Type checking.
• Accept constants and literals directly.
For example, the function tibrvMsg_AddI32() is paired with the extended form
tibrvMsg_AddI32Ex().
Field identifiers have type tibrv_u16. Zero is a special value that signifies no
field identifier. All non-zero field identifiers must be unique within each message.
It is illegal to add a field that has both a NULL field name, and a non-zero field
identifier.
For more information, see Adding a New Field, page 47.
Add Scalar
Convenience Functions
Declaration tibrv_status
tibrvMsg_AddScalar_type(
tibrvMsg message,
const char* fieldName,
scalar_type value);
tibrv_status
tibrvMsg_AddScalar_typeEx(
tibrvMsg message,
const char* fieldName,
scalar_type value,
tibrv_i16 fieldId);
Parameter Description
message Add the new field to this message.
value Add a new field with this value (which may be a literal or
stored in a variable).
The convenience function must correspond to the
datatype of this value. We recommend casting the data to
match the convenience function.
The function copies the value into the new message field.
fieldId Create the new field with this identifier. Zero is a special
value that signifies no field identifier. All non-zero field
identifiers must be unique within each message.
It is illegal to add a field that has both a NULL field name,
and a non-zero field identifier.
Add Array
Convenience Functions
Declaration tibrv_status
tibrvMsg_Addelement_typeArray(
tibrvMsg message,
const char* fieldName,
const element_type* value,
tibrv_u32 numElements);
tibrv_status
tibrvMsg_Addelement_typeArrayEx(
tibrvMsg message,
const char* fieldName,
const element_type* value,
tibrv_u32 numElements,
tibrv_u16 fieldId);
Parameter Description
message Add the new field to this message.
fieldId Create the new field with this identifier. Zero is a special
value that signifies no field identifier. All non-zero field
identifiers must be unique within each message.
It is illegal to add a field that has both a NULL field name,
and a non-zero field identifier.
tibrv_status tibrvMsg_AddMsgEx(
tibrvMsg message,
const char* fieldName,
tibrvMsg value,
tibrv_u16 fieldId);
Remarks This function adds only the data portion of the nested message (value); it does
not include any address information or certified delivery information.
Parameter Description
message Add the new field to this message.
fieldId Create the new field with this identifier. Zero is a special value
that signifies no field identifier. All non-zero field identifiers
must be unique within each message.
It is illegal to add a field that has both a NULL field name, and a
non-zero field identifier.
Add String
Convenience Function
tibrv_status tibrvMsg_AddStringEx(
tibrvMsg message,
const char* fieldName,
const char* value,
tibrv_u16 fieldId);
Remarks The string cannot contain interior NULL bytes, because this function expects a
NULL-terminated string. To add a string with interior NULL bytes, use the generic
function tibrvMsg_AddField().
Parameter Description
message Add the new field to this message.
value Add a new field that contains this string (which may be a
literal or stored in a variable).
The function copies the data into the new field.
fieldId Create the new field with this identifier. Zero is a special value
that signifies no field identifier. All non-zero field identifiers
must be unique within each message.
It is illegal to add a field that has both a NULL field name, and a
non-zero field identifier.
tibrv_status tibrvMsg_AddOpaqueEx(
tibrvMsg message,
const char* fieldName,
const void* value,
tibrv_u32 size,
tibrv_u16 fieldId);
Parameter Description
message Add the new field to this message.
size When adding an opaque buffer, the program supplies the size
(in bytes) of the data in this parameter.
fieldId Create the new field with this identifier. Zero is a special value
that signifies no field identifier. All non-zero field identifiers
must be unique within each message.
It is illegal to add a field that has both a NULL field name, and a
non-zero field identifier.
tibrv_status tibrvMsg_AddXmlEx(
tibrvMsg message,
const char* fieldName,
const void* value,
tibrv_u32 size,
tibrv_u16 fieldId);
Remarks XML data is a byte sequence. Adding a field of type TIBRVMSG_XML compresses
the bytes. Extracting data from the field uncompresses it to obtain the original
byte sequence.
Parameter Description
message Add the new field to this message.
value Add a new field that contains the XML data in this buffer.
The function copies the data into the new message field.
size When adding XML data, the program supplies the size (in
bytes) of the data in this parameter.
fieldId Create the new field with this identifier. Zero is a special value
that signifies no field identifier. All non-zero field identifiers
must be unique within each message.
It is illegal to add a field that has both a NULL field name, and a
non-zero field identifier.
Add DateTime
Convenience Function
tibrv_status tibrvMsg_AddDateTimeEx(
tibrvMsg message,
const char* fieldName,
const tibrvMsgDateTime* value,
tibrv_u16 fieldId);
Parameter Description
message Add the new field to this message.
fieldId Create the new field with this identifier. Zero is a special value that signifies no
field identifier. All non-zero field identifiers must be unique within each message.
It is illegal to add a field that has both a NULL field name, and a non-zero field
identifier.
Example This example code fragment converts a time_t value to a datetime value, and
adds the datetime to a message field. Programs can adapt this example as
appropriate. (For corresponding code to extract a datetime value from a message
field, and convert it to a time_t value, see the example at Get DateTime, page 98.)
#include <limits.h>
tibrv_status
addAsTimeT(tibrvMsg msg,
const char * field,
time_t value)
{ tibrvMsgDateTime d;
d.nsec = 0;
d.sec = (tibrv_i64) value;
return tibrvMsg_AddDateTime(msg, field, &d); }
tibrvMsg_ClearReferences()
Function
Remarks This function clears references back to the most recent mark.
For a description and example, see tibrvMsg_MarkReferences() on page 106.
Parameter Description
message Clear references in this message.
tibrvMsg_ConvertToString()
Function
Remarks Programs can use this function to obtain a string representation of the message for
printing.
For most datatypes, this function formats the full value of the field to the output
string; however, these two types are exceptions:
TIBRVMSG_OPAQUEThis function abbreviates the value of an opaque field; for
example, [472 opaque bytes].
TIBRVMSG_XML This function abbreviates the value of an XML field; for
example, [XML document: 472 bytes].
The size measures uncompressed data.
Parameter Description
message Format this message as a string.
tibrvMsg_Create()
Function
tibrv_status tibrvMsg_CreateEx(
tibrvMsg* message,
tibrv_u32 initialStorage);
Remarks This function allocates storage for the new message. A program owns the
messages that it creates, and must destroy them to reclaim the storage. That is,
each call to this function must be paired with a call to tibrvMsg_Destroy() on
page 73.
Programs can add address information to the message using
tibrvMsg_SetSendSubject() on page 113, and tibrvMsg_SetReplySubject() on
page 112.
Message Size When adding data to a message would overflow the allocated space, the message
automatically expands by allocating additional storage. However, when creating
messages that contain many small fields, you can optimize program performance
by pre-allocating sufficient storage initially.
Parameter Description
message The function stores a pointer to the new message in this
location.
tibrvMsg_CreateCopy()
Function
Remarks The copy is completely independent of the original message. Pointer data in fields
are independent copies of the values.
This function copies only the data within the fields of the message. The copy does
not include any supplementary information—for example, address information or
certified delivery information. (Programs can explicitly add supplementary
information to the copy using functions such as tibrvMsg_SetSendSubject() on
page 113.)
This function allocates the storage for the copy. The duration of the copy is
independent of the original message.
A program owns the messages that it creates, and must destroy them to reclaim
the storage. That is, each call to this function must be paired with a call to
tibrvMsg_Destroy() on page 73.
Parameter Description
message Copy this message.
copy The function stores a pointer to the new copy in this location.
tibrvMsg_CreateFromBytes()
Function
Remarks This function allocates storage for the new message. The program owns the
message, and must destroy it to reclaim the storage. That is, each call to this
function must be paired with a call to tibrvMsg_Destroy() on page 73.
This function copies the bytes into the new message.
Programs can add address information to the message using
tibrvMsg_SetSendSubject() on page 113, and tibrvMsg_ConvertToString() on
page 69.
Parameter Description
message The program supplies a location for the new message. The
function creates a new message and stores a pointer to it in that
location.
bytes Fill the new message with this data. This data buffer represents
the message in Rendezvous wire format, as produced by
tibrvMsg_GetAsBytes() or tibrvMsg_GetAsBytesCopy().
tibrvMsg_Destroy()
Function
Remarks A program owns all messages that it creates or detaches, and must destroy them
to reclaim the storage. That is, each call to tibrvMsg_Create() or
tibrvMsg_Detach() must be paired with a call to this function.
This function frees the storage associated with the message and its snapshot data.
In most operating environments it is illegal to access freed storage.
Destroying a message invalidates all pointer data (such as strings, arrays,
undetached submessages, byte sequences, or XML data) previously extracted
from any fields of the message.
However, destroying a parent message does not affect detached submessages of
the parent.
It is safe for a program to exit without first destroying all messages.
Parameter Description
message Destroy this message, freeing its storage.
tibrvMsg_Detach()
Function
Purpose Detach an inbound message from Rendezvous storage; the program assumes
responsibility for destroying the message.
Remarks When Rendezvous software creates a message, it owns that message. This
situation occurs only in the case of inbound messages presented to a data callback
function; Rendezvous software destroys such messages when the callback
function returns, unless the program explicitly detaches the message. After a
detach operation, the program owns the message, and must explicitly destroy it to
reclaim the storage.
Programs can use this function to detach either an entire message, or a
submessage. After detaching a submessage, the program owns that submessage,
even after the destruction of the surrounding parent message.
Programs may modify messages only with functions that add, remove or update
fields. It is illegal to directly modify data storage in a message field. Detaching a
message does not change this restriction. For further information, see Do Not
Modify Pointer Snapshots on page 43, or more generally, Validity of Data
Extracted From Messages on page 41.
Parameter Description
message Detach this message.
tibrvMsg_Expand()
Function
Remarks When adding data to a message would overflow the allocated space, the message
automatically expands by allocating additional storage. However, reallocation
(whether explicit or automatic) is a slow operation; to optimize program
performance, we recommend allocating sufficient storage initially, so that
reallocation is not required.
In most cases, the message expands in place (without copying). In some cases, this
function copies the message to a new location. In all cases, existing pointers to the
message, its fields, and its field values remain valid (even after copying).
If no space is available, this function returns the error code TIBRV_NO_MEMORY.
Parameter Description
message Expand this message.
tibrvMsg_GetAsBytes()
Function
Remarks Return the data as a byte sequence, suitable for archiving in a file.
The storage for the byte sequence is associated with the message, and persists
until the message is destroyed. Programs must not modify the resulting byte
sequence, which remains part of the message object. To make a copy that your
program can modify, use tibrvMsg_GetAsBytesCopy() on page 77.
The byte data includes the message header and all message fields in Rendezvous
wire format. It does not include address information, such as the subject and reply
subject, nor certified delivery information.
The byte sequence can contain interior NULL bytes.
Parameter Description
message Extract the data bytes from this message.
tibrvMsg_GetAsBytesCopy()
Function
Remarks Return the data as a byte sequence, suitable for archiving in a file.
This function copies the message data into a buffer, which the program owns and
may modify.
The byte data includes the message header and all message fields in Rendezvous
wire format. It does not include address information, such as the subject and reply
subject.
To allocate appropriate storage, programs determine the length of the byte
sequence using tibrvMsg_GetByteSize() on page 78.
The byte sequence can contain interior NULL bytes.
Parameter Description
message Extract the data from this message.
buf The program supplies a buffer. The function copies the byte
sequence into that buffer.
tibrvMsg_GetByteSize()
Function
Remarks This measurement accounts for the actual space that the message occupies (in
wire format), including its header and its fields. It does not include storage that is
allocated but unused. It does not include address information, such as the subject
or reply subject.
Programs can use this function as part of these tasks:
• Measure the size of message before allocating space to store a copy—as with
tibrvMsg_GetAsBytesCopy().
Parameter Description
message Return the size of this message.
tibrvMsg_GetClosure()
Function
Parameter Description
message Extract the closure corresponding to this message object.
Remarks Dispatch associates the message with a listener event. This call gets the closure
from that listener event.
This call is valid only for an inbound message that has already been dispatched to
a listener event. Error status TIBRV_INVALID_MSG indicates that the message is
not associated with a listener event.
tibrvMsg_GetCurrentTime()
Function
tibrv_status tibrvMsg_GetCurrentTimeString(
char* local,
char* gmt);
Remarks The first function produces a date-time object; for details, see tibrvMsgDateTime
on page 53.
The second function produces printable strings.
Both functions are thread-safe.
Parameter Description
dateTime The program supplies a location. The function stores the
current time in that location.
tibrvMsg_GetEvent()
Function
Parameter Description
message Extract the event associated with this message object.
event The program supplies a location. The function stores the event
object in that location.
tibrvMsg_GetField()
Function
tibrv_status tibrvMsg_GetFieldEx(
tibrvMsg message,
const char* fieldName,
tibrvMsgField* field,
tibrv_u16 fieldId);
Remarks Programs specify the field to retrieve using the fieldName and fieldId
parameters. For details, see Field Names and Field Identifiers, page 46.
The function takes a snapshot of the field, and stores that information in the
field argument, overwriting the struct supplied as an argument.
The function copies scalar data into the program’s field struct. Pointer data (such
as strings, arrays, submessages, opaque byte sequences, or XML data) extracted
from the field remain valid until the message is destroyed; that is, even removing
the field or updating the field’s value does not invalidate pointer data.
Programs can use a related function to loop through all the fields of a message. To
retrieve each field by its integer index number, see tibrvMsg_GetFieldByIndex()
on page 100.
Parameter Description
message Get the specified field of this message.
fieldId Get the field with this identifier. Zero is a special value that
signifies no field identifier. All non-zero field identifiers must
be unique within each message.
If the name search fails, or if the program supplied NULL as the field name,
return the status code TIBRV_NOT_FOUND.
3. Regular functions begin here. Extended functions also begin here when the
program supplied zero as the identifier (supplying zero is equivalent to not
supplying a field identifier, so the behavior is equivalent to the corresponding
regular function).
Search for a field with the specified name—even if that name is NULL.
If the search succeeds, return the field.
On failure, return the status code TIBRV_NOT_FOUND.
If a message contains several fields with the same name, searching by name finds
the first instance of the field with that name.
Convenience Functions
In most situations, we recommend using type-specific convenience functions
instead of this general function. Type-specific functions yield these advantages
when extracting fields:
• Code readability.
• Type checking.
• Automatic type conversion.
These categories of type-specific convenience functions find a field and get its
data:
• Get Scalar, page 86.
• Get Array, page 88.
• Get Nested Message, page 90.
• Get String, page 92.
• Get Opaque Byte Sequence, page 94.
• Get XML Byte Sequence, page 96.
• Get DateTime, page 98.
Extended Functions
Each convenience function has two forms.
• The usual form specifies the field to get using a field name.
• The extended form specifies the field to get using a field name and a field
identifier.
For example, the function tibrvMsg_GetI32() is paired with the extended form
tibrvMsg_GetI32Ex().
The field identifier has type tibrv_u16. Zero is a special value that signifies no
field identifier. All non-zero field identifiers must be unique within each message.
For details, see Field Names and Field Identifiers, page 46.
Get Scalar
Convenience Functions
Declaration tibrv_status
tibrvMsg_Getscalar_type(
tibrvMsg message,
const char* fieldName,
scalar_type* value);
tibrv_status
tibrvMsg_Getscalar_typeEx(
tibrvMsg message,
const char* fieldName,
scalar_type* value,
tibrv_u16 fieldId);
Remarks Each convenience function in this family retrieves a field and extracts its data. If
the field’s type (as it exists) does not match the type of the convenience function,
then the function attempts to convert the data (see Datatype Conversion on
page 352). If conversion is not possible, the function returns
TIBRV_CONVERSION_FAILED.
(Sheet 1 of 2)
(Sheet 2 of 2)
Parameter Description
message Get the specified field of this message.
fieldId Get the field with this identifier. Zero is a special value that
signifies no field identifier. All non-zero field identifiers must be
unique within each message.
Get Array
Convenience Functions
tibrv_status tibrvMsg_Getelement_typeArrayEx(
tibrvMsg message,
const char* fieldName,
element_type** value,
tibrv_u32* numElementsAddr,
tibrv_u16 fieldId);
Remarks Each convenience function in this family retrieves a field and extracts its data. If
the field’s type (as it exists) is does not match the type of the convenience
function, then the function attempts to convert the data (see Datatype Conversion
on page 352). If conversion is not possible, the function returns
TIBRV_CONVERSION_FAILED.
Pointer data extracted from the field remain valid until the message is destroyed;
that is, even removing the field or updating the field’s value does not invalidate
pointer data.
These functions produce values that are read-only snapshots of the field data (see
Pointer Snapshot on page 42). Programs must not modify elements of the value
array.
(Sheet 1 of 2)
(Sheet 2 of 2)
Parameter Description
message Get the specified field of this message.
fieldId Get the field with this identifier. Zero is a special value
that signifies no field identifier. All non-zero field
identifiers must be unique within each message.
tibrv_status tibrvMsg_GetMsgEx(
tibrvMsg message,
const char* fieldName,
tibrvMsg* subMessage,
tibrv_u16 fieldId);
Remarks Since it is not possible to convert any other datatype to a message, the field must
already contain a message. Otherwise, the function returns
TIBRV_CONVERSION_FAILED.
Pointer data extracted from the field remain valid until the message is destroyed;
that is, even removing the field or updating the field’s value does not invalidate
pointer data.
After extracting a submessage, a program can detach it. A detached submessage
remains valid and unchanged even after the parent message is destroyed. The
program must explicitly destroy the detached submessage.
This function produces values that are modifiable snapshots of the field data.
Programs may modify the resulting submessage by adding, removing or
updating fields. However, these modifications do not change the field in the
original parent message; instead, they force Rendezvous software to make a copy
of the field (see Rendezvous Protects the Message from Changes to Submessage
Snapshots on page 44).
Parameter Description
message Get the specified field of this message.
fieldId Get the field with this identifier. Zero is a special value that
signifies no field identifier. All non-zero field identifiers must
be unique within each message.
Get String
Convenience Function
tibrv_status tibrvMsg_GetStringEx(
tibrvMsg message,
const char* fieldName,
const char** value,
tibrv_u16 fieldId);
Remarks This convenience function retrieves a field and extracts its data, automatically
converting it to a string.
Programs can use this function to obtain a printable representation of field data.
For most datatypes, this function formats the full value of the field to the output
string; however, these two types are exceptions:
TIBRVMSG_OPAQUEThis function abbreviates the value of an opaque field; for
example, [472 opaque bytes].
TIBRVMSG_XML This function abbreviates the value of an XML field; for
example, [XML document: 472 bytes].
The size measures uncompressed data.
Pointer data extracted from the field remain valid until the message is destroyed;
that is, even removing the field or updating the field’s value does not invalidate
pointer data.
This function produces values that are read-only snapshots of the field data (see
Pointer Snapshot on page 42). Programs must not modify the value string.
(Sheet 1 of 2)
Parameter Description
message Get the specified field of this message.
(Sheet 2 of 2)
Parameter Description
fieldId Get the field with this identifier. Zero is a special value that
signifies no field identifier. All non-zero field identifiers must
be unique within each message.
tibrv_status tibrvMsg_GetOpaqueEx(
tibrvMsg message,
const char* fieldName,
const void** value,
tibrv_u32* length,
tibrv_u16 fieldId);
Remarks This convenience function retrieves a field and extracts its data.
Since it is not possible to convert any other datatype to an opaque byte sequence,
the field must already contain an opaque byte sequence. Otherwise, the function
returns TIBRV_CONVERSION_FAILED.
Pointer data extracted from the field remain valid until the message is destroyed;
that is, even removing the field or updating the field’s value does not invalidate
pointer data.
This function produces values that are read-only snapshots of the field data (see
Pointer Snapshot on page 42). Programs must not modify the value sequence.
Parameter Description
message Get the specified field of this message.
fieldId Get the field with this identifier. Zero is a special value that
signifies no field identifier. All non-zero field identifiers must
be unique within each message.
tibrv_status tibrvMsg_GetXmlEx(
tibrvMsg message,
const char* fieldName,
const void** value,
tibrv_u32* length,
tibrv_u16 fieldId);
Remarks This convenience function retrieves a field and extracts its data.
XML data is a byte sequence. Adding a field of type TIBRVMSG_XML compresses
the bytes. Extracting data from the field uncompresses it to obtain the original
byte sequence.
Since it is not possible to convert any other datatype to an XML byte sequence, the
field must already contain an XML byte sequence. Otherwise, the function returns
TIBRV_CONVERSION_FAILED.
Pointer data extracted from the field remain valid until the message is destroyed;
that is, even removing the field or updating the field’s value does not invalidate
pointer data.
This function produces values that are read-only snapshots of the field data (see
Pointer Snapshot on page 42). Programs must not modify the value sequence.
(Sheet 1 of 2)
Parameter Description
message Get the specified field of this message.
(Sheet 2 of 2)
Parameter Description
fieldId Get the field with this identifier. Zero is a special value that
signifies no field identifier. All non-zero field identifiers must
be unique within each message.
Get DateTime
Convenience Function
tibrv_status tibrvMsg_GetDateTimeEx(
tibrvMsg message,
const char* fieldName,
tibrvMsgDateTime* value,
tibrv_u16 fieldId);
Remarks This convenience function retrieves a field and extracts its data.
Since it is not possible to convert any other datatype to a datetime value, the field
must already contain a datetime. Otherwise, the function returns
TIBRV_CONVERSION_FAILED.
Pointer data extracted from the field remain valid until the message is destroyed;
that is, even removing the field or updating the field’s value does not invalidate
pointer data.
This function produces values that are read-only snapshots of the field data (see
Pointer Snapshot on page 42). Programs must not modify the datetime value.
Parameter Description
message Get the specified field of this message.
fieldId Get the field with this identifier. Zero is a special value that
signifies no field identifier. All non-zero field identifiers must
be unique within each message.
Example This example code extracts a datetime value from a message field, and converts it
to a time_t value. Programs can adapt this code as appropriate. (For
corresponding code to convert a time_t value to a datetime value, and add the
datetime to a message field, see the example at Add DateTime, page 67.)
tibrv_status
getAsTimeT(tibrvMsg msg,
const char * field,
time_t * value)
{
tibrvMsgDateTime d;
tibrv_status err;
return TIBRV_OK;
}
tibrvMsg_GetFieldByIndex()
Function
Remarks Programs can loop through all the fields of a message, to retrieve each field in
turn using an integer index.
The function copies scalar data into the program’s field struct. Pointer data
extracted from the field remain valid until the message is destroyed; that is, even
removing the field or updating the field’s value does not invalidate pointer data.
Add, remove and update calls can perturb the order of fields (which, in turn, affects
the results when a program gets a field by index).
Parameter Description
message Get the field from this message.
fieldIndex Get the field with this index. Zero specifies the first field.
tibrvMsg_GetFieldInstance()
Function
Remarks When a message contains several field instances with the same field name,
retrieve a specific instance by number (for example, get the ith field named foo).
Programs can use this function in a loop that examines every field with a specified
name.
The argument 1 denotes the first instance of the named field.
The function copies scalar data into the program’s field struct. Pointer data
extracted from the field remain valid until the message is destroyed; that is, even
removing the field or updating the field’s value does not invalidate pointer data.
When the instance argument is greater than the actual number of instances of
the field in the message, this function returns the status code TIBRV_NOT_FOUND.
Release 5 Rendezvous 5 (and earlier) did not support array datatypes. Some older
Interaction programs circumvented this limitation by using several fields with the same
name to simulate arrays. This work-around is no longer necessary, since release 6
(and later) supports array datatypes within message fields. The function
tibrvMsg_GetFieldInstance() ensures backward compatibility, so new
programs can still receive and manipulate messages sent from older programs.
Nonetheless, we encourage programmers to use array types as appropriate, and
we discourage storing several fields with the same name in a message.
(Sheet 1 of 2)
Parameter Description
message Get the specified field instance of this message.
(Sheet 2 of 2)
Parameter Description
instance Get this instance of the specified field name. The argument 1
denotes the first instance of the named field.
tibrvMsg_GetNumFields()
Function
Remarks This call counts the immediate fields of the message; it does not descend into
submessages to count their fields recursively.
Parameter Description
message Extract the number of fields in this message.
tibrvMsg_GetReplySubject()
Function
Remarks The reply subject string is part of a message’s address information—it is not part
of the message itself.
Programs must not modify the storage in which this reply subject string resides.
Parameter Description
message Get the subject of this message.
tibrvMsg_GetSendSubject()
Function
Remarks The subject string is part of a message’s address information—it is not part of the
message itself.
Programs must not modify the storage in which this subject string resides.
Parameter Description
message Get the subject of this message.
subject The function stores a pointer to the subject string in this location.
The function makes a snapshot copy of the subject string, and
supplies a pointer to that snapshot within message storage. The
pointer remains valid as long as the message itself remains valid
in the same location. The subject pointer becomes invalid if the
program destroys the message, or returns from the data callback
function that determines the scope of an inbound message. For
more information, see Pointer Snapshot on page 42, and
Deleting Snapshot References on page 45.
tibrvMsg_MarkReferences()
Function
Parameter Description
message Mark references in this message.
Remarks Extracting pointer data from a message field creates a snapshot of that data. The
snapshot remains associated with the message until the program destroys the
message. However, in rare situations snapshots can accumulate within a program,
causing unbounded memory growth. This function gives programs explicit
control over snapshot references; by clearing references, the program declares that
it no longer needs the references that arise as side effects of calls that get a message
field.
For example, consider a program fragment that repeatedly sends a template
message, getting and updating fields within a nested submessage before each
send call. Each call to extract the nested message produces a snapshot reference.
By surrounding the get operation with a mark and clear pair (with the clear call
occurring at any time after the get call), the program releases the reference, which
helps control memory usage.
void myTimerCB(
tibrvEvent myTimer,
tibrvMsg empty,
void* closure_msg_arg)
{
tibrvMsg msg = (tibrvMsg)closure_msg_arg;
tibrvMsg submsg;
tibrvMsg_MarkReferences(msg);
tibrvMsg_GetMsg(msg, "foo", &submsg);
...
tibrvMsg_ClearReferences(msg);
tibrvMsg_SetSendSubject(msg, some_subject);
tibrvTransport_Send(myTransport, msg);
}
Mark 1
Pointer to
Array
Snapshot
Value
1
Snapshot 1
Mark 2
Pointer to
Array
Snapshot
Value
2
Snapshot 2
Unless a program explicitly marks and clears references, references persist until
the message is destroyed or reset.
tibrvMsg_RemoveField()
Function
tibrv_status tibrvMsg_RemoveFieldEx(
tibrvMsg message,
const char* fieldName,
tibrv_u16 fieldId);
Remarks Pointer data (such as strings, arrays, submessages, opaque byte sequences or
XML data) previously extracted from the field remains valid even after removing
the field from the message.
Parameter Description
message Remove the specified field from this message.
fieldId Remove the field with this identifier. Zero is a special value
that signifies no field identifier.
Field Search This function uses this algorithm to find and remove a field within a message, as
Algorithm specified by a field identifier and a field name.
1. The extended function begins here. The regular function begins at step 3.
If the program supplied a non-zero field identifier, then search for the field
with that identifier. If the search succeeds, remove the field.
On failure, continue to step 2. (If the identifier is zero, skip to step 3.)
2. If the identifier search (in step 1) fails, and the program supplied a non-NULL
field name, then search for a field with that name.
If the program supplied NULL as the field name, return the status code
TIBRV_NOT_FOUND.
If a message contains several fields with the same name, searching by name
removes the first instance of the field with that name.
tibrvMsg_RemoveFieldInstance()
Function
Remarks When a message contains several field instances with the same field name,
remove a specific instance by number (for example, remove the ith field named
foo). Programs can use this function in a loop that examines every field with a
specified name.
The argument 1 denotes the first instance of the named field.
If the specified instance does not exist, the function returns TIBRV_NOT_FOUND.
Pointer data (such as strings, arrays, submessages, opaque byte sequences or
XML data) previously extracted from the field remains valid even after removing
the field from the message.
Parameter Description
message Remove the specified field from this message.
instance Remove this instance of the field. The argument 1 specifies the
first instance of the named field.
tibrvMsg_Reset()
Function
When this function returns, the message has no fields; it is like a newly created
message. The message’s address information is also reset.
Pointer data (such as strings, arrays, submessages, opaque byte sequences or
XML data) previously extracted from fields of the old message are invalid.
Parameter Description
message Reset this message.
tibrvMsg_SetReplySubject()
Function
Remarks Recipients of a message can use its reply subject as the address for return
messages.
Rendezvous routing daemons modify subjects and reply subjects to enable
transparent point-to-point communication across network boundaries. This
modification does not apply to subject names stored in message data fields; we
discourage storing point-to-point subject names in data fields.
Parameter Description
message Set the reply subject of this message.
Subject Name The constant TIBRV_SUBJECT_MAX determines the longest possible subject name.
Length
tibrvMsg_SetSendSubject()
Function
Remarks The subject of a message can describe its content, as well as its destination set.
Rendezvous routing daemons modify subjects and reply subjects to enable
transparent point-to-point communication across network boundaries. This
modification does not apply to subject names stored in message data fields; we
discourage storing point-to-point subject names in data fields.
Parameter Description
message Set the subject of this message.
Subject Name The constant TIBRV_SUBJECT_MAX determines the longest possible subject name.
Length
tibrvMsg_UpdateField()
Function
Remarks This function locates a field within the message by matching the name and
identifier of field. Then it updates the message field using the field argument.
(Notice that the program may not supply a field object with a different field name,
field identifier, or datatype.)
If no existing field matches the specifications in the field argument, then this
function adds the field to the message. Update convenience functions also add the
field if it is not present.
The type of the existing field (within the message) and the type of the updating
field argument must be identical; otherwise, the function returns the error status
code TIBRV_INVALID_TYPE. However, when updating array or vector fields, the
count (number of elements) can change.
Pointer data (such as strings, arrays, submessages, opaque byte sequences or
XML data) previously extracted from the field remain valid and unchanged until
the message is destroyed; that is, even updating the field’s value does not
invalidate pointer data.
Parameter Description
message Update this message.
Field Search This function, and related functions that update message fields, all use this
Algorithm algorithm to find and update a field within a message, as specified by a field
identifier and a field name.
1. Extended functions begin here. Regular functions begin at step 3.
If the identifier is zero, skip to step 3.
If the program supplied a non-zero field identifier, then search for the field
with that identifier.
If the search succeeds, then update that field.
On failure, continue to step 2.
2. If the identifier search (in step 1) fails, and the program supplied a non-NULL
field name, then search for a field with that name.
If the program supplied NULL as the field name, return the status code
TIBRV_NOT_FOUND.
If the name search succeeds, but the actual identifier in the field is non-NULL
(so it does not match the identifier supplied) then return the status code
TIBRV_ID_CONFLICT.
If the search fails, add the field as specified (with name and identifier).
3. Regular functions begin here. Extended functions also begin here when the
program supplied zero as the identifier (supplying zero is equivalent to not
supplying a field identifier, so the behavior is equivalent to the corresponding
regular function).
Search for a field with the specified name—even if that name is NULL.
If the search fails, add the field as specified (with name and identifier).
If a message contains several fields with the same name, searching by name finds
the first instance of the field with that name.
The field name _data_ is reserved. Programs may not add fields with this name.
(More generally, all fields that begin with the underbar character are reserved.)
Field Name The constant TIBRVMSG_FIELDNAME_MAX determines the longest possible field
Length name.
Convenience When the datatype of a field is determined during execution, use this general
Functions function. When you can determine the datatype of a field before compile-time, we
recommend using type-specific convenience functions instead of this general
function. Type-specific functions yield these advantages when updating fields:
• Code readability.
• Type checking.
These categories of type-specific convenience functions find a field and update its
data:
• Update Scalar, page 117.
• Update Array, page 119.
• Update Nested Message, page 121.
• Update String, page 122.
• Update Opaque Byte Sequence, page 123
• Update XML Byte Sequence, page 124
• Update DateTime, page 125
Update Scalar
Convenience Functions
tibrv_status tibrvMsg_Updatescalar_typeEx(
tibrvMsg message,
const char* fieldName,
scalar_type value,
tibrv_u16 fieldId);
Remarks Each convenience function in this family locates a field (by name or identifier)
and updates its data.
The type of the existing field (within the message) and the type of the updating
value must match.
(Sheet 1 of 2)
(Sheet 2 of 2)
Parameter Description
message Update the specified field of this message.
value Update the message field to this value (which may be a literal
or stored in a variable).
The function copies the value into the new message field.
fieldId Update the field with this identifier. Zero is a special value that
signifies no field identifier. It is illegal to add a field that has
both a NULL field name, and a non-zero field identifier.
Update Array
Convenience Functions
tibrv_status tibrvMsg_Updateelement_typeArrayEx(
tibrvMsg message,
const char* fieldName,
const element_type* value,
tibrv_u32 numElements,
tibrv_u16 fieldId);
Remarks Each convenience function in this family locates a field (by name or identifier)
and updates its data.
The type of the existing field (within the message) and the type of the updating
value must match. The number of elements can change.
Pointer data previously extracted from the field remain valid and unchanged
until the message is destroyed; that is, even updating the field’s value does not
invalidate pointer data. (See Pointer Snapshot on page 42.)
(Sheet 1 of 2)
(Sheet 2 of 2)
Parameter Description
message Update the specified field of this message.
numElements When updating an array type, the program supplies the count
of array elements in this parameter.
fieldId Update the field with this identifier. Zero is a special value that
signifies no field identifier. It is illegal to add a field that has
both a NULL field name, and a non-zero field identifier.
tibrv_status tibrvMsg_UpdateMsgEx(
tibrvMsg message,
const char* fieldName,
tibrvMsg value,
tibrv_u16 fieldId);
Remarks This convenience function locates a field (by name or identifier) and updates its
data.
The type of the existing field (within the message) and the type of the updating
value must match. The message size (that is, its length in bytes) can change.
This function uses only the data portion of the nested message (value); it does not
include any address information or certified delivery information.
Parameter Description
message Update the specified field of this message.
fieldId Update the field with this identifier. Zero is a special value that
signifies no field identifier. It is illegal to add a field that has
both a NULL field name, and a non-zero field identifier.
Update String
Convenience Function
tibrv_status tibrvMsg_UpdateStringEx(
tibrvMsg message,
const char* fieldName,
const char* value,
tibrv_u16 fieldId);
Remarks This convenience function locates a field (by name or identifier) and updates its
data.
The type of the existing field (within the message) and the type of the updating
value must match. The length of the string can change.
Pointer data previously extracted from the field remain valid and unchanged
until the message is destroyed; that is, even updating the field’s value does not
invalidate pointer data. (See Pointer Snapshot on page 42.)
Parameter Description
message Update the specified field of this message.
value Update the message field to this value (which may be a literal
or stored in a variable).
The function copies the new value into the existing field.
fieldId Update the field with this identifier. Zero is a special value that
signifies no field identifier. It is illegal to add a field that has
both a NULL field name, and a non-zero field identifier.
tibrv_status tibrvMsg_UpdateOpaqueEx(
tibrvMsg message,
const char* fieldName,
const void* value,
tibrv_u32 size,
tibrv_u16 fieldId);
Remarks This convenience function locates a field (by name or identifier) and updates its
data.
The type of the existing field (within the message) and the type of the updating
value must match. The size can change.
Pointer data previously extracted from the field remain valid and unchanged
until the message is destroyed; that is, even updating the field’s value does not
invalidate pointer data. (See Pointer Snapshot on page 42.)
Parameter Description
message Update the specified field of this message.
size The program supplies the size of the new data in this
parameter.
fieldId Update the field with this identifier. Zero is a special value that
signifies no field identifier. It is illegal to add a field that has
both a NULL field name, and a non-zero field identifier.
tibrv_status tibrvMsg_UpdateXmlEx(
tibrvMsg message,
const char* fieldName,
const void* value,
tibrv_u32 size,
tibrv_u16 fieldId);
Remarks This convenience function locates a field (by name or identifier) and updates its
data.
The type of the existing field (within the message) and the type of the updating
value must match. The size can change.
Pointer data previously extracted from the field remain valid and unchanged
until the message is destroyed; that is, even updating the field’s value does not
invalidate pointer data. (See Pointer Snapshot on page 42.)
XML data is a byte sequence. Adding (or updating) a field of type
TIBRVMSG_XML compresses the bytes. Extracting data from the field
uncompresses it to obtain the original byte sequence.
Parameter Description
message Update the specified field of this message.
size The program supplies the size of the new data in this parameter.
fieldId Update the field with this identifier. Zero is a special value that signifies no field
identifier. It is illegal to add a field that has both a NULL field name, and a non-zero
field identifier.
Update DateTime
Convenience Function
tibrv_status tibrvMsg_UpdateDateTimeEx(
tibrvMsg message,
const char* fieldName,
const tibrvMsgDateTime* value,
tibrv_u16 fieldId);
Remarks This convenience function locates a field (by name or identifier) and updates its
data.
The type of the existing field (within the message) and the type of the updating
value must match.
Pointer data previously extracted from the field remain valid and unchanged
until the message is destroyed; that is, even updating the field’s value does not
invalidate pointer data. (See Pointer Snapshot on page 42.)
Parameter Description
message Update the specified field of this message.
fieldId Update the field with this identifier. Zero is a special value that
signifies no field identifier. It is illegal to add a field that has
both a NULL field name, and a non-zero field identifier.
Chapter 4 Events
Topics
(Sheet 1 of 2)
Event Accessors
tibrvEvent_GetIOType() Extract the I/O type from an I/O event object. 154
(Sheet 2 of 2)
(Sheet 1 of 2)
(Sheet 2 of 2)
tibrvEvent
Type
Purpose Event objects represent program interest in events, and event occurrences.
Remarks Each call to a Rendezvous event creation function results in a new event object,
which represents your program’s interest in a class of events. Rendezvous
software uses the same event object to signal each occurrence of such an event.
Programs use the event object as a token; they cannot view or modify the object,
except using accessor functions.
Programs must explicitly destroy each event object. Destroying an event object
cancels the program’s interest in that event, and frees its storage.
tibrvEventCallback
Function Type
Remarks A single callback function type spans listener, timer and I/O events.
Parameter Description
event This parameter receives the event object. This object is
identical to the object that the program created to express
event interest.
message When the event object is a listener, the callback receives the
inbound message in this parameter. If the inbound message is
empty, this parameter receives a message that has no fields.
When the event object is a timer or I/O event, this parameter
receives NULL.
closure This parameter receives the closure data, which the program
supplied in the call that created the event object.
tibrvEventOnComplete
Function Type
Purpose A program can destroy an event object even when its callback function is running
in one or more threads. Multi-threaded programs can define functions of this type
to discover when all callback functions in progress have completed.
Parameter Description
destroyedEvent This parameter receives the event object. This object is
identical to the object that the program created to express
event interest.
However, by the time this function runs, the event is
already destroyed; this function cannot use the event
object in Rendezvous calls.
Event Valid
tibrvEventVectorCallback
Function Type
Purpose Programs define functions of this type to process message vector events.
Remarks In the simplest arrangement, your callback function processes the messages in the
array. When the callback function returns, the Rendezvous library deallocates the
array.
If your application requires a more complex processing arrangement, it can
detach individual messages, and pass them to other threads for processing. (If
your program detaches a message, then it must also explicitly destroy it.)
It is illegal to pass the message array to a different thread for processing, or to use
it as dynamically-allocated storage.
Notice that in contrast to tibrvEventCallback, this vector callback does not
receive the listener event and the closure object as arguments. You can use
tibrvMsg_GetEvent() and tibrvMsg_GetClosure() to get them from the
individual message objects.
Parameter Description
messages The callback receives an array of inbound messages in this
parameter.
tibrvEvent_CreateIO()
Function
Parameter Description
event For each I/O occurrence, place this event object on the event
queue.
The program supplies a location, and the function stores the
new event object in that location.
The event object remains valid until the program explicitly
destroys it.
queue For each I/O occurrence, place the event on this event queue.
Activation and This function creates an event object that describes an I/O situation, and activates
Dispatch the event—that is, it requests notification from the operating system when that
I/O situation occurs. When the situation occurs, Rendezvous software deactivates
the event, and places the event object on its event queue. Dispatch removes the
event object from the queue, and runs the callback function to process the event.
When the callback function returns, Rendezvous software automatically
reactivates the event. (To stop the cycle, destroy the event object; see
tibrvEvent_Destroy() on page 151.)
Event Callback
I/O Event
Waiting in Function
Active
Queue Running
Event
I/O Event
Waiting in
Active
Queue
Semantics of I/O The semantics of all I/O conditions depend on the underlying operating system
Events and event manager. Rendezvous software does not change those semantics.
I/O events trigger when the operating system reports that an I/O condition on a
monitored socket would succeed (that is, transfer at least one byte without
blocking). Nonetheless, Rendezvous software cannot guarantee that a subsequent
I/O call will not block.
tibrvEvent_CreateListener()
Function
Parameter Description
event For each inbound message, place this event on the event
queue.
The program supplies a location, and the function stores the
new event in that location.
The event object remains valid until the program explicitly
destroys it.
queue For each inbound message, place the event on this event
queue.
subject Listen for inbound messages with subjects that match this
specification. Wildcard subjects are permitted. The empty
string is not a legal subject name.
Activation and Inbound messages on the transport that match the subject trigger the event.
Dispatch
This function creates a listener event object, and activates the event—that is, it
begins listening for all inbound messages with matching subjects. When a
message arrives, Rendezvous software places the event object and message on its
event queue. Dispatch removes the event object from the queue, and runs the
callback function to process the message. (To stop receiving inbound messages on
the subject, destroy the event object; this action cancels all messages already
queued for the listener event; see also tibrvEvent_Destroy() on page 151.)
Figure 9 illustrates that Rendezvous software does not deactivate the listener
when it places new message events on the queue (in contrast to I/O events, which
are temporarily deactivated). Consequently, several messages can accumulate in
the queue while the callback function is processing.
3. Dispatch event.
Callback
Event Waiting in
Function
Queue
Running
Callback
Event Waiting in Queue Function
Running
Callback
Event Waiting in Queue Function
Running
6. Destroying listener
Event Waiting in
More messages arrive. cancels messages in
Queue
the queue.
When the callback function is I/O-bound, messages can arrive faster than the
callback function can process them, and the queue can grow unacceptably long. In
applications where a delay in processing messages is unacceptable, consider
dispatching from several threads to process messages concurrently.
Listening for Use this function to listen for advisory subjects. We recommend sending advisory
Advisory message events to the default queue.
Messages
Inbox Listener To receive unicast (point-to-point) messages, listen to an inbox subject name. First
call tibrvTransport_CreateInbox() to create the unique inbox name; then call
tibrvEvent_CreateListener() to begin listening. Remember that other
programs have no information about an inbox until the listening program uses it
as a reply subject in an outbound message. See also, Inbox Names on page 115 in
TIBCO Rendezvous Concepts.
tibrvEvent_CreateTimer()
Function
Parameter Description
event At each time interval, place this event on the event queue.
The program supplies a location, and the function stores the
new event object in that location.
The event object remains valid until the program explicitly
destroys it.
queue At each time interval, place the event on this event queue.
Remarks All timers are repeating timers. To simulate a once-only timer, code the callback
function to destroy the timer.
This function creates a timer event object, and activates the timer event—that is, it
requests notification from the operating system when the timer’s interval elapses.
When the interval elapses, Rendezvous software places the event object on its
event queue. Dispatch removes the event object from the queue, and runs the
callback function to process the timer event. On dispatch Rendezvous software
also determines whether the next interval has already elapsed, and requeues the
timer event if appropriate. (To stop the cycle, destroy the event object; see
tibrvEvent_Destroy() on page 151.)
Notice that time waiting in the event queue until dispatch can increase the
effective interval of the timer. It is the programmer’s responsibility to ensure
timely dispatch of events.
1. Activate timer.
Timer Express the timer interval (in seconds) as a 64-bit floating point number. This
Granularity representation allows microsecond granularity for intervals for over 100 years.
The actual granularity of intervals depends on hardware and operating system
constraints.
tibrvEvent_CreateVectorListener()
Function
Parameter Description
event For each vector of inbound messages, place this event on the
event queue.
The program supplies a location, and the function stores the
new event in that location.
The event object remains valid until the program explicitly
destroys it.
queue For each vector of inbound messages, place the event on this
event queue.
subject Listen for inbound messages with subjects that match this
specification. Wildcard subjects are permitted. The empty
string is not a legal subject name.
Activation and This function creates a vector listener event object, and activates the event—that is,
Dispatch it begins listening for all inbound messages with matching subjects. Dispatch
removes a group of matching messages from the queue, and runs the callback
function to process the message vector.
To stop receiving inbound messages on the subject, destroy the event object; this
action cancels all messages already queued for the vector listener event; see also
tibrvEvent_Destroy() on page 151.
Interoperability Vector listeners and ordinary listeners can listen on the same queue.
Grouping When several vector listeners use the same queue, the dispatcher groups
Messages into messages into vectors with the following properties:
Vectors
• The sequence of messages in a vector reflect consecutive arrival in the queue.
• All messages in a vector share the same callback function (though they need
not match the same listener).
Suppose the Q1 contains 49 messages with subjects FOO or PHU, then 1 message
with subject BAR, then 30 more messages with subjects FOO and s. Figure 11 shows
this message queue. The dispatcher produces at least three separate events.
Because messages 49 and 50 require different callbacks, the dispatcher must close
the vector of FOO and PHU messages at message 49, and start a new vector for
message 50 with subject BAR. When the dispatcher encounters message 51 with
subject FOO again, it closes the BAR vector after only one message, and starts a
third vector for FOO.
Dispatch Order Messages dispatch in the order that they arrive in the queue. However, the order
vs. in which callbacks process messages can differ from dispatch order. The following
Processing examples illustrate this possibility by contrasting three scenarios.
Order
Example 6 Vector Listeners: Deliberately Processing Out of Order
The simplest callback (from the programmer’s perspective) processes the
messages within a vector in order (that is, the order that dispatcher moves them
from the queue into the vector, which mirrors the order in which the messages
arrive in the queue). Nonetheless you could program a callback that processes
messages in reverse order, or any other order (though one would need a
convincing reason to do so).
Msgs 1 - 49 Msgs 51 - 80
50 51
49
Thread A
Msgs 1 - 49
Thread B 49
50 Thread C
Msgs 51 - 80
51
Although message number 49 dispatches (in event A) before message 50 (in event
B), it is possible for the BAR callback (in thread B) to process message 50 before the
FOO callback (in thread A) processes message 49. Furthermore, it is even possible
for the FOO callback (in thread C) to process message 51 before the FOO callback (in
thread A) processes message 49.
tibrvEvent_Destroy()
Function
Remarks Destroying an event object cancels interest in the specified event. Upon return
from tibrvEvent_Destroy(), the destroyed event is no longer dispatched.
It is legal for an event callback function to destroy its own event argument.
Destroying event interest invalidates the event object; passing the event object as
an argument to subsequent API calls produces an error.
Parameter Description
event Cancel interest in this event.
tibrvEvent_DestroyEx()
Function
Purpose Destroy an event, and run a completion function when all of the destroyed event’s
callback functions are complete.
Remarks Destroying an event object cancels interest in the specified event. Upon return
from tibrvEvent_DestroyEx(), the destroyed event’s callback function is no
longer dispatched.
It is legal for an event callback function to destroy its own event argument.
Although tibrvEvent_DestroyEx() prevents future dispatch calls from running
the destroyed event’s callback function, that callback function might be already
running in one or more threads that dispatch events from the same queue. In each
thread where the callback function is already in progress, that callback function
does continue to run until complete. Rendezvous software ensures that the
completion function runs when the last callback-in-progress has completed; for
important details, see tibrvEventOnComplete on page 134.
Destroying event interest invalidates the event object; passing the event object as
an argument to subsequent API calls produces an error.
Parameter Description
event Cancel interest in this event.
tibrvEvent_GetIOSource()
Function
Purpose Extract the source (socket ID) from an I/O event object.
Parameter Description
event Extract the source from this I/O event object.
tibrvEvent_GetIOType()
Function
Parameter Description
event Extract the I/O type from this I/O event object.
ioType The program supplies a location. The function stores the I/O
type in that location.
tibrvEvent_GetListenerSubject()
Function
Parameter Description
event Extract the subject from this listener.
tibrvEvent_GetListenerTransport()
Function
Parameter Description
event Extract the transport from this listener.
tibrvEvent_GetTimerInterval()
Function
Parameter Description
event Extract the interval from this timer.
tibrvEvent_GetType()
Function
Parameter Description
event Extract the event type from this event object.
type The program supplies a location. The function stores the event
object’s type in that location.
tibrvEvent_GetQueue()
Function
Parameter Description
event Extract the event queue from this event object.
queue The program supplies a location. The function stores the event
object’s queue in that location.
tibrvEvent_ResetTimerInterval()
Function
Parameter Description
event Reset the interval of this timer.
newInterval The timer triggers its callback function at this new repeating
interval (in seconds).
Timer Express the timer interval (in seconds) as a 64-bit floating point number. This
Granularity representation allows microsecond granularity for intervals up to approximately
146 years. The actual granularity of intervals depends on hardware and operating
system constraints.
Limit of This function can affect a timer only before or during its interval—but not after its
Effectiveness interval has elapsed.
This function neither examines, changes nor removes an event that is already
waiting in a queue for dispatch. If the next event for the timer object is already in
the queue, then that event remains in the queue, representing the old interval. The
change takes effect with the subsequent interval. (To circumvent this limitation, a
program can destroy the old timer object and replace it with a new one.)
tibrvEventType
Type
Value Description
TIBRV_LISTEN_EVENT An event object with this type listens for inbound
messages.
tibrvIOType
Type
Value Description
TIBRV_IO_READ The socket is now readable.
Event queues organize events awaiting dispatch. Programs dispatch events to run
callback functions.
This chapter presents functions and types associated with event queues.
Topics
(Sheet 1 of 2)
Dispatch
Properties
(Sheet 2 of 2)
(Sheet 1 of 2)
(Sheet 2 of 2)
tibrvQueue
Type
#define TIBRV_DEFAULT_QUEUE
tibrvQueueHook
Function Type
Motivation Some programs need to use existing event managers to dispatch Rendezvous
events. Some event managers repeatedly poll queues for events; others require
notification that an event is ready (for example, the Microsoft Windows event
manager operates this way). This hook function can inform an event manager
when an event enters a queue and is ready for dispatch.
You can think of this function as a wake-up call to the event manager. Once
awakened, the event manager dispatches Rendezvous events in its usual way, by
calling tibrvQueue_Dispatch() or tibrvQueue_TimedDispatch().
Remarks When coding hook functions, remember that hook functions can be called from
any thread. In general, hook functions run in the thread that enqueues the event;
that thread can be a program thread, or a Rendezvous internal thread.
Parameter Description
eventQueue This parameter receives the queue on which an event has
arrived.
tibrvQueueLimitPolicy
Type
Value Description
TIBRVQUEUE_DISCARD_NONE Never discard events; use this policy when
a queue has no limit on the number of
events it can contain.
tibrvQueueOnComplete
Function Type
Purpose A program can destroy a queue object even when callback functions from its
events are running in one or more threads. Multi-threaded programs can define
functions of this type to discover when all event callback functions in progress
have completed.
Parameter Description
destroyedQueue This parameter receives the queue object.
However, by the time this function runs, the queue is
already destroyed; this function cannot use the queue
object in Rendezvous calls.
Remarks This type of function is important when several threads dispatch from the same
queue, and the program must do additional processing after the callback
functions have completed in all threads.
Upon return from tibrvQueue_DestroyEx(), the destroyed queue can no longer
dispatch events. However, in each thread where an event callback function is
already in progress, that callback function does continue to run until complete.
tibrvQueue_DestroyEx() accepts a completion function argument of type
tibrvQueueOnComplete. Rendezvous software ensures that the completion
function runs when the last callback-in-progress has completed.
tibrvQueue_Create()
Function
Parameter Description
eventQueue The program supplies a location, and the function stores the
address of a new queue in that location.
The queue remains valid until the program explicitly destroys
it.
discardAmount zero
tibrvQueue_Destroy()
Function
tibrv_status tibrvQueue_DestroyEx(
tibrvQueue eventQueue,
tibrvQueueOnComplete completionFn,
void* closure);
Remarks When a queue is destroyed, events that remain in the queue are discarded.
When a program destroys a queue, all events associated with the queue become
invalid. These invalid events still occupy storage until the program explicitly
destroys them, or until the program calls tibrv_Close().
Parameter Description
eventQueue Destroy this queue.
tibrvQueue_Dispatch()
Macro
Remarks If the queue is not empty, then this call dispatches the event at the head of the
queue, and then returns. If the queue is empty, then this call blocks indefinitely
while waiting for the queue to receive an event.
Parameter Description
eventQueue Dispatch an event from the head of this queue.
tibrvQueue_GetCount()
Function
Parameter Description
eventQueue Extract the current event count of this queue.
tibrvQueue_GetHook()
Function
Parameter Description
eventQueue Get the hook function from this queue.
tibrvQueue_GetLimitPolicy()
Function
Parameter Description
eventQueue Extract the limit information from this queue.
policy Each queue has a policy for discarding events when a new
event would cause the queue to exceed its maxEvents
limit. For an explanation of the policy values, see
tibrvQueueLimitPolicy on page 170.
The program supplies a location, and the function stores
the limit policy of the queue in that location.
maxEvents Programs can limit the number of events that a queue can
hold—either to curb queue growth, or implement a
specialized dispatch semantics.
Zero specifies an unlimited number of events.
The program supplies a location, and the function stores
the maximum event limit of the queue in that location.
discardAmount When the queue exceeds its maximum event limit, discard
a block of events. This property specifies the number of
events to discard.
The program supplies a location, and the function stores
the discard amount of the queue in that location.
tibrvQueue_GetName()
Function
Parameter Description
eventQueue Extract the name of this queue.
tibrvQueue_GetPriority()
Function
Remarks Each queue has a single priority value, which controls its dispatch precedence
within queue groups. Higher values dispatch before lower values; queues with
equal priority values dispatch in round-robin fashion.
Parameter Description
eventQueue Extract the priority of this queue.
priority The program supplies a location, and the function copies the
priority of the queue into that location.
tibrvQueue_Poll()
Macro
Remarks If the queue is not empty, then this call dispatches the event at the head of the
queue, and then returns. If the queue is empty, then this call returns immediately.
When the call dispatches an event, it returns the status code TIBRV_OK. When the
call does not dispatch an event, it returns the status code TIBRV_TIMEOUT.
Parameter Description
eventQueue Dispatch an event from the head of this queue.
tibrvQueue_RemoveHook()
Function
Parameter Description
eventQueue Remove the hook function from this queue.
tibrvQueue_SetHook()
Function
Parameter Description
eventQueue Attach the hook function to this queue.
tibrvQueue_SetLimitPolicy()
Function
Remarks This function simultaneously sets three related properties, which together
describe the behavior of a queue in overflow situations. Each call must explicitly
specify all three properties.
(Sheet 1 of 2)
Parameter Description
eventQueue Set the limit properties of this queue.
policy Each queue has a policy for discarding events when a new
event would cause the queue to exceed its maxEvents
limit. Choose from the values of tibrvQueueLimitPolicy on
page 170.
When maxEvents is zero (unlimited), the policy must be
TIBRVQUEUE_DISCARD_NONE.
maxEvents Programs can limit the number of events that a queue can
hold—either to curb queue growth, or implement a
specialized dispatch semantics.
Zero specifies an unlimited number of events; in this case,
the policy must be TIBRVQUEUE_DISCARD_NONE.
The program supplies a value, and the function sets the
maximum event limit of the queue to that value.
(Sheet 2 of 2)
Parameter Description
discardAmount When the queue exceeds its maximum event limit, discard
a block of events. This property specifies the number of
events to discard.
When discardAmount is zero, the policy must be
TIBRVQUEUE_DISCARD_NONE.
tibrvQueue_SetName()
Function
Parameter Description
eventQueue Set the name of this queue.
queueName Replace the name of the queue with this new name.
It is illegal to supply NULL as the new queue name.
tibrvQueue_SetPriority()
Function
Remarks Each queue has a single priority value, which controls its dispatch precedence
within queue groups. Higher values dispatch before lower values; queues with
equal priority values dispatch in round-robin fashion.
Changing the priority of a queue affects its position in all the queue groups that
contain it.
Parameter Description
eventQueue Set the priority of this queue.
priority Replace the priority of the queue with this new value.
The priority is a non-negative integer. Priority zero signifies
the last queue to dispatch.
tibrvQueue_TimedDispatch()
Function
Purpose Dispatch an event, but if no event is ready to dispatch, limit the time that this call
blocks while waiting for an event.
Remarks If an event is already in the queue, this call dispatches it, and returns immediately.
If the queue is empty, this call waits for an event to arrive. If an event arrives
before the waiting time elapses, then it dispatches the event and returns. If the
waiting time elapses first, then the call returns without dispatching an event.
When the call dispatches an event, it returns the status code TIBRV_OK. When the
call does not dispatch an event, it returns the status code TIBRV_TIMEOUT.
Parameter Description
eventQueue Dispatch the next event from this queue.
timeout Maximum time (in seconds) that this call can block while
waiting for an event to arrive in the queue.
TIBRV_NO_WAIT (zero) indicates no blocking (immediate
timeout).
TIBRV_WAIT_FOREVER (-1) indicates no timeout.
Queue groups add flexibility and fine-grained control to the event queue dispatch
mechanism. Programs can create groups of queues and dispatch them according
to their queue priorities.
tibrvQueueGroup
Type
tibrvQueueGroup_Add()
Function
Remarks If the queue is already in the group, adding it again has no effect, and the call
returns TIBRV_OK.
If either the queue or the group is invalid, this function returns an error status.
Parameter Description
eventQueueGroup Add an event queue to this queue group.
tibrvQueueGroup_Create()
Function
Parameter Description
eventQueueGroup The program supplies a location, and the function stores
the address of a new queue group in that location.
The queue group remains valid until the program
explicitly destroys it.
tibrvQueueGroup_Destroy()
Function
Remarks The individual queues in the group continue to exist, even though the group has
been destroyed.
Parameter Description
eventQueueGroup Destroy this event queue group.
tibrvQueueGroup_Dispatch()
Macro
Remarks If any queue in the group contains an event, then this call searches the queues in
priority order, dispatches an event from the first non-empty queue that it finds,
and then returns. If all the queues are empty, then this call blocks indefinitely
while waiting for any queue in the group to receive an event.
When searching the group for a non-empty queue, this call searches according to
the priority values of the queues. If two or more queues have identical priorities,
subsequent dispatch and poll calls rotate through them in round-robin fashion.
Parameter Description
eventQueueGroup Dispatch the next event from a queue in this group.
tibrvQueueGroup_Poll()
Macro
Remarks If any queue in the group contains an event, then this call searches the queues in
priority order, dispatches an event from the first non-empty queue that it finds,
and then returns. If all the queues are empty, then this call returns immediately.
When searching the group for a non-empty queue, this call searches according to
the priority values of the queues. If two or more queues have identical priorities,
subsequent dispatch and poll calls rotate through them in round-robin fashion.
When the call dispatches an event, it returns the status code TIBRV_OK. When the
call does not dispatch an event, it returns the status code TIBRV_TIMEOUT.
Parameter Description
eventQueueGroup Dispatch the next event from a queue in this group.
tibrvQueueGroup_Remove()
Function
Remarks If the queue is not in the group, this call returns the status code
TIBRV_INVALID_QUEUE.
Parameter Description
eventQueueGroup Remove an event queue from this queue group.
tibrvQueueGroup_TimedDispatch()
Function
Purpose Dispatch an event, but if no event is ready to dispatch, limit the time that this call
blocks while waiting for an event.
Remarks If any queue in the group contains an event, then this call searches the queues in
priority order, dispatches an event from the first non-empty queue that it finds,
and then returns. If the queue is empty, this call waits for an event to arrive in any
queue. If an event arrives before the waiting time elapses, then the call searches
the queues, dispatches the event, and returns. If the waiting time elapses first,
then the call returns without dispatching an event.
When searching the group for a non-empty queue, this call searches according to
the priority values of the queues. If two or more queues have identical priorities,
subsequent dispatch calls rotate through them in round-robin fashion.
When the call dispatches an event, it returns the status code TIBRV_OK. When the
call does not dispatch an event, it returns the status code TIBRV_TIMEOUT.
Parameter Description
eventQueueGroup Dispatch the next event from a queue in this group.
timeout Maximum time (in seconds) that this call can block
while waiting for an event to arrive in the queue group.
TIBRV_NO_WAIT (zero) indicates no blocking (immediate
timeout).
TIBRV_WAIT_FOREVER (-1) indicates no timeout.
Every program must dispatch events. This chapter describes functions that
conveniently create dispatcher threads. Programmers can use this convenience
facility, or arrange for event dispatch in other ways.
tibrvDispatchable
Type
Remarks This type can refer to either kind of dispatchable object—an event queue or a
queue group.
tibrvDispatcher
Type
tibrvDispatcher_Create()
Function
tibrv_status tibrvDispatcher_CreateEx(
tibrvDispatcher* dispatcher,
tibrvDispatchable dispatchable,
tibrv_f64 idleTimeout);
Parameter Description
dispatcher The program supplies a location, and the function stores the
address of the new dispatcher thread in that location.
dispatchable The new thread dispatches this object, which can be either a
queue or a queue group.
Stack Size On UNIX platforms that use the POSIX thread package (pthread), this call sets
the stacksize attribute of the dispatcher thread to the larger of two candidate
values—either the default stack size of the operating system, or 64 kilobytes.
For programs that require a larger stack size, we recommend that you code a
custom dispatcher thread.
tibrvDispatcher_Destroy()
Function
Parameter Description
dispatcher Destroy and exit this dispatcher thread.
We do not recommend destroying a dispatcher thread within
the same thread (for example, from within a listener callback
running within that thread). Although it is legal to do so, we
discourage this practice, because some operating systems do
not properly free internal resources associated with the thread
(which can result in memory growth).
tibrvDispatcher_GetName()
Function
Parameter Description
dispatcher Get the name of this thread.
dispatchName The program supplies a location, and the function stores the
name of the dispatcher thread in that location.
tibrvDispatcher_SetName()
Function
Parameter Description
dispatcher Set the name of this thread.
Chapter 8 Transport
tibrvTransport
Type
Intra-Process Each process has exactly one intra-process transport; the call tibrv_Open()
Transport automatically creates it, and arranges the constant TIBRV_PROCESS_TRANSPORT to
refer to it. Programs must not destroy the intra-process transport.
tibrvTransportBatchMode
Type
Value Description
TIBRV_TRANSPORT_DEFAULT_B Default batch behavior. The transport transmits outbound
ATCH messages to rvd as soon as possible.
This value is the initial default for all transports.
tibrvTransport_Create()
Function
tibrv_status tibrvTransport_CreateLicensed(
tibrvTransport* transport,
const char* service,
const char* network,
const char* daemon,
const char* licenseTicket);
Remarks These calls create only network transports. The call tibrv_Open() automatically
creates the intra-process transport; programs cannot create additional
intra-process transports.
(Sheet 1 of 2)
Parameter Description
transport The program supplies a location, and the function stores the new transport in
that location.
The transport remains valid until the program explicitly destroys it.
service The Rendezvous daemon divides the network into logical partitions. Each
network transport communicates on a single service; a transport can
communicate only with other transports on the same service.
To communicate over more than one service, a program must create more than
one transport—one transport for each service.
You can specify the service in several ways. For details, see Service Parameter
on page 103 in TIBCO Rendezvous Concepts.
NULL specifies the default rendezvous service.
(Sheet 2 of 2)
Parameter Description
network Every network transport communicates with other transports over a single
network interface. On computers with more than one network interface, the
network parameter instructs the Rendezvous daemon to use a particular
network for all outbound messages from this transport.
To communicate over more than one network, programs must create more than
one transport.
You can specify the network in several ways. For details, see Network
Parameter on page 107 in TIBCO Rendezvous Concepts.
NULL specifies the primary network interface for the host computer.
licenseTicket Embed this special license ticket in the transport object. When a licensed
transport connects to rvd, it presents this special ticket to validate its
connection (rvd uses the longest-running ticket available, which can be either
this special ticket, or a ticket from the ticket file, tibrv.tkt)
Ordinary license tickets are not valid for this parameter; see also, Embedded
License on page 213.
Description As a debugging aid, we recommend setting a unique description string for each
String transport. Use a string that distinguishes both the application and the role of the
transport within it. See tibrvTransport_SetDescription() on page 230.
Destroying Programs must explicitly destroy each transport object. Destroying a transport
Transports object invalidates subsequent send calls on that transport, invalidates any
listeners using that transport, and frees its storage. See tibrvTransport_Destroy()
on page 216.
Attempting to use a destroyed transport in any way is an error.
Embedded Specially-licensed third-party developers can use the second form of this
License function. To use this alternate form, a developer must first purchase a special
license ticket. This call embeds the special ticket in the program, so that end-users
do not need to purchase Rendezvous to use the program.
To purchase an embedded license, contact TIBCO Software Inc.
tibrvTransport_CreateInbox()
Function
This function is the only legal way for programs to create inbox subject names.
Remarks This function creates inbox names that are unique throughout the transport scope.
• For network transports, inbox subject names are unique across all processes
within the local router domain—that is, anywhere that direct multicast contact
is possible. The inbox name is not necessarily unique outside of the local
router domain.
• For the intra-process transport, inbox names are unique across all threads of
the process.
This function creates only the unique name for an inbox; it does not begin
listening for messages on that subject name. To begin listening, pass the inbox
name as the subject argument to tibrvEvent_CreateListener(). The inbox
name is only valid for use with the same transport that created it. When calling
tibrvEvent_CreateListener(), you must pass the same transport object that
created the inbox subject name.
Remember that other programs have no information about an inbox subject name
until the listening program uses it as a reply subject in an outbound message.
Programs can overwrite or free the subjectString storage at any time.
Use inbox subject names for delivery to a specific destination. In the context of a
network transport, an inbox destination specifies unicast (point-to-point)
delivery.
Rendezvous routing daemons (rvrd) translate inbox subject names that appear as
the send subject or reply subject of a message. They do not translate inbox subject
names within the data fields of a message.
(Sheet 1 of 2)
Parameter Description
transport Create an inbox on this transport.
(Sheet 2 of 2)
Parameter Description
subjectString The program supplies a string buffer, and the function
stores the new inbox subject string in that buffer.
tibrvTransport_Destroy()
Function
Parameter Description
transport Destroy this transport.
tibrvTransport_GetDaemon()
Function
Parameter Description
transport Extract the effective daemon parameter from this transport.
It is an error to supply the intra-process transport or virtual
circuit transport to this function.
tibrvTransport_GetDescription()
Function
Parameter Description
transport Extract the description parameter from this transport.
It is an error to supply the intra-process transport or virtual
circuit transport to this function.
tibrvTransport_GetNetwork()
Function
Parameter Description
transport Extract the network parameter from this transport.
It is an error to supply the intra-process transport or
virtual circuit transport to this function.
tibrvTransport_GetService()
Function
Parameter Description
transport Extract the service parameter from this transport.
It is an error to supply the intra-process transport or
virtual circuit transport to this function.
tibrvTransport_RequestReliability()
Function
Parameter Description
transport Request reliability on the service of this transport.
Remarks This call lets application programs shorten the reliability interval of the specific
service associated with a transport object. Successful calls change the daemon’s
reliability interval for all transports within the application process that use the
same service.
Programs can request reliability only from daemons of release 8.2 or later.
An application can request a shorter retention time than the value that governs
the daemon as a whole (either the factory default or the daemons -reliability
parameter). The daemon’s governing value silently overrides calls that request a
longer retention time.
Maximum Value Client transport objects that connect to the same daemon could specify different
Rule reliability intervals on the same service—whether by requesting a reliability
value, or by using the daemon’s effective value. In this situation, the daemon
selects the largest potential value from among all the transports on that service,
and uses that maximum value as the effective reliability interval for the service
(that is, for all the transports on the service). This method of resolution favors the
more stringent reliability requirements. (Contrast this rule with the Lower Value
Rule that applies between two daemons.)
Recomputing the Whenever a transport connects, requests reliability, or disconnects from the
Reliability daemon, the daemon recalculates the reliability interval for the corresponding
service, by selecting the largest value of all transports communicating on that
service.
When recomputing the reliability interval would result in a shorter retention time,
the daemon delays using the new value until after an interval equivalent to the
older (longer) retention time. This delay ensures that the daemon retains message
data at least as long as the effective reliability interval at the time the message is
sent.
tibrvTransport_Send()
Function
Parameter Description
transport Send the message on this transport.
tibrvTransport_Sendv()
Function
Remarks This function sends a group of messages with one call. In most applications this
call is more efficient than a series of send calls on individual messages.
Parameter Description
transport Send the messages on this transport.
tibrvTransport_SendReply()
Function
Remarks This function extracts the reply subject of an inbound request message, and sends
an outbound reply message to that subject. In addition to the convenience, this
call is marginally faster than using separate calls to extract the subject and send
the reply.
This function overwrites any existing send subject of the reply message with the
reply subject of the request message.
Parameter Description
transport Send the reply on this transport.
Give special attention to the order of the arguments to this function. Reversing the
inbound and outbound messages can cause an infinite loop, in which the program
repeatedly resends the inbound message to itself (and all other recipients).
tibrvTransport_SendRequest()
Function
This call blocks all other activity on its program thread. If appropriate,
programmers must ensure that other threads continue dispatching events on its
queues.
Parameter Description
transport Send the message and receive the reply on this transport.
reply The program supplies a location, and the function stores the
inbound reply in that location.
The program need not create the reply message, nor allocate
space for it. However, the program must destroy the reply
message, even though it did not create it.
timeout Maximum time (in seconds) that this call can block while
waiting for a reply.
TIBRV_WAIT_FOREVER (-1) indicates no timeout (wait without
limit for a reply).
Remarks The status code TIBRV_TIMEOUT indicates that the specified time expired before
receiving a reply.
Programs that receive and process the request message cannot determine that the
sender has blocked until a reply arrives.
The request message must have a valid destination subject; see
tibrvMsg_SetSendSubject() on page 113.
tibrvTransport_SetBatchMode()
Function
Remarks This type of batching is available only with the standard (daemon-based)
Rendezvous library. It is not available with the IPM library.
The batch mode determines when the transport transmits outbound message data
to rvd:
• As soon as possible (the initial default for all transports)
• Either when its buffer is full, or when a timer interval expires—either event
triggers transmission to the daemon
Parameter Description
transport Set the batch mode parameter of this transport.
tibrvTransport_SetBatchSize()
Purpose Enable outbound batching of data from IPM, and set the batch size (in bytes).
Remarks This type of batching is available only with the IPM library. It is not available with
the standard (daemon-based) Rendezvous library.
When the batch size is greater than zero, IPM transfers data to the network in
batches. This option can increase throughput, at the cost of higher latency.
When the batch size is zero, IPM transfers data to the network immediately, for
lowest latency.
If you do not explicitly set the batch size using this call, then the default behavior
disables outbound batching.
Contraindications
These conditions characterize situations in which we do not recommend batching:
• Data latency is not acceptable.
• Batch behavior does not produce measurable improvements in the
performance of your application.
Parameter Description
transport Enable (or disable) batching for this transport.
tibrvTransport_SetDescription()
Function
Parameter Description
transport Set the description parameter of this transport.
It is an error to supply the intra-process transport or virtual
circuit transport to this function.
tibrvTransport_CreateAcceptVc()
Function
Remarks A virtual circuit transport can fill the same roles as an ordinary transport.
Programs can supply them as arguments to calls that create inbox names, send
messages, create listeners and other events.
Parameter Description
vcTransport The program supplies a location, and the function stores the new virtual circuit
accept transport in that location.
connectSubject The program supplies a location, and the function stores the connect subject of
the new virtual circuit accept transport in that location.
After this call returns, the program must send a message to another program,
inviting it to establish a virtual circuit. Furthermore, the reply subject of that
invitation message must be this connect subject. To complete the virtual circuit,
the second program must extract this subject from the invitation, and supply it
to tibrvTransport_CreateConnectVc().
transport The virtual circuit uses this ordinary transport for communications.
Programs may use this transport for other purposes.
It is illegal to supply a virtual circuit transport object for this parameter (that is,
you cannot nest a virtual circuit within another virtual circuit).
Test Before Either of two conditions indicate that the connection is ready to use:
Using
• The transport presents the VC.CONNECTED advisory.
• tibrvTransport_WaitForVcConnection() returns without error.
Immediately after this call, test both conditions with these two steps (in this
order):
1. Listen on the virtual circuit transport object for the VC.CONNECTED advisory.
For an explanation, see Testing the New Connection on page 123 in TIBCO
Rendezvous Concepts.
Destroying VC Programs must explicitly destroy each virtual circuit transport object. Destroying
Transports a transport object precludes subsequent communications on that transport, and
frees its storage. Attempting to use a destroyed transport in any way is an error.
See tibrvTransport_Destroy() on page 216.
Destroying a virtual circuit transport does not affect the ordinary transport that
the terminal employs.
Direct Because virtual circuits rely on point-to-point messages between the two
Communication terminals, they can use direct communication to good advantage. To do so, both
terminals must use network transports that enable direct communication.
For an overview, see Direct Communication on page 116 in TIBCO Rendezvous
Concepts.
For programming details, see Specifying Direct Communication on page 105 in
TIBCO Rendezvous Concepts.
Disabled Although virtual circuit transport objects have the same data type as transport
Functions objects, some transport functions are disabled for virtual circuit objects.
Transport Functions
Legal Calls for tibrvTransport_CreateInbox()
tibrvTransport_Destroy()
Virtual Circuit
tibrvTransport_Send()
Transports
tibrvTransport_SendReply()
tibrvTransport_SendRequest()
Transport Functions
Disabled Calls for tibrvTransport_GetDaemon()
Virtual Circuit tibrvTransport_GetDescription()
Transports tibrvTransport_GetNetwork()
tibrvTransport_GetService()
tibrvTransport_SetBatchMode()
tibrvTransport_SetDescription()
tibrvTransport_CreateConnectVc()
Function
Remarks A virtual circuit transport can fill the same roles as an ordinary transport.
Programs can supply them as arguments to calls that create inbox names, send
messages, create listeners and other events.
Parameter Description
vcTransport The program supplies a location, and the function stores the new virtual circuit
connect transport in that location.
connectSubject The connect transport uses this connect subject to establish a virtual circuit
with an accept transport in another program.
The program must receive this connect subject from the accepting program.
The call to tibrvTransport_CreateAcceptVc() creates this subject.
transport The virtual circuit uses this ordinary transport for communications.
Programs may use this transport for other purposes.
It is illegal to supply a virtual circuit transport object for this parameter (that is,
you cannot nest a virtual circuit within another virtual circuit).
Test Before Either of two conditions indicate that the connection is ready to use:
Using
• The transport presents the VC.CONNECTED advisory.
• tibrvTransport_WaitForVcConnection() returns without error.
Immediately after this call, test both conditions with these two steps (in this
order):
1. Listen on the virtual circuit transport object for the VC.CONNECTED advisory.
2. Call tibrvTransport_WaitForVcConnection() with zero as the timeout
parameter.
For an explanation, see Testing the New Connection on page 123 in TIBCO
Rendezvous Concepts.
Destroying VC Programs must explicitly destroy each virtual circuit transport object. Destroying
Transports a transport object precludes subsequent communications on that transport, and
frees its storage. Attempting to use a destroyed transport in any way is an error.
See tibrvTransport_Destroy() on page 216.
Destroying a virtual circuit transport does not affect the ordinary transport that
the terminal employs.
Direct Because virtual circuits rely on point-to-point messages between the two
Communication terminals, they can use direct communication to good advantage. To do so, both
terminals must use network transports that enable direct communication.
For an overview, see Direct Communication on page 116 in TIBCO Rendezvous
Concepts.
For programming details, see Specifying Direct Communication on page 105 in
TIBCO Rendezvous Concepts.
tibrvTransport_WaitForVcConnection()
Function
Remarks This function produces the same information as the virtual circuit advisory
messages—but it produces it synchronously (while advisories are asynchronous).
Programs can use this function not only to test the connection, but also to block
until the connection is ready to use.
For example, a program can create a terminal object, then call this function to wait
until the connection completes.
Parameter Description
vcTransport Wait until this virtual circuit transport object has established a connection with
its opposite terminal. You may supply either an accept terminal or a connect
terminal as an argument.
(Sheet 1 of 2)
Status Description
TIBRV_OK The connection is complete (ready to use).
TIBRV_TIMEOUT The connection is not yet complete, but the non-negative time limit
for waiting has expired.
(Sheet 2 of 2)
Status Description
TIBRV_VC_NOT_CONNECTED The connection was formerly complete, but is now irreparably
broken.
See Also
For a complete discussion of concepts and operating principles, see Fault
Tolerance Concepts on page 197 in TIBCO Rendezvous Concepts.
For suggestions to help you design programs using fault tolerance features, see
Fault Tolerance Programming on page 215 in TIBCO Rendezvous Concepts.
For step-by-step hints for implementing fault-tolerant systems, see Developing
Fault-Tolerant Programs on page 229 in TIBCO Rendezvous Concepts.
Fault tolerance software uses advisory messages to inform programs of status
changes. For details, see Fault Tolerance (RVFT) Advisory Messages on page 315
in TIBCO Rendezvous Concepts.
If your application distributes fault-tolerant processes across network boundaries,
you must configure the Rendezvous routing daemons to exchange _RVFT
administrative messages. For details, see Fault Tolerance on page 407 in TIBCO
Rendezvous Administration, and discuss with your network administrator.
(Sheet 1 of 3)
(Sheet 2 of 3)
Monitors
(Sheet 3 of 3)
tibrvft_Version()
Function
tibrvftAction
Type
} tibrvftAction;
Remarks Each token of this enumerated type designates a command to a fault tolerance
callback function. The program’s callback function receives one of these tokens in
a parameter, and interprets it as an instruction from the Rendezvous fault
tolerance software as described in this table (see also, Fault Tolerance Callback
Actions on page 216 in TIBCO Rendezvous Concepts).
Token Description
TIBRVFT_PREPARE_TO_ACTIVATE Prepare to activate (hint).
Rendezvous fault tolerance software passes this token to the
callback function to instruct the program to make itself ready
to activate on short notice—so that if the callback function
subsequently receives the instruction to activate, it can do so
without delay.
This token is a hint, indicating that the program might soon
receive an instruction to activate. It does not guarantee that an
activate instruction will follow, nor that any minimum time
will elapse before an activate instruction follows.
tibrvftMember
Type
tibrvftMemberCallback
Function Type
Remarks Each member program of a fault tolerance group must define a function of this
type. Programs register a member callback function with each call to
tibrvftMember_Create().
For additional information see Fault Tolerance Callback Actions on page 216 in
TIBCO Rendezvous Concepts.
(Sheet 1 of 2)
Parameter Description
member This parameter receives the member object.
(Sheet 2 of 2)
Parameter Description
groupName This parameter receives a string denoting the name of the fault
tolerance group.
closure This parameter receives the closure data, which the program
supplied in the call that created the member object.
tibrvftMemberOnComplete
Function Type
Purpose A program can destroy a member object even when its callback function is
running in one or more threads. Multi-threaded programs can define functions of
this type to discover when all callback functions in progress have completed.
Parameter Description
destroyedMember This parameter receives the member event object. This
object is identical to the object that the program created
to join the fault tolerance group.
However, by the time this function runs, the member is
already destroyed; this function cannot use the member
object in Rendezvous calls.
tibrvftMember_Create()
Function
Remarks Upon creating a member object, the program becomes a member of the group.
A program may hold simultaneous memberships in several distinct fault
tolerance groups. For examples, see Multiple Groups on page 219 in TIBCO
Rendezvous Concepts.
Avoid joining the same group twice. It is illegal for a program to maintain more
than one membership in any one fault tolerance group. The function
tibrvftMember_Create() does not guard against this illegal situation, and
results are unpredictable.
All arguments are required except for preparationInterval (which may be
zero) and closure (which may be NULL).
(Sheet 1 of 3)
Parameter Description
member This member object denotes membership in a fault tolerance group.
The program supplies a location, and the function stores the new
member object in that location.
The member object remains valid until the program explicitly destroys it.
queue Place fault tolerance events for this member on this event queue.
transport Use this transport for fault tolerance internal protocol messages (such as
heartbeat messages).
(Sheet 2 of 3)
Parameter Description
groupName Join the fault tolerant group with this name.
The group name must conform to the syntax required for Rendezvous
subject names. For details, see Subject Names on page 61 in TIBCO
Rendezvous Concepts.
weight Weight represents the ability of this member to fulfill its purpose, relative
to other members of the same fault tolerance group. Rendezvous fault
tolerance software uses relative weight values to select which members
to activate; members with higher weight take precedence over members
with lower weight.
Acceptable values range from 1 to 65535. Zero is a special, reserved
value; Rendezvous fault tolerance software assigns zero weight to
processes with resource errors, so they only activate when no other
members are available.
For more information, see Rank and Weight on page 206 in TIBCO
Rendezvous Concepts.
heartbeatInterval When this member is active, it sends heartbeat messages at this interval
(in seconds).
The interval must be positive. To determine the correct value, see Step 4:
Choose the Intervals on page 237 in TIBCO Rendezvous Concepts.
preparationInterval When the heartbeat signal from one or more active members has been
silent for this interval (in seconds), Rendezvous fault tolerance software
issues an early warning hint (TIBRVFT_PREPARE_TO_ACTIVATE) to the
ranking inactive member. This warning lets the inactive member prepare
to activate, for example, by connecting to a database server, or allocating
memory.
The interval must be non-negative. Zero is a special value, indicating
that the member does not need advance warning to activate;
Rendezvous fault tolerance software never issues a
TIBRVFT_PREPARE_TO_ACTIVATE hint when this value is zero. To
determine the correct value, see Step 4: Choose the Intervals on page 237
in TIBCO Rendezvous Concepts.
(Sheet 3 of 3)
Parameter Description
activationInterval When the heartbeat signal from one or more active members has been
silent for this interval (in seconds), Rendezvous fault tolerance software
considers the silent member to be lost, and issues the instruction to
activate (TIBRVFT_ACTIVATE) to the ranking inactive member.
When a new member joins a group, Rendezvous fault tolerance software
identifies the new member to existing members (if any), and then waits
for this interval to receive identification from them in return. If, at the
end of this interval, it determines that too few members are active, it
issues the activate instruction (TIBRVFT_ACTIVATE) to the new member.
Then interval must be positive. To determine the correct value, see Step
4: Choose the Intervals on page 237 in TIBCO Rendezvous Concepts.
Intervals The heartbeat interval must be less than the activation interval. If the preparation
interval is non-zero, it must be greater than the heartbeat interval and less than
the activation interval. It is an error to violate these rules.
In addition, intervals must be reasonable for the hardware and network
conditions. For information and examples, see Step 4: Choose the Intervals on
page 237 in TIBCO Rendezvous Concepts.
Group Name The group name must be a legal Rendezvous subject name (see Subject Names on
page 61 in TIBCO Rendezvous Concepts). You may use names with several
elements; for examples, see Multiple Groups on page 219 in TIBCO Rendezvous
Concepts.
tibrvftMember_Destroy()
Function
tibrv_status tibrvftMember_DestroyEx(
tibrvftMember member,
tibrvftMemberOnComplete completionFunction);
Parameter Description
member Destroy this member object, and cancel
membership in its fault tolerance group.
tibrvftMember_GetGroupName()
Function
Parameter Description
member Extract the group name from this member object.
groupName The program supplies a location, and the function stores the
group name in that location.
tibrvftMember_GetQueue()
Function
Parameter Description
member Extract the event queue from this member object.
queue The program supplies a location, and the function stores the
queue in that location.
tibrvftMember_GetTransport()
Function
Parameter Description
member Extract the transport from this member object.
transport The program supplies a location, and the function stores the
transport in that location.
tibrvftMember_GetWeight()
Function
Parameter Description
member Extract the weight from this member object.
weight The program supplies a location, and the function stores the
weight in that location.
tibrvftMember_SetWeight()
Function
Purpose Change the weight of a fault tolerance member within its group.
Remarks Weight summarizes the relative suitability of a member for its task, relative to
other members of the same fault tolerance group. That suitability is a combination
of computer speed and load factors, network bandwidth, computer and network
reliability, and other factors. Programs may reset their weight when any of these
factors change, overriding the previous assigned weight.
You can use relative weights to indicate priority among group members.
Zero is a special value; Rendezvous fault tolerance software assigns zero weight
to processes with resource errors, so they only activate when no other members
are available. Programs must always assign weights greater than zero.
When Rendezvous fault tolerance software requests a resource but receives an
error (for example, the member process cannot allocate memory, or start a timer),
it attempts to send the member process a DISABLING_MEMBER advisory message,
and sets the member’s weight to zero, effectively disabling the member. Weight
zero implies that this member is active only as a last resort—when no other
members outrank it. (However, if the disabled member process does become
active, it might not operate correctly.)
Parameter Description
member Set the weight of this member object.
See Also Adjusting Member Weights, page 227 in TIBCO Rendezvous Concepts
tibrvftMonitor
Type
tibrvftMonitorCallback
Function Type
Remarks A program must define a function of this type as a prerequisite for monitoring a
fault tolerance group. Programs register a monitor callback function with each
call to tibrvftMonitor_Create() on page 263.
Rendezvous fault tolerance software queues a monitor event whenever the
number of active members in the group changes.
A program need not be a member of a group in order to monitor that group.
Programs that do not monitor need not define a monitor callback function.
Parameter Description
monitor This parameter receives the monitor object.
tibrvftMonitorOnComplete
Function Type
Purpose A program can destroy a monitor object even when its callback function is
running in one or more threads. Multi-threaded programs can define functions of
this type to discover when all callback functions in progress have completed.
Parameter Description
destroyedMonitor This parameter receives the monitor event object. This
object is identical to the object that the program
created to monitor the fault tolerance group.
However, by the time this function runs, the monitor
is already destroyed; this function cannot use the
monitor object in Rendezvous calls.
tibrvftMonitor_Create()
Function
Remarks Monitors are passive—they do not affect the group members in any way.
Rendezvous fault tolerance software queues a monitor event whenever the
number of active members in the group changes—either it detects a new
heartbeat, or it detects that the heartbeat from a previously active member is now
silent, or it receives a message from the fault tolerance component of an active
member indicating deactivation or termination.
The monitor callback function receives the number of active members as an
argument.
The group need not have any members at the time of this function call.
(Sheet 1 of 2)
Parameter Description
monitor This monitor object denotes a passive monitor of a fault
tolerance group.
The program supplies a location, and the function stores the
new monitor object in that location.
The monitor object remains valid until the program
explicitly destroys it.
(Sheet 2 of 2)
Parameter Description
groupName Monitor the fault tolerant group with this name.
The group name must conform to the syntax required for
Rendezvous subject names. For details, see Subject Names
on page 61 in TIBCO Rendezvous Concepts.
See also, Group Name on page 264.
lostInterval When the heartbeat signal from an active member has been
silent for this interval (in seconds), Rendezvous fault
tolerance software considers that member lost, and queues a
monitor event.
The interval must be positive. To determine the correct
value, see Step 4: Choose the Intervals on page 237 in TIBCO
Rendezvous Concepts.
See also, Lost Interval on page 264.
Lost Interval The monitor uses the lostInterval to determine whether a member is still
active. When the heartbeat signal from an active member has been silent for this
interval (in seconds), the monitor considers that member lost, and queues a
monitor event.
We recommend setting the lostInterval identical to the group’s
activationInterval, so the monitor accurately reflects the behavior of the
group members.
Group Name The group name must be a legal Rendezvous subject name (see Subject Names on
page 61 in TIBCO Rendezvous Concepts). You may use names with several
elements; for examples, see Multiple Groups on page 219 in TIBCO Rendezvous
Concepts.
tibrvftMonitor_Destroy()
Function
tibrv_status tibrvftMonitor_DestroyEx(
tibrvftMonitor monitor,
tibrvftMonitorOnComplete completionFunction);
Purpose Stop monitoring a fault tolerance group, and free associated resources.
Parameter Description
monitor Destroy this monitor object.
tibrvftMonitor_GetGroupName()
Function
Parameter Description
monitor Extract the group name from this monitor object.
groupName The program supplies a location, and the function stores the
group name in that location.
tibrvftMonitor_GetQueue()
Function
Parameter Description
monitor Extract the event queue from this monitor object.
queue The program supplies a location, and the function stores the
queue in that location.
tibrvftMonitor_GetTransport()
Function
Parameter Description
monitor Extract the transport from this monitor object.
transport The program supplies a location, and the function stores the
transport in that location.
See Also This API implements Rendezvous certified delivery features. For a complete
discussion, see Certified Message Delivery on page 139 in TIBCO Rendezvous
Concepts.
Certified delivery software uses advisory messages extensively. For example,
advisories inform sending and receiving programs of the delivery status of each
message. For complete details, see Certified Message Delivery (RVCM) Advisory
Messages on page 291 in TIBCO Rendezvous Concepts.
If your application sends or receives certified messages across network
boundaries, you must configure the Rendezvous routing daemons to exchange
_RVCM administrative messages. For details, see Certified Message Delivery on
page 403 in TIBCO Rendezvous Administration.
Some programs require certified delivery to one of n listeners. See Distributed
Queue on page 183 in TIBCO Rendezvous Concepts.
Topics
(Sheet 1 of 5)
Sending Messages
Registration
(Sheet 2 of 5)
Relay Agents
Ledger
Listener Attributes
(Sheet 3 of 5)
Transport Attributes
(Sheet 4 of 5)
Message Attributes
(Sheet 5 of 5)
(Sheet 1 of 4)
(Sheet 2 of 4)
(Sheet 3 of 4)
(Sheet 4 of 4)
Certified Messages
tibrvcm_Version()
Function
tibrvcmEvent
Type
Purpose A certified delivery event object listens for labeled messages and certified
messages.
tibrvcmEventCallback
Function Type
Purpose Programs define functions of this type to process inbound certified or labeled
messages.
Remarks This callback function must also be able to process uncertified and unlabeled
messages.
Parameter Description
cmListener This parameter receives the listener object. This object is
identical to the certified listener object that the program
created to begin listening.
closure This parameter receives the closure data, which the program
supplied in the call that created the event object.
tibrvcmEvent_ConfirmMsg()
Function
Remarks Use this function only in programs that override automatic confirmation (see
tibrvcmEvent_SetExplicitConfirm() on page 291). The default behavior of
certified listeners is to automatically confirm delivery when the callback function
returns.
Parameter Description
cmListener Confirm receipt by this listener.
Unregistered When a CM listener receives a labeled message, its behavior depends on context:
Message
• If a CM listener is registered for certified delivery, it presents the
supplementary information to the callback function. If the sequence number is
present, then the receiving program can confirm delivery.
• If a CM listener is not registered for certified delivery with the sender, it
presents the sender’s name to the callback function, but omits the sequence
number. In this case, the receiving program cannot confirm delivery;
tibrvcmEvent_ConfirmMsg() returns the status code
TIBRV_NOT_PERMITTED.
Notice that the first labeled message that a program receives on a subject
might not be certified; that is, the sender has not registered a certified delivery
agreement with the listener. If appropriate, the certified delivery library
automatically requests that the sender register the listener for certified
delivery. (See Discovery and Registration for Certified Delivery on page 154 in
TIBCO Rendezvous Concepts.)
A labeled but uncertified message can also result when the sender explicitly
disallows or removes the listener.
tibrvcmEvent_CreateListener()
Function
Purpose Listen for messages that match the subject, and request certified delivery when
available.
Parameter Description
cmListener For each inbound message, place this listener event on the
event queue.
The program supplies a location, and the function stores the
new listener object in that location.
The event object remains valid until the program explicitly
destroys it.
queue For each inbound message, place the listener event on this
event queue.
subject Listen for inbound messages with subjects that match this
specification. Wildcard subjects are permitted. The empty
string is not a legal subject name.
Activation and Details of listener event semantics are identical to those for ordinary listeners; see
Dispatch Activation and Dispatch on page 140.
Inbox Listener To receive unicast (point-to-point) messages, listen to a unique inbox subject
name. First call tibrvTransport_CreateInbox() to create the unique inbox
name; then call tibrvcmEvent_CreateListener() to begin listening. Remember
that other programs have no information about an inbox until the listening
program uses it as a reply subject in an outbound message.
tibrvcmEvent_Destroy()
Function
tibrv_status tibrvcmEvent_DestroyEx(
tibrvcmEvent cmListener,
tibrv_bool cancelAgreements,
tibrvEventOnComplete completionFunction);
Parameter Description
cmListener Destroy this listener.
Remarks Destroying event interest invalidates the event object; passing the event object as
an argument to subsequent API calls produces an error.
Canceling When destroying a listener, a program can either cancel its certified delivery
Agreements agreements with senders, or let those agreements persist (so a successor listener
can receive the messages covered by those agreements).
tibrvcmEvent_GetListenerSubject()
Function
Purpose Extract the subject from a certified delivery listener event object.
Parameter Description
cmListener Extract the subject from this listener.
tibrvcmEvent_GetListenerTransport()
Function
Purpose Extract the certified delivery transport from a certified delivery listener event
object.
Parameter Description
cmListener Extract the transport from this listener.
tibrvcmEvent_GetQueue()
Function
Parameter Description
cmListener Extract the event queue from this event object.
queue The program supplies a location. The function stores the event
object’s queue in that location.
tibrvcmEvent_SetExplicitConfirm()
Function
Parameter Description
cmListener Override automatic confirmation for this listener.
tibrvcmTransport
Type
Purpose A certified delivery transport object implements the CM delivery protocol for
messages.
tibrvcmTransportOnComplete
Function Type
Remarks After calling the extended destroy function, programs must not destroy the
transport’s listeners, nor any queue nor dispatcher that pertains to the transport,
until after this callback signals that cleanup has completed.
Parameter Description
destroyedTransport This parameter receives the transport object.
However, by the time this function runs, the transport is already
destroyed; this function cannot use the transport object in Rendezvous
calls.
closure This parameter receives the closure data, which the program supplied to
tibrvcmTransport_DestroyEx().
tibrvcmTransport_AddListener()
Function
Remarks Some sending programs can anticipate requests for certified delivery—even
before the listening programs actually register. In such situations, the sender can
pre-register listeners, so Rendezvous software begins storing outbound messages
in the sender’s ledger; when the listener requests certified delivery, it receives the
backlogged messages.
If the correspondent with this cmName already receives certified delivery of this
subject from this sender transport, then tibrvcmTransport_AddListener()
has no effect.
If the correspondent with this cmName is disallowed,
tibrvcmTransport_AddListener() returns the status code
TIBRV_NOT_PERMITTED. You can call tibrvcmTransport_AllowListener() to
supersede the effect of a prior call to tibrvcmTransport_DisallowListener();
then call tibrvcmTransport_AddListener() again.
It is not sufficient for a sender to use this function to anticipate listeners; the
anticipated listening programs must also require old messages when creating
certified delivery transports.
Parameter Description
cmTransport Instruct this transport to pre-register the named listeners.
tibrvcmTransport_AllowListener()
Function
Purpose Invite the named receiver to reinstate certified delivery for its listeners,
superseding the effect of any previous disallow calls.
Remarks Upon receiving the invitation to reinstate certified delivery, Rendezvous software
at the listening program automatically sends new registration requests. The
sending program accepts these requests, restoring certified delivery.
Parameter Description
cmTransport Instruct this transport to allow the named listeners.
tibrvcmTransport_ConnectToRelayAgent()
Function
Parameter Description
cmTransport Connect this transport to its relay agent.
If the transport is already connected to its relay agent, then this function returns
TIBRV_OK, and does not trigger a RELAY.CONNECTED advisory.
Errors The error code TIBRV_ARG_CONFLICT can indicate that the transport does not
have a relay agent.
tibrvcmTransport_Create()
Function
Remarks The new certified delivery transport must employ a valid transport for network
communications.
(Sheet 1 of 3)
Parameter Description
cmTransport The program supplies a location, and the function stores the
new certified delivery transport in that location.
The certified delivery transport remains valid until the
program explicitly destroys it.
(Sheet 2 of 3)
Parameter Description
cmName Bind this reusable name to the new cmTransport, so the
cmTransport represents a persistent correspondent with this
name.
If non-NULL, the name must conform to the syntax rules for
Rendezvous subject names. It cannot begin with reserved
tokens. It cannot be a non-reusable name generated by another
call to tibrvcmTransport_Create(). It cannot be the empty
string.
If this argument is NULL, then tibrvcmTransport_Create()
generates a unique, non-reusable name for the duration of the
transport.
For more information, see Name on page 300.
(Sheet 3 of 3)
Parameter Description
syncLedger If this argument is TIBRV_TRUE, then operations that update
the ledger file do not return until the changes are written to the
storage medium.
If this argument is TIBRV_FALSE, the operating system writes
changes to the storage medium asynchronously.
relayAgent Designate the rvrad process with this name as the new
transport’s relay agent.
NULL specifies that the new cmTransport does not use a relay
agent.
If non-NULL, the relay agent name must conform to the syntax
rules for reusable names. For details, see Reusable Names on
page 167 in TIBCO Rendezvous Concepts.
It is illegal for a relay agent to have the same name as a CM
correspondent.
We strongly discourage using the empty string as a relay agent
name.
For more information, see Relay Agent on page 300.
Ledger File Every certified delivery transport stores the state of its certified communications
in a ledger.
If ledgerFile is NULL, then the new transport stores its ledger exclusively in
process-based storage. When you destroy the transport or the process terminates,
all information in the ledger is lost.
If ledgerFile specifies a valid file name, then the new transport uses that file for
ledger storage. If the transport is destroyed or the process terminates with
incomplete certified communications, the ledger file records that state. When a
new transport binds the same reusable name, it reads the ledger file and continues
certified communications from the state stored in the file.
Even though a transport uses a ledger file, it may sometimes replicate parts of the
ledger in process-based storage for efficiency; however, programmers cannot rely
on this replication.
The syncLedger parameter determines whether writing to the ledger file is a
synchronous operation:
• To specify synchronous writing, supply TIBRV_TRUE. Each time Rendezvous
software writes a ledger item, the call does not return until the data is safely
stored in the storage medium.
• To specify asynchronous writing, supply TIBRV_FALSE. CM calls may return
before the data is safely stored in the storage medium, which results in greater
speed at the cost of certainty. The ledger file might not accurately reflect
program state in cases of hardware or operating system kernel failure (but it is
accurate in cases sudden program failure). Despite this small risk, we strongly
recommend this option for maximum performance.
A program that uses an asynchronous ledger file can explicitly synchronize it
by calling tibrvcmTransport_SyncLedger() on page 325.
Destroying a transport with a file-based ledger always leaves the ledger file intact;
it neither erases nor removes a ledger file.
The ledger file must reside on the same host computer as the program that uses it.
tibrvcmTransport_Destroy()
Function
tibrv_status tibrvcmTransport_DestroyEx(
tibrvcmTransport cmTransport,
tibrvcmTransportOnComplete completionFunction,
void* closure);
Parameter Description
cmTransport Destroy this transport.
Remarks Destroying a certified delivery transport with a file-based ledger always leaves
the ledger file intact; it neither erases nor removes a ledger file.
This function automatically disconnects the transport from its relay agent before
destroying the object; see tibrvcmTransport_DisconnectFromRelayAgent().
tibrvcmTransport_DisallowListener()
Function
Remarks Disallowed listeners still receive subsequent messages from this sender, but
delivery is not certified. In other words:
• The first labeled message causes the listener to initiate registration.
Registration fails, and the listener discards that labeled message.
• The listener receives a REGISTRATION.NOT_CERTIFIED advisory, informing it
that the sender has canceled certified delivery of all subjects.
• If the sender’s ledger contains messages sent to the disallowed listener (for
which this listener has not confirmed delivery), then Rendezvous software
removes those ledger items, and does not attempt to redeliver those messages.
• Rendezvous software presents subsequent messages (from the canceling
sender) to the listener without a sequence number, to indicate that delivery is
not certified.
Parameter Description
cmTransport Instruct this transport to disallow the named listeners.
tibrvcmTransport_DisconnectFromRelayAgent()
Function
Parameter Description
cmTransport Disconnect this transport from its relay agent.
Remarks Disconnect calls are non-blocking; they immediately return control to the
program, and asynchronously proceed with these clean-up tasks:
• If the client transport is a CM listener, the relay agent attempts to synchronize
its listening state with the transport (to assure that the relay agent adequately
represents the listening interest of the client).
• The transport stops communicating with the relay agent.
• The transport stores subsequent outbound events—including data messages
and protocol state changes. If the transport is a certified sender, it cancels its
request for delivery confirmation of outstanding unconfirmed messages. (See
also, Requesting Confirmation on page 157 in TIBCO Rendezvous Concepts.)
• The relay agent stores subsequent inbound events for the transport—
including data messages and protocol state changes.
• A transport that explicitly disconnects without terminating receives a
RELAY.DISCONNECTED advisory, informing it that is safe to sever the physical
network connection. (Terminating transports never receive this advisory;
instead, it is safe to sever the connection when the destroy call returns.)
Errors The error code TIBRV_ARG_CONFLICT can indicate that the transport does not
have a relay agent.
tibrvcmTransport_ExpireMessages()
Function
Remarks This call checks the ledger for messages that match both the subject and sequence
number criteria, and immediately marks them as expired.
Once a message has expired, the CM transport no longer attempts to redeliver it
to registered listeners.
Rendezvous software presents each expired message to the sender in a
DELIVERY.FAILED advisory. Each advisory includes all the fields of an expired
message. (This call can cause many messages to expire simultaneously.)
Use with extreme caution. This call exempts the expired messages from certified
delivery semantics. It is appropriate only in very few situations.
For example, consider an application program in which an improperly formed
CM message causes registered listeners to exit unexpectedly. When the listeners
restart, the sender attempts to redeliver the offending message, which again
causes the listeners to exit. To break this cycle, the sender can expire the offending
message (along with all prior messages bearing the same subject).
Parameter Description
cmTransport Mark messages as expired in the ledger for this CM
transport.
tibrvcmTransport_GetDefaultCMTimeLimit()
Function
Purpose Get the default message time limit for all outbound certified messages from a
transport.
Remarks Every labeled message has a time limit, after which the sender no longer certifies
delivery.
Sending programs can explicitly set the time limit on a message (see
tibrvMsg_SetCMTimeLimit() on page 330). If a time limit is not already set for the
outbound message, the transport sets it to the transport’s default time limit
(extractable with this function); if this default is not set for the transport (nor for
the message), the default time limit is zero (no time limit).
Time limits represent the minimum time that certified delivery is in effect.
Parameter Description
cmTransport Set the default message time limit of this transport.
timeLimit The program supplies a location, and the function stores the
default time limit (in whole seconds) in that location.
tibrvcmTransport_GetLedgerName()
Function
Parameter Description
cmTransport Extract the ledger name from this certified delivery transport
object.
ledgerName The program supplies a location, and the function stores the
ledger name in that location.
Errors The error code TIBRV_ARG_CONFLICT can indicate that the transport does not
have a ledger file.
tibrvcmTransport_GetName()
Function
Parameter Description
cmTransport Extract the name from this certified delivery transport object.
cmName The program supplies a location, and the function stores the
correspondent name in that location.
tibrvcmTransport_GetRelayAgent()
Function
Purpose Extract the name of the relay agent used by a certified delivery transport.
Parameter Description
cmTransport Extract the relay agent from this certified delivery transport
object.
relayAgent The program supplies a location, and the function stores the
name of the relay agent in that location.
Errors The error code TIBRV_ARG_CONFLICT can indicate that the transport does not
have a relay agent.
tibrvcmTransport_GetRequestOld()
Function
Purpose Extract the request old messages flag of a certified delivery transport.
Parameter Description
cmTransport Extract the request old messages flag from this certified
delivery transport object.
requestOld The program supplies a location, and the function stores the
request old messages flag in that location.
tibrvcmTransport_GetSyncLedger()
Function
Parameter Description
cmTransport Extract the sync ledger flag from this certified delivery
transport object.
syncLedger The program supplies a location, and the function stores the
sync ledger flag in that location.
Errors The error code TIBRV_ARG_CONFLICT can indicate that the transport does not
have a ledger file.
tibrvcmTransport_GetTransport()
Function
Parameter Description
cmTransport Extract the transport from this certified delivery transport
object.
transport The program supplies a location, and the function stores the
transport in that location.
tibrvcmTransport_RemoveListener()
Function
Remarks This function cancels certified delivery of the specific subject to the
correspondent with this name. The listening correspondent may subsequently
re-register for certified delivery of the subject. (In contrast,
tibrvcmTransport_DisallowListener() cancels certified delivery of all
subjects to the correspondent, and prohibits re-registration.)
Senders can call this function when the ledger item for a listening correspondent
has grown very large. Such growth indicates that the listener is not confirming
delivery, and may have terminated. Removing the listener reduces the ledger size
by deleting messages stored for the listener.
When a sending program calls this function, certified delivery software in the
sender behaves as if the listener had closed the endpoint for the subject. The
sending program deletes from its ledger all information about delivery of the
subject to the correspondent with this cmName. The sending program receives a
REGISTRATION.CLOSED advisory, to trigger any operations in the callback
function for the advisory.
If the listening correspondent is available (running and reachable), it receives a
REGISTRATION.NOT_CERTIFIED advisory, informing it that the sender no longer
certifies delivery of the subject.
If the correspondent with this name does not receive certified delivery of the
subject from this sender cmTransport, then
tibrvcmTransport_RemoveListener() returns the status code
TIBRV_INVALID_SUBJECT.
Parameter Description
cmTransport Instruct this transport to unregister the specified listeners.
tibrvcmTransport_RemoveSendState()
Function
Background In some programs subject names are useful only for a limited time; after that time,
they are never used again. For example, consider a server program that sends
certified reply messages to client inbox names; it only sends one reply message to
each inbox, and after delivery is confirmed and complete, that inbox name is
obsolete. Nonetheless, a record for that inbox name remains in the server’s ledger.
As such obsolete records accumulate, the ledger size grows. To counteract this
growth, programs can use this function to discard obsolete subject records from
the ledger.
The DELIVERY.COMPLETE advisory is a good opportunity to clear the send state of
an obsolete subject. Another strategy is to review the ledger periodically,
sweeping to detect and remove all obsolete subjects.
Remarks
Do not use this function to clear subjects that are still in use.
As a side-effect, this function resets the sequence numbering for the subject, so the
next message sent on the subject would be number 1. In proper usage, this
side-effect is never detected, since obsolete subjects are truly obsolete.
Parameter Description
cmTransport Remove send state from the ledger of this certified delivery
transport.
tibrvcmTransport_ReviewLedger()
Function
Purpose Query the ledger for stored items related to a subject name.
Remarks The callback function receives one message for each matching subject of
outbound messages stored in the ledger. For example, when FOO.* is the
subject, tibrvcmTransport_ReviewLedger() calls its callback function
separately for each matching subject—once for FOO.BAR, once for FOO.BAZ, and
once for FOO.BOX.
However, if the callback function returns non-NULL, then
tibrvcmTransport_ReviewLedger() returns immediately.
Parameter Description
cmTransport Review the ledger of this transport.
tibrvcmReviewCallback
Function Type
Purpose Programs define functions of this type to process ledger review summary
messages.
Parameter Description
cmTransport This parameter receives the transport.
subject This parameter receives the subject for this ledger item.
Message Fields This callback function receives ledger summary messages with these fields.
(Sheet 1 of 2)
seqno_last_sent The sequence number of the most recent message sent with this
subject name.
This field has datatype TIBRVMSG_U64.
(Sheet 2 of 2)
total_size The total storage (in bytes) occupied by all messages with this
subject name.
If the ledger contains several messages with this subject name,
then this field sums the storage space over all of them.
This field has datatype TIBRVMSG_U64.
listener Each summary message can contain one or more fields named
listener. Each listener field contains a nested submessage with
details about a single registered listener.
This field has datatype TIBRVMSG_MSG.
listener.name Within each listener submessage, the name field contains the
name of the listener transport.
This field has datatype TIBRVMSG_STRING.
tibrvcmTransport_Send()
Function
Remarks This function sends the message, along with its certified delivery protocol
information: the correspondent name of the tibrvcmTransport, a sequence
number, and a time limit. The protocol information remains on the message
within the sending program, and also travels with the message to all receiving
programs.
Programs can explicitly set the message time limit; see
tibrvMsg_SetCMTimeLimit() on page 330. If a time limit is not already set for the
outbound message, this function sets it to the transport’s default time limit (see
tibrvcmTransport_SetDefaultCMTimeLimit() on page 323); if that default is not
set for the transport, the default time limit is zero (no time limit).
Parameter Description
cmTransport Send a message using this certified delivery transport.
tibrvcmTransport_SendReply()
Function
Remarks This convenience call extracts the reply subject of an inbound request message,
and sends a labeled outbound reply message to that subject. In addition to the
convenience, this call is marginally faster than using separate calls to extract the
subject and send the reply.
This function can send a labeled reply to an ordinary message.
This function automatically registers the requesting CM transport, so the reply
message is certified.
Give special attention to the order of the arguments to this method. Reversing the
inbound and outbound messages can cause an infinite loop, in which the program
repeatedly resends the inbound message to itself (and all other recipients).
Parameter Description
cmTransport Send a message using this certified delivery transport.
tibrvcmTransport_SendRequest()
Function
Declaration tibrv_status
tibrvcmTransport_SendRequest(
tibrvcmTransport cmTransport,
tibrvMsg message);
tibrvMsg* reply,
tibrv_f64 timeout);
Parameter Description
cmTransport Send a message using this certified delivery transport.
reply The program supplies a location, and the function stores the
inbound reply in that location.
The program need not create the reply message, nor allocate
space for it. However, the program must destroy the reply
message, even though it did not create it.
timeout Maximum time (in seconds) that this call can block while
waiting for a reply.
TIBRV_WAIT_FOREVER (-1) indicates no timeout (wait without
limit for a reply).
Remarks Programs that receive and process the request message cannot determine that the
sender has blocked until a reply arrives.
The sender and receiver must already have a certified delivery agreement,
otherwise the request is not certified.
tibrvcmTransport_SetDefaultCMTimeLimit()
Function
Purpose Set the default message time limit for all outbound certified messages from a
transport.
Remarks Every labeled message has a time limit, after which the sender no longer certifies
delivery.
Sending programs can explicitly set the time limit on a message (see
tibrvMsg_SetCMTimeLimit() on page 330). If a time limit is not already set for the
outbound message, this function sets it to the transport’s default time limit (set
with this function); if this default is not set for the transport, the default time limit
is zero (no time limit).
Time limits represent the minimum time that certified delivery is in effect.
Parameter Description
cmTransport Set the default message time limit of this transport.
timeLimit Use this time limit (in whole seconds). The time limit must be
non-negative.
tibrvcmTransport_SetPublisherInactivityDiscardInterval()
Function
Declaration tibrv_status
tibrvcmTransport_SetPublisherInactivityDiscardInterval(
tibrvcmTransport cmTransport,
tibrv_i32 timeout);
Purpose Set a time limit after which a listening CM transport can discard state for inactive
CM senders.
Remarks The timeout value limits the time that can elapse during which such a sender does
not send a message. When the elapsed time exceeds this limit, the listening
transport declares the sender inactive, and discards internal state corresponding
to the sender.
We discourage programmers from using this call except to solve a very specific
problem, in which a long-running CM listener program accumulates state for a
large number of obsolete CM senders with non-reusable names.
Before using this call, review every subject for which the CM transport has a
listener; ensure that only CM senders with non-reusable names send to those
subjects. (If senders with reusable names send messages to such subjects, the
listening transport can discard their state, and incorrect behavior can result.)
Parameter Description
cmTransport Set the inactivity discard interval of this transport.
timeout Use this time limit (in whole seconds). The time limit must be
non-negative.
tibrvcmTransport_SyncLedger()
Function
Remarks When this function returns, the transport’s current state is safely stored in the
ledger file.
Transports that use synchronous ledger files need not call this function, since the
current state is automatically written to the file system before returning.
Transports that use process-based ledger storage need not call this function, since
they have no ledger file.
Parameter Description
cmTransport Synchronize the ledger file of this certified delivery transport
object.
Errors The error code TIBRV_INVALID_ARG can indicate that the transport does not have
a ledger file.
tibrvMsg_GetCMSender()
Function
Purpose Extract the correspondent name of the sender from a certified message.
Parameter Description
message Extract the sender name from this message.
name The program supplies a location. The function stores the name in
that location.
Status This function returns a status code that discriminates between labeled messages
and other messages.
• If the message is from a CM sender, then tibrvMsg_GetCMSender() returns
the status code TIBRV_OK and yields a valid CM correspondent name.
• If the message is not from a CM sender, then tibrvMsg_GetCMSender()
returns the status code TIBRV_NOT_FOUND.
tibrvMsg_GetCMSequence()
Function
Parameter Description
message Extract the sequence number from this message.
Status This function returns a status code that discriminates between certified messages
(with a certified delivery agreement) and other messages.
• If the message is from a CM sender, and the CM listener is registered for
certified delivery with that sender, then tibrvMsg_GetCMSequence() returns
the status code TIBRV_OK and yields a valid sequence number.
• If the message is from a CM sender, but the listener is not registered for
certified delivery, then tibrvMsg_GetCMSequence() in the context of a
tibrvcmEventCallback function returns the status code TIBRV_NOT_FOUND.
(In any other context, it returns the actual sequence number stored on the
message.)
Notice that the first labeled message that a program receives on a subject
might not be certified; that is, the sender has not registered a certified delivery
agreement with the listener. If appropriate, the certified delivery library
automatically requests that the sender register the listener for certified
delivery. (See Discovery and Registration for Certified Delivery on page 154 in
TIBCO Rendezvous Concepts.)
A labeled but uncertified message can also result when the sender explicitly
disallows or removes the listener.
• If the message is not from a CM sender, then tibrvMsg_GetCMSequence() (in
any context) returns the status code TIBRV_NOT_FOUND.
Release 5 In release 6 (and later) the sequence number is a 64-bit unsigned integer, while in
Interaction older releases (5 and earlier) it is a 32-bit unsigned integer.
tibrvMsg_GetCMTimeLimit()
Function
Remarks Programs can explicitly set the message time limit (see
tibrvMsg_SetCMTimeLimit() on page 330).
Zero is a special value, indicating no time limit.
If a time limit is not set for a message, this function returns the status code
TIBRV_NOT_FOUND. This situation can occur only for unsent outbound messages,
and for inbound unlabeled messages.
Time limits represent the minimum time that certified delivery is in effect.
This value represents the total time limit of the message, not the time remaining.
Parameter Description
message Extract the time limit from this message.
timeLimit The program supplies a location. The function stores the time
limit in that location.
tibrvMsg_SetCMTimeLimit()
Function
Remarks Every labeled message has a time limit, after which the sender no longer certifies
delivery.
Sending programs can explicitly set the message time limit using this function. If
a time limit is not already set for the outbound message,
tibrvcmTransport_Send() sets it to the transport’s default time limit (see
tibrvcmTransport_SetDefaultCMTimeLimit() on page 323); if that default is not
set for the transport, the default time limit is zero (no time limit).
Time limits represent the minimum time that certified delivery is in effect.
It is meaningless for receiving programs to call this function.
Parameter Description
message Set the time limit of this message.
timeLimit Use this time limit (in whole seconds) for the message. The
time limit must be non-negative.
Programs can use distributed queues for one of n certified delivery to a group of
worker processes.
Topics
tibrvcmTransport_CreateDistributedQueue()
Function
tibrv_status tibrvcmTransport_CreateDistributedQueueEx(
tibrvcmTransport* cmTransport,
tibrvTransport transport,
const char* cmName,
tibrv_u32 workerWeight,
tibrv_u32 workerTasks,
tibrv_u16 schedulerWeight,
tibrv_f64 schedulerHeartbeat,
tibrv_f64 schedulerActivation);
Remarks The new distributed queue transport must employ a valid transport for network
communications.
All members of a distributed queue must listen to exactly the same set of subjects.
See Enforcing Identical Subscriptions on page 186 in TIBCO Rendezvous Concepts.
To destroy a distributed queue transport, call tibrvcmTransport_Destroy().
(Sheet 1 of 4)
Parameter Description
cmTransport The program supplies a location, and the function stores the new
distributed queue transport in that location.
The distributed queue transport remains valid until the program
explicitly destroys it.
transport The new distributed cmTransport employs this transport object for
network communications.
Destroying the distributed cmTransport does not affect this transport.
The program must explicitly call tibrvTransport_Destroy() to
destroy this tibrvTransport when it is no longer needed.
(Sheet 2 of 4)
Parameter Description
cmName Bind this reusable name to the new distributed cmTransport, so the
distributed queue transport becomes a member of the distributed queue
with this name.
The name must be non-NULL, and conform to the syntax rules for
Rendezvous subject names. It cannot begin with reserved tokens. It
cannot be a non-reusable name generated by a call to
tibrvcmTransport_Create(). It cannot be the empty string.
workerWeight When the scheduler receives a task, it assigns the task to the available
worker with the greatest worker weight.
A worker is considered available unless either of these conditions are
true:
• The pending tasks assigned to the worker member exceed its task
capacity.
• The worker is also the scheduler. (The scheduler assigns tasks to its
own worker role only when no other workers are available.)
Programs can set this parameter using the extended function. The brief
form supplies the default value, TIBRVCM_DEFAULT_WORKER_WEIGHT (1).
(Sheet 3 of 4)
Parameter Description
workerTasks Task capacity is the maximum number of tasks that a worker can accept.
When the number of accepted tasks reaches this maximum, the worker
cannot accept additional tasks until it completes one or more of them.
When the scheduler receives a task, it assigns the task to the worker with
the greatest worker weight—unless the pending tasks assigned to that
worker exceed its task capacity. When the preferred worker has too
many tasks, the scheduler assigns the new inbound task to the worker
with the next greatest worker weight.
Programs can set this parameter using the extended function. The value
must be a non-negative integer. The brief form supplies the default
value, TIBRVCM_DEFAULT_WORKER_TASKS (1).
Zero is a special value, indicating that this distributed queue member is a
dedicated scheduler (that is, it never accepts tasks).
schedulerWeight Weight represents the ability of this member to fulfill the role of
scheduler, relative to other members with the same name. Cooperating
distributed queue transports use relative scheduler weight values to
elect one transport as the scheduler; members with higher scheduler
weight take precedence.
Programs can set this parameter using the extended function. Acceptable
values range from 0 to 65535. Zero is a special value, indicating that the
member can never be the scheduler. The brief form supplies the default
value, TIBRVCM_DEFAULT_SCHEDULER_WEIGHT (1).
For more information, see Rank and Weight on page 206 in TIBCO
Rendezvous Concepts.
(Sheet 4 of 4)
Parameter Description
schedulerHeartbeat The scheduler sends heartbeat messages at this interval (in seconds).
All members with the same name must specify the same value for this
parameter. The value must be strictly positive. To determine the correct
value, see Step 4: Choose the Intervals on page 237 in TIBCO Rendezvous
Concepts.
Programs can set this parameter using the extended function. The brief
form supplies the default value, TIBRVCM_DEFAULT_SCHEDULER_HB
(1.0).
schedulerActivation When the heartbeat signal from the scheduler has been silent for this
interval (in seconds), the member with the greatest scheduler weight
takes its place as the new scheduler.
All members with the same name must specify the same value for this
parameter. The value must be strictly positive. To determine the correct
value, see Step 4: Choose the Intervals on page 237 in TIBCO Rendezvous
Concepts.
Programs can set this parameter using the extended function. The brief
form supplies the default value, TIBRVCM_DEFAULT_SCHEDULER_ACTIVE
(3.5).
Constant Value
TIBRVCM_DEFAULT_COMPLETE_TIME 0
TIBRVCM_DEFAULT_WORKER_WEIGHT 1
TIBRVCM_DEFAULT_WORKER_TASKS 1
TIBRVCM_DEFAULT_SCHEDULER_WEIGHT 1
TIBRVCM_DEFAULT_SCHEDULER_HB 1.0
TIBRVCM_DEFAULT_SCHEDULER_ACTIVE 3.5
Scheduler recovery and task rescheduling are available only when the task
message is a certified message (that is, a certified delivery agreement is in effect
between the task sender and the distributed queue transport scheduler).
Disabled Functions
tibrvcmTransport_AddListener()
tibrvcmTransport_AllowListener()
tibrvcmTransport_ConnectToRelayAgent()
tibrvcmTransport_DisallowListener()
tibrvcmTransport_DisconnectFromRelayAgent()
tibrvcmTransport_GetDefaultCMTimeLimit()
tibrvcmTransport_GetLedgerName()
tibrvcmTransport_GetRelayAgent()
tibrvcmTransport_GetRequestOld()
tibrvcmTransport_GetSyncLedger()
tibrvcmTransport_RemoveListener()
tibrvcmTransport_RemoveSendState()
tibrvcmTransport_ReviewLedger()
tibrvcmTransport_Send()
tibrvcmTransport_SendReply()
tibrvcmTransport_SendRequest()
tibrvcmTransport_SetDefaultCMTimeLimit()
tibrvcmTransport_SyncLedger()
tibrvcmTransport_GetCompleteTime()
Function
Purpose Extract the worker complete time limit of a distributed queue transport.
Remarks The complete time parameter of the scheduler affects the reassignment of tasks.
Parameter Description
cmTransport Get the complete time of this distributed queue transport.
completeTime The program supplies a location, and the function stores the
worker complete time in that location.
tibrvcmTransport_GetUnassignedMessageCount()
Function
Purpose Extract the number of unassigned task messages from a distributed queue
transport.
Remarks An unassigned task message is a message received by the scheduler, but not yet
assigned to any worker in the distributed queue.
This call produces a valid count only within a scheduler process. Within a worker
process, this call always produces zero.
Parameter Description
cmTransport Extract the number of unassigned task messages from this
distributed queue transport.
msgCount The program supplies a location, and the function stores the
unassigned task count in that location.
tibrvcmTransport_GetWorkerWeight()
Function
Parameter Description
cmTransport Get the worker weight of this distributed queue transport.
workerWeight The program supplies a location, and the function stores the
worker weight in that location.
tibrvcmTransport_GetWorkerTasks()
Function
Parameter Description
cmTransport Get the task capacity of this distributed queue transport.
workerTasks The program supplies a location, and the function stores the
task capacity in that location.
tibrvcmTransport_SetCompleteTime()
Function
Purpose Set the worker complete time limit of a distributed queue transport.
Remarks The complete time parameter of the scheduler affects the reassignment of tasks:
If the complete time is non-zero, the scheduler waits for a worker member to
complete an assigned task. If the complete time elapses before the scheduler
receives completion from the worker member, the scheduler reassigns the task to
another worker member.
Zero is a special value, which specifies no limit on the completion time—that is,
the scheduler does not set a timer, and does not reassign tasks when task
completion is lacking. All members implicitly begin with a default complete time
value of zero; programs can change this parameter using this function.
Parameter Description
cmTransport Set the complete time of this distributed queue transport.
completeTime Use this complete time (in seconds). The time must be
non-negative.
tibrvcmTransport_SetTaskBacklogLimit...()
Function
tibrv_status tibrvcmTransport_SetTaskBacklogLimitInMessages(
tibrvcmTransport cmTransport,
tibrv_u32 limitByMessages);
Purpose Set the scheduler task queue limits of a distributed queue transport.
Remarks The scheduler stores tasks in a queue. These properties limit the maximum size of
that queue—by number of bytes or number of messages (or both). When no value
is set for either these properties, the default is no limit.
When the task messages in the queue exceed either of the two limits, Rendezvous
software deletes new inbound task messages.
Programs may call each of these functions at most once. Those calls must occur
before the transport assumes the scheduler role; after a transport acts as a
scheduler, the values are fixed, and subsequent attempts to change them result in
status code TIBRV_NOT_PERMITTED.
Parameter Description
cmTransport Set the size limit of the task queue of this distributed
queue transport.
tibrvcmTransport_SetWorkerWeight()
Function
Remarks Relative worker weights assist the scheduler in assigning tasks. When the
scheduler receives a task, it assigns the task to the available worker with the
greatest worker weight.
The default worker weight is 1; programs can set this parameter at creation using
tibrvcmTransport_CreateDistributedQueue(), or change it dynamically
using this function.
Parameter Description
cmTransport Set the worker weight of this distributed queue transport.
tibrvcmTransport_SetWorkerTasks()
Function
Remarks Task capacity is the maximum number of tasks that a worker can accept. When
the number of accepted tasks reaches this maximum, the worker cannot accept
additional tasks until it completes one or more of them.
When the scheduler receives a task, it assigns the task to the worker with the
greatest worker weight—unless the pending tasks assigned to that worker exceed
its task capacity. When the preferred worker has too many tasks, the scheduler
assigns the new inbound task to the worker with the next greatest worker weight.
The default worker task capacity is 1.
Zero is a special value, indicating that this distributed queue member is a
dedicated scheduler (that is, it never accepts tasks).
Parameter Description
cmTransport Set the task capacity of this distributed queue transport.
Chapter 13 Datatypes
Topics
See Also
Appendix A, Custom Datatypes, on page 361
(Sheet 1 of 2)
Scalar Types
(Sheet 2 of 2)
Array Types
Custom Types
C Datatypes
(Sheet 1 of 2)
(Sheet 2 of 2)
Datatype Conversion
General Rules
These general rules govern most conversions.
Supported
• All wire format types decode to the homologous C datatypes (in get calls), and
all C datatypes encode to the homologous wire format types (in add and update
calls).
• All wire format numeric scalar types convert to all C numeric scalar types.
• All wire format numeric array types convert to all C numeric array types.
Caution
• Converting a wire format opaque or XML byte sequence to a C character
string creates a printable string, but the string does not capture any of the data
bytes (it captures only the number of bytes).
• Converting a wire format signed integer to a C unsigned integer discards the
sign.
• Converting a wire format numeric type to a C numeric type with fewer bits
risks loss of precision.
• Converting wire format floating point numbers to C integer types discards the
fractional part.
Not Supported
• Array types do not convert to scalar types.
• Scalar types do not convert to array types.
• C types do not convert to non-homologous wire format types (when adding
or updating a field).
Converting to Boolean
• When converting a string to a boolean, all strings in which the first character is
either t or T map to boolean true. All other strings map to boolean false.
• When converting a numeric value to a boolean, zero maps to boolean false.
All non-zero numeric values map to boolean true.
Get
tibrvMsgDateTime
tibrv_ipaddr32
tibrv_ipport16
tibrv_u16[]
tibrv_u32[]
tibrv_u64[]
tibrv_f32[]
tibrv_f64[]
tibrv_i16[]
tibrv_i32[]
tibrv_i64[]
tibrvMsg[]
tibrv_bool
tibrv_u16
tibrv_u32
tibrv_u64
tibrv_u8[]
tibrv_f32
tibrv_f64
tibrvMsg
tibrv_i16
tibrv_i32
tibrv_i64
tibrv_i8[]
tibrv_u8
tibrv_i8
char*[]
char*
void*
TIBRVMSG_BOOL S S S S S S S S S S S
TIBRVMSG_F32 S N N N N N N N N N S
TIBRVMSG_F64 S N N N N N N N N N S
TIBRVMSG_I8 S N N N N N N N N N S
TIBRVMSG_I16 S N N N N N N N N N S
TIBRVMSG_I32 S N N N N N N N N N S
TIBRVMSG_I64 S N N N N N N N N N S
TIBRVMSG_U8 S N N N N N N N N N S
TIBRVMSG_U16 S N N N N N N N N N S
TIBRVMSG_U32 S N N N N N N N N N S
TIBRVMSG_U64 S N N N N N N N N N S
tibrvMsg Source Type
TIBRVMSG_IPADDR32 N S
TIBRVMSG_IPPORT16 N N N S
TIBRVMSG_DATETIME C
TIBRVMSG_F32ARRAY N N N N N N N N N S
TIBRVMSG_F64ARRAY N N N N N N N N N S
TIBRVMSG_I8ARRAY N N N N N N N N N S
TIBRVMSG_I16ARRAY N N N N N N N N N S
TIBRVMSG_I32ARRAY N N N N N N N N N S
TIBRVMSG_I64ARRAY N N N N N N N N N S
TIBRVMSG_U8ARRAY N N N N N N N N N S
TIBRVMSG_U16ARRAY N N N N N N N N N S
TIBRVMSG_U32ARRAY N N N N N N N N N S
TIBRVMSG_U64ARRAY N N N N N N N N N S
TIBRVMSG_MSG S
TIBRVMSG_OPAQUE C
TIBRVMSG_STRING P P P P P P P P P P P P P
TIBRVMSG_XML C
TIBRVMSG_MSGARRAY
TIBRVMSG_STRINGARRAY
Key
Homologous types; conversion always supported; no loss of information
S Supported conversion; always supported
N Numeric conversion; loss of information is possible (without warning)
P Parsed conversion; supported only when sensible and syntactically correct
C Caution; supported, but results sometimes can be misleading
Unsupported conversion
Chapter 14 Status
Most Rendezvous functions return a status code, indicating either normal return
status or a range of error conditions.
Programs must check the status after every Rendezvous function call, and take
appropriate action.
Topics
tibrv_status
Type
(Sheet 1 of 4)
Constant Description
TIBRV_OK The function returned without error.
(Sheet 2 of 4)
Constant Description
TIBRV_SUBJECT_COLLISION It is illegal to create two certified listener events on the same
CM transport with overlapping subjects.
TIBRV_INVALID_NAME The field name is too long; see Field Name Length on page 57.
TIBRV_INVALID_SIZE The explicit size in the field does not match its explicit type.
TIBRV_INVALID_COUNT The explicit field count does not match its explicit type.
TIBRV_NOT_FOUND The function could not find the specified field in the message.
TIBRV_ID_IN_USE Cannot add this field because its identifier is already present
in the message; identifiers must be unique.
TIBRV_CONVERSION_FAILED The function found the specified field, but could not convert it
to the desired datatype.
(Sheet 3 of 4)
Constant Description
TIBRV_INVALID_MSG The function received a message argument that is not a
well-formed message; for example, NULL.
TIBRV_INVALID_INSTANCE The program supplied zero as the field instance number (the
first instance is number 1).
TIBRV_INVALID_DISPATCHABLE The function received an event queue or queue group that has
been destroyed, or is otherwise unusable.
TIBRV_INVALID_QUEUE_GROUP The function received a queue group that has been destroyed,
or is otherwise unusable.
TIBRV_INVALID_IO_SOURCE The function received an invalid I/O source (for this operating
system).
(Sheet 4 of 4)
Constant Description
TIBRV_INVALID_IO_CONDITION The function received an invalid I/O condition (for this
operating system).
TIBRV_NOT_FILE_OWNER The program cannot open the specified file because another
program owns it.
For example, ledger files are associated with correspondent
names.
TIBRV_IPM_ONLY The call is not available because IPM is not operating (that is,
the call is available only when IPM is operating).
tibrvStatus_GetText()
Function
Parameter Description
status Return the string for this status code.
Topics
Storage Type
Utility Functions
tibrvMsgData_ByteSize() Calculate the wire buffer size of data from its C size. 372
tibrvMsgData_CopyBytes() Copy data into the wire buffer of a message for an encoder. 375
tibrvMsgData_GetBytes() Get data pointer and size from a wire buffer for a decoder. 380
tibrvMsgData_GetSize() Get the data size from a wire buffer for a decoder. 382
tibrvMsgData_SetSize() Write the size of data into a wire buffer for an encoder. 385
tibrvMsgData_ByteSize() Calculate the wire buffer size of data from its C size. 372
tibrvMsgData_CopyBytes() Copy data into the wire buffer of a message for an encoder. 375
tibrvMsgData_GetBytes() Get data pointer and size from a wire buffer for a decoder. 380
tibrvMsgData_GetSize() Get the data size from a wire buffer for a decoder. 382
tibrvMsgData_SetSize() Write the size of data into a wire buffer for an encoder. 385
Architecture Overview
Table 11 explains the stratification of data, field and message operations into four
layers.
Layer Description
4. Convenience Functions Type-specific functions manipulate message field data. This
layer contains three functions per datatype—add, get and
update. For example, see Add String on page 64. All
convenience functions call the corresponding generic functions
of layer 3 for their main functionality.
When defining a custom datatype, a program can implement
these three functions (optional).
3. Generic Field Functions Field functions add, get or update a message field. This layer
consists of only three functions: tibrvMsg_AddField(),
tibrvMsg_GetField(), tibrvMsg_UpdateField(). Field
functions call the datatype handler functions of layer 2
whenever data enters or leaves a message.
2. Datatype Handler Functions Type-specific handler functions translate data between C format
and Rendezvous wire format, and convert it to other datatypes.
This layer contains three functions per datatype:
• encoder, of type tibrvMsgData_Encoder
• decoder, of type tibrvMsgData_Decoder
• converter, of type tibrvMsgData_Converter
At the top of the table, programs call functions in layer 4 (and sometimes layer 3)
to move data in and out of messages. The remaining lower layers are generally
invisible to most programs. That is, most programs do not call functions below
layers 3.
However, a program that defines custom datatypes must implement the three
functions in layer 2. Nevertheless, the program never calls layer 2 functions
directly. Instead the program can define optional convenience functions at layer 4,
and call them to move the custom datatype in and out of messages.
Adding Data
This narrative illustrates the interaction of functions at all four layers as they
cooperate to add data to a message. The narrative for updating data within a
message is parallel.
A program begins by calling a layer 4 convenience function to add data. The
convenience function creates a field object (tibrvMsgField) that contains the
data, the field name and identifier, a datatype token, and the element count (for
arrays only). Then the convenience function calls the layer 3 field function
tibrvMsg_AddField() to add that field to the message.
Among its other tasks, tibrvMsg_AddField() must write the field into wire
buffer storage within the message object; to accomplish this step, it calls the layer
2 encoder function specific to the datatype.
The encoder transforms the data into its wire format, using layer 1 utility
functions to copy that data into the message’s wire buffer.
Each write operation updates the message’s wire buffer pointer to the location
where the next write will begin.
Extracting Data
This narrative illustrates the interaction of functions at all four layers as they
cooperate to get data from a message.
Convenience Functions
When defining custom datatypes, programs have the option to also define
convenience functions for the new type. In general, layer 4 convenience functions
rely on layer 3 generic field functions to do most of their work, packing or
unpacking the field structure as appropriate. You can choose to implement up to
three convenience functions:
• Get a value of the custom datatype from a message.
• Add a value of the custom datatype to a message.
• Update an existing field in a message with a new value of the custom datatype.
Get
The get function must fulfill these responsibilities:
• Call tibrvMsg_GetField() to find the field in the message.
• Check that tibrvMsg_GetField() did not return an error code.
• Check that the type of the field matches the target datatype of the
convenience function.
— If the conversion is illegal, return an error code.
— If it matches, then return, passing back the data directly.
— Otherwise, convert the data to the target datatype. Pass back the converted
data. (In most cases, converter functions associated with the actual
datatype are unable to convert it to a custom type, so either the convenience
function must convert it, or declare the conversion illegal.)
tibrvMsg_SetHandlers()
Function
Remarks Programs that define custom data handler functions must register them before
any message operations involving the custom datatype.
The program’s data handler functions must properly address byte order and
endian issues.
Parameter Description
type Use this number as a unique identifier for the new datatype.
The type identifier must be in the range
[TIBRVMSG_USER_FIRST, TIBRVMSG_USER_LAST]; all
other identifiers are reserved.
tibrvMsgDataType
Type
Remarks This enumeration specifies the four low-level types of data reference that can be
extracted from a message field. Decoders and converters create references to the
data that they extract, and must inform the message of the type each time they
create a reference. Internal functions use this type information to properly
maintain references to the extracted data.
Value Description
tibrvMsgData_Primitive Extract primitive types by copying the data into the destination
field struct.
The predefined set of primitive types is tibrv_bool, tibrv_f32,
tibrv_f64, tibrv_i8, tibrv_i16, tibrv_i32, tibrv_i64, tibrv_u8,
tibrv_u16, tibrv_u32, tibrv_u64, tibrv_ipaddr32, tibrv_ipport16,
tibrvMsgDateTime.
tibrvMsgData_SubMessage Extract this type by creating a new tibrvMsg object for the
decoded data.
The only submessage type is tibrvMsg.
tibrvMsgData_WireReference Extract this type by copying a pointer into the destination field
struct; the pointer refers to a location within the wire buffer of
the message.
The predefined set of wire reference types includes character
strings, opaque byte sequences, and XML data.
tibrvMsgData_ByteSize()
Function
Purpose Calculate the wire buffer size of data from its C size.
Remarks Encoders call this layer 1 function to preview the wire size of the data as
tibrvMsgData_CopyBytes() would write it into the message (that is, including
extra bytes for size information). Encoders test this wire size against the available
space in the message.
Parameter Description
content_size The encoder supplies the C size (in bytes) of data.
tibrvMsgData_Converter
Function Type
Remarks Programs define converters for custom datatypes. Layer 2 converter functions
augment the Wire Format to C Datatype Conversion Matrix on page 354.
Each converter function receives a message field, and replaces information within
it.
Each converter must fulfill these responsibilities:
• For disallowed conversions, return the status code
TIBRV_CONVERSION_FAILED.
• Convert the field’s data to the destination_type, and store the new data
back into the field.
• Set the field’s size part to reflect the new size of the converted data.
• Set the field’s count part to reflect the new element count of the converted
data.
• Set the field’s type part to reflect the destination_type.
• Store the low-level type of the new reference in *converted_type.
Parameter Description
field This parameter receives the location of a message
field. The converter function modifies that field to
effect the conversion.
Parameter Description
destination_type This parameter receives the type identifier
representing the datatype of the resulting field. This
parameter instructs the converter function to convert
the field to this datatype.
The parameter can be any of the predefined
datatypes listed in Wire Format Datatypes on
page 348, as well as any custom datatypes that the
program defines.
tibrvMsgData_CopyBytes()
Function
Purpose Copy data into the wire buffer of a message for an encoder.
Remarks This layer 1 function does these steps (see Figure 16 on page 376):
1. Compute the wire size of the data from the size parameter.
2. Write the wire size into the wire buffer, and advance *buffer. (Now *buffer
points to the end of the size information, which will be the start of the data.)
3. Copy size bytes from src into the wire buffer, and advance *buffer again.
Now *buffer points to the end of the copied data.
4. Return.
Parameter Description
buffer The encoder supplies the location of an address within the wire
buffer of a destination message. This function copies the source
data into the destination message, starting at that address.
Before returning, this function advances *buffer to the end of
the data that it copied.
Figure 16 tibrvMsgData_CopyBytes
Before
*buffer
src F o r e s t 0
size 7
After
*buffer
src F o r e s t 0
size 7
7 F o r e s t 0
tibrvMsgData_Decoder
Function Type
Remarks Programs define decoders for custom datatypes. Layer 2 decoder functions
augment the Wire Format to C Datatype Conversion Matrix on page 354.
Each decoder must fulfill these responsibilities:
• Set the size, count and data parts of the destination field struct. (The layer 3
function sets the name, id and type.)
• Advance *wire_buffer to the end the source data (in the message).
tibrvMsgData_GetBytes() automatically advances this buffer pointer.
Parameter Description
wire_buffer This parameter receives the location of an address within the
wire buffer of the source message. The source data starts at
that address.
tibrvMsgData_Encoder
Function Type
Remarks Programs define encoders for custom datatypes. Layer 2 encoder functions
translate custom datatypes into Rendezvous wire format.
Each encoder must fulfill these responsibilities:
• Check that the field contains valid data of the appropriate type.
• Check that the data will fit in the available space; if not, return the error status
TIBRV_NO_MEMORY.
Parameter Description
wire_buffer This parameter receives the location of an address within
the wire buffer of the destination message. The encoder
must write the wire-format encoded data to this
destination.
We strongly recommend using
tibrvMsgData_CopyBytes() to transfer the data.
Parameter Description
field This parameter receives a field object, with self-describing
data in local format. This source field determines the data
to place into the destination wire_buffer.
available space
tibrvMsgData_GetBytes()
Function
Purpose Get data pointer and size from a wire buffer for a decoder.
Remarks This layer 1 function helps decoders extract data from a message’s wire buffer. It
does these steps (see Figure 18 on page 381):
1. Read the size information from the wire buffer (starting at the position
*buffer) and store it in the size parameter.
2. Store the start position of the actual data in the src parameter.
3. Advance *buffer to point to the end of the actual data.
4. Return.
After tibrvMsgData_GetBytes() returns, the decoder can obtain the data by
copying *size bytes from the location *src.
Parameter Description
buffer The decoder supplies the location of an address within the wire
buffer of a source message. After reading the size information,
this function advances *buffer to point to the location at the
end of the data.
size The decoder supplies a location. This function stores the size of
the actual data in that location.
Figure 18 tibrvMsgData_GetBytes
Before
*buffer
*src
size
7 F o r e s t 0
After
*buffer
*src
size 7
7 F o r e s t 0
tibrvMsgData_GetSize()
Function
Purpose Get the data size from a wire buffer for a decoder.
Remarks This layer 1 function helps decoders extract data from a message’s wire buffer. It
does only part of the work that tibrvMsgData_GetBytes() does (see Figure 19
on page 383):
1. Read the size information from the wire buffer (starting at the position
*buffer) and store it in the size parameter.
2. Advance *buffer to point to the end of the size information, which is the start
of the actual data.
3. Return.
After tibrvMsgData_GetSize() returns, the decoder can obtain the data by
copying *size bytes from the location *buffer. We recommend using the more
complete function tibrvMsgData_GetBytes(); this function gives programmers
finer control over pointer advancement (along with the responsibility to advance
that pointer appropriately).
Parameter Description
buffer The decoder supplies the address of the wire buffer within the
message. The function advances *buffer to point to the location
at the end of the size (which is the beginning of the data).
size The decoder supplies a location. This function stores the size of
the actual data in that location.
Figure 19 tibrvMsgData_GetSize
Before
*buffer
size
7 F o r e s t 0
After
*buffer
size 7
7 F o r e s t 0
tibrvMsgData_Malloc()
Function
Remarks Decoders and converters must use this layer 1 function to allocate storage for
extracted data. Do not use ordinary malloc.
The function returns a pointer to the storage. The storage remains associated with
the message, and persists until the message is destroyed. Programmers need not
free this storage; instead, the message automatically frees the storage at the
appropriate time.
Decoders and converters that allocate storage using this function must pass back
the type tibrvMsgData_MallocBlock.
Parameter Description
size Allocate a storage block of this size (in bytes).
tibrvMsgData_SetSize()
Function
Purpose Write the size of data into a wire buffer for an encoder.
Remarks This layer 1 function helps encoders write size information to a message’s wire
buffer. It does only part of the work that tibrvMsgData_CopyBytes() does (see
Figure 20 on page 386):
1. Write the size information into the wire buffer, starting at the position
*buffer.
2. Advance *buffer to point to the end of the size information, which will
become the start of the actual data.
3. Return.
Parameter Description
buffer The encoder supplies the address of a location within the
message’s wire buffer. This function writes the size into the
destination message, and advances this buffer pointer.
Figure 20 tibrvMsgData_SetSize
Before
*buffer
After
*buffer
Perl programs can directly call Rendezvous API functions using a Perl 5 loadable
module called Tibrv, which extends the Perl language.
To simplify Perl prototyping of Rendezvous applications in C, Rv presents Perl
programs with an interface that is identical to the C Rendezvous API.
Topics
Tibrv presents the C API. All API details (for example, function names,
parameter lists, types, return codes) are the same as for C programs, so Perl
programmers can use it to:
• Prototype Rendezvous applications in Perl for later translation into C.
• Write Rendezvous applications in Perl for short-term use.
System administrators often choose Perl for data organization tasks. Combining
Perl with Rendezvous software yields a powerful tool for:
• Gathering and organizing information about the operation of distributed
systems.
• Administering physically distant computers across a network.
Be sure that the library path variable is set properly; for instructions, see the
README file.
Place this module reference near the top of each Perl program file that calls
Rendezvous API functions:
use Tibrv;
If the program uses Rendezvous fault tolerance features, add this module
reference:
use TibrvFt;
Index
E
EBCDIC 21
embedded license 213
encoder 378
encoding 49
error codes 356
M mark 106
remove field 108
malloc message storage for custom datatype 384 remove field instance 110
mark references 106 reply subject
maximum events, queue 177, 183 get 104
member, fault tolerance 244 set 112
callback function 245 reset 111
create 249 send subject
destroy 252 set 113
group name 254 send subject, get 105
queue 255 size 78
transport 256 type definition 52
weight 257 update field 114
set 258 array 119
message datetime 125
add field 56 nested message 121
array 61 opaque bytes 123
datetime 67 scalar 117
nested message 63 string 122
opaque bytes 65 XML 124
scalar 59 message field, type definition 55
string 64 monitor, fault tolerance 259
XML 66 callback 260
copy 71 create 263
create 70 destroy 265
create from data bytes 72 group name 266
destroy 73 queue 267
detach 74 transport 268
expand 75
format as string 69
get data as a byte sequence 77
get data as a byte string 76 N
get field 82
array 88 name
datetime 98 certified delivery, get sender from message 326
nested message 90 dispatcher thread 205, 206
opaque bytes 94 get from certified delivery transport 308
scalar 86 of a certified delivery transport 300
string 92 of a queue 178, 185
XML 96 name, of a field 55
get field by index 100 nested message, add field to message 63
get field instance 101 network 219
ownership and control 40 new. See, create.
references number of fields in a message 103
clear 68
O queue group
add 191
open, environment 19 create 192
overflow, queue 170, 177, 183 destroy 193
ownership, message storage 40 dispatch 194
poll 195
remove 196
timed dispatch 197
P type 190
queue, default 168
PEM 27
PKCS #12 28
policy
queue limit 170, 177, 183 R
poll
queue 180 raw storage device, as ledger file 300
queue group 195 reallocate 75
prepare-to-activate, fault tolerance 243 references
priority, queue 179, 186 clear 68
process transport 209 mark 106
programming environment 2 register custom datatype 369
relay agent
connect to 296
disconnect from 304
Q get from certified delivery transport 309
release 5, interaction
queue CM sequence numbers
count 175 several fields with same name
create 172 reliability, request 221
destroy 173 remove
destroy complete, callback function 171 event queue from a queue group 196
discard 177, 183 event queue hook function 181
dispatch 174 field from message 108, 108
fault tolerance member 255 field instance from message 110
fault tolerance monitor 267 listener, certified delivery 313
get from event 159 send state, certified delivery 315
certified delivery 290 reply subject
hook 169 get 104
limit policy 170, 177, 183 set 112
maximum events 177, 183 reply, send 225
name 178, 185 certified delivery 320
poll 180 request old messages, get from certified delivery
priority 179, 186 transport 310
timed dispatch 187 request reliability 221
type 168
T tibrvcmTransport_GetWorkerTasks() 342
tibrvcmTransport_GetWorkerWeight() 341
task capacity tibrvcmTransport_RemoveListener() 313
get 342 tibrvcmTransport_RemoveSendState() 315
set 346 tibrvcmTransport_ReviewLedger() 316
technical support xxvi tibrvcmTransport_Send() 319
thread, create dispatcher 202 tibrvcmTransport_SendReply() 320
TIBCO_HOME xxiii tibrvcmTransport_SendRequest() 321
tibrv_Close() 17 tibrvcmTransport_SetCompleteTime() 343
TIBRV_DEFAULT_QUEUE 168 tibrvcmTransport_SetDefaultCMTimeLimit() 323
tibrv_IsIPM() 18 tibrvcmTransport_SetPublisherInactivityDiscardInter
tibrv_Open() 19 val() 324
tibrv_SetCodePages() 21 tibrvcmTransport_SetTaskBacklogLimitInBytes() 344
tibrv_status (type) 356 tibrvcmTransport_SetTaskBacklogLimitInMessages()
tibrv_Version() 24, 243, 243 344
tibrvcm_Version() 279 tibrvcmTransport_SetWorkerTasks() 346
tibrvcmEvent (type) 280 tibrvcmTransport_SetWorkerWeight() 345
tibrvcmEvent_ConfirmMsg() 283 tibrvcmTransport_SyncLedger() 325
tibrvcmEvent_CreateListener() 284 tibrvcmTransportOnComplete (function type) 293
tibrvcmEvent_Destroy 286 tibrvDispatchable (type) 200
tibrvcmEvent_GetListenerTransport() 288, 289 tibrvDispatcher (type) 201
tibrvcmEvent_GetQueue() 290 tibrvDispatcher_Create() 202
tibrvcmEvent_SetExplicitConfirm() 291 tibrvDispatcher_Destroy() 204
tibrvcmEventCallback (type) 281 tibrvDispatcher_GetName() 205
tibrvcmReviewCallback 317 tibrvDispatcher_SetName() 206
tibrvcmTransport (type) 292 tibrvEvent (type) 132
tibrvcmTransport_AddListener() 294 tibrvEvent_CreateIO() 138
tibrvcmTransport_AllowListener() 295 tibrvEvent_CreateListener() 140
tibrvcmTransport_ConnectToRelayAgent() 296 tibrvEvent_CreateTimer() 143
tibrvcmTransport_Create() 298 tibrvEvent_CreateVectorListener() 146
tibrvcmTransport_CreateDistributedQueue() 334 tibrvEvent_Destroy() 151
tibrvcmTransport_Destroy() 302 tibrvEvent_DestroyEx() 152
tibrvcmTransport_DisallowListener() 303 tibrvEvent_GetIOSource() 153
tibrvcmTransport_DisconnectFromRelayAgent 304 tibrvEvent_GetIOType() 154
tibrvcmTransport_ExpireMessages() 305 tibrvEvent_GetListenerSubject() 155
tibrvcmTransport_GetCompleteTime() 339 tibrvEvent_GetListenerTransport() 156
tibrvcmTransport_GetDefaultCMTimeLimit() 306 tibrvEvent_GetQueue() 159
tibrvcmTransport_GetLedgerName() 307 tibrvEvent_GetTimerInterval() 157
tibrvcmTransport_GetName() 308 tibrvEvent_GetType() 158
tibrvcmTransport_GetRelayAgent() 309 tibrvEvent_ResetTimerInterval() 160
tibrvcmTransport_GetRequestOld() 310 tibrvEventCallback (type) 133
tibrvcmTransport_GetSyncLedger() 311 tibrvEventOnComplete (type) 134
tibrvcmTransport_GetTransport() 312 tibrvEventType 161
tibrvcmTransport_GetUnassignedMessageCount() 34 tibrvEventVectorCallback (type) 137
0 TIBRVFT_ACTIVATE 243
U
unassigned tasks 340
update
extended functions 116
message field 114
array 119
datetime 125
nested message 121
opaque bytes 123
scalar 117
string 122
XML 124
user datatypes 361
user name and password, set 29
V
validity, data 41
vector listener, create 146
version 24, 242, 243, 243, 279
virtual circuit, wait for connection 237