Example 5: Using time as the trigger

In this example, you use time to trigger the copying by the receiver. Here, a timer is set for a certain period of time (for example, 2 seconds). After the timer expires, the receiver gets the notification and starts copying the messages.

#include <stdio.h>
#include <process.h>
#include <unistd.h>
#include <string.h>
#include <sys/asyncmsg.h>

int callback(int err, void *cmsg, unsigned handle)
{
    printf("Callback: err = %d, msg = %p, handle = %d\n", 
           err, cmsg, handle);
    return 0;
}

/*
 * Set the get trigger to 2 seconds, put up 4 messages, see we could get a
 * notification for get after 2 seconds.
 */
int main()
{
    int chid, coid, pchid, i;
    struct sigevent gev;
    struct _pulse pulse;
    struct _asyncmsg_connection_attr aca;
    struct _asyncmsg_get_header *agh, *agh1;
    char msg[4][80];

    /* prepare the event */
    if ((pchid = ChannelCreate(0)) == -1) 
    {
        perror("ChannelCreate");
        return -1;
    }

    if ((gev.sigev_coid = ConnectAttach(0, 0, 
         pchid, _NTO_SIDE_CHANNEL, 0)) == -1)
    {
        perror("ConnectAttach");
        return -1;
    }
        gev.sigev_notify = SIGEV_PULSE;
        gev.sigev_priority = SIGEV_PULSE_PRIO_INHERIT;

        /* async channel */
        if ((chid = asyncmsg_channel_create(_NTO_CHF_SENDER_LEN, 0666, 2048,
                                            5, &gev, NULL)) == -1)
        {
            perror("channel_create");
            return -1;
        }

        memset(&aca, 0, sizeof(aca));
        aca.buffer_size = 2048;
        aca.max_num_buffer = 5;
        aca.trigger_num_msg = 0;
        aca.trigger_time.nsec = 2000000000L;
        aca.trigger_time.interval_nsec = 0;
        aca.call_back = callback;

        if ((coid = asyncmsg_connect_attach(0, 0, chid, 0, 0, &aca)) == -1)
        {
            perror("connect_attach");
            return -1;
        }
    
        /* put up 4 messages */
        for (i = 0; i < 4; i++)
        {
             sprintf(msg[i], "Async Message Passing (msgid %d)\n", i);
             if ((asyncmsg_put(coid, msg[i], strlen(msg[i]) + 1, 1234,
                 callback)) == -1)
             {
                 perror("put");
                 return -1;
             }
        }

        /* waiting for the event */
        if (MsgReceivePulse(pchid, &pulse, sizeof(pulse), NULL) == -1)
        {
            perror("MsgReceivePulse");
            return -1;
        }

        if ((agh = asyncmsg_get(chid)) == NULL)
        {
            perror("get");
            return -1;
        }

        printf("Got message(s): \n\n");
        while ((agh1 = agh))
        {
            agh = agh1->next;
            printf("from process: %d (%d)\n", agh1->info.pid, getpid());
            printf("msglen: %d (%d)\n", agh1->info.msglen, strlen(*msg) + 1);
            printf("srclen: %d\n", agh1->info.srcmsglen);
            printf("err: %d\n", agh1->err);
            printf("parts: %d\n", agh1->parts);
            printf("msg: %s\n\n", (char *)agh1->iov->iov_base);
            asyncmsg_free(agh1);
        }

        /* give the callback a chance to run */
        sleep(1);

        if (asyncmsg_connect_detach(coid) == -1)
        {
            perror("connect_detach");
            return -1;
        }

        if (asyncmsg_channel_destroy(chid) == -1)
        {
            perror("channel_detach");
            return -1;
        }

        return 0;
}