Initialize the dispatch interface

Updated: April 19, 2023
/* initialize dispatch interface */
dpp = dispatch_create_channel(-1, DISPATCH_FLAG_NOLOCK);
if(dpp == NULL) {
   fprintf(stderr, "%s: Unable to allocate dispatch handle.\n",
           argv[0]);
   return EXIT_FAILURE;
}

We need to set up a mechanism so that clients can send messages to the resource manager. This is done via dispatch_create_channel(), which creates and returns the dispatch structure. You can pass it the ID of an existing channel to use, or -1 if you want it to create a channel for you. (There's also a dispatch_create() function that's equivalent to calling dispatch_create_channel() with a channel ID of -1 and no flags.) The channel ID is stored in the dispatch structure.

The DISPATCH_FLAG_NOLOCK flag says that the mapping of message types to handlers is static after initialization, so the lookup can omit locking to be more efficient; for more information, see dispatch_create_channel() in the C Library Reference. Most resource managers can use this flag.

Note: In order to register a prefix in the pathname space, a resource manager must have the PROCMGR_AID_PATHSPACE ability enabled. In order to create a public channel (i.e., without _NTO_CHF_PRIVATE set), your process must have the PROCMGR_AID_PUBLIC_CHANNEL ability enabled. For more information, see procmgr_ability().

The dispatch structure (of type dispatch_t) is opaque; you can't access its contents directly. Use message_connect() to create a connection using this hidden channel ID.

Alternatively, you can initialize a resource manager using a channel with a pulse pool. For example:

/* create a channel with a pulse pool */
const int channel_id = ChannelCreatePulsePool(flags, &config);
if(channel_id == -1) {
   fprintf(stderr, "Unable to allocate channel\n");
   exit(EXIT_FAILURE);
}

/*pass in the channel ID */
dispatch_t* const dpp = dispatch_create_channel(channel_id, DISPATCH_FLAG_NOLOCK);
if(dpp == NULL) {
   fprintf(stderr, "Unable to allocate dispatch handle.\n");
   exit(EXIT_FAILURE);
}