Check the return value of notify.  If the condition is true, it doesn't arm the event, it instead returns the bits that were true. 

David
From: community-noreply@qnx.com
Sent: August 28, 2020 11:33 PM
To: ostech-core_os@community.qnx.com
Reply-to: ostech-core_os@community.qnx.com
Subject: select() vs ionotify()

I've got one resource manager that gathers data and supports ionotify so clients can wait on data to arrive and then grab it.  I'd like to have another resource manager consume these data and process them further.  For this it seems that I should use ionotify() over select(), as ionotify can deliver pulses to my second resource manager.  This all makes sense, but while the following example using select() works, the ionotify() version doesn't receive messages.  I'm sure I'm doing something silly, but if someone could point me in the right direction for using ionotify(), I'd greatly appreciate it!

/////// select version: works
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/select.h>

int main( void )
{
  int fd;
  char buf[128];
  fd_set rfd;
 
  fd = open("/dev/pioint", O_RDONLY);
  if (fd < 0) {
    perror("open");
    return 1;
  }

  /*
   * Clear the set of read file descriptors, and * add the two we just got from the open calls.
   */
  FD_ZERO( &rfd );
  FD_SET( fd, &rfd );

  for (;;) {
    select( 1+fd, &rfd, 0, 0, NULL);
    if( FD_ISSET( fd, &rfd ) ) {
      read(fd, buf, sizeof(buf));
      printf(buf);
    }
  }
  return 0;
}

/////// ionotify version: doesn't receive any even message

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/iomsg.h>
#include <sys/neutrino.h>

int main()
{
  int chid, coid;
  struct sigevent event;
  char buf[128];
  char msg[32];
  int r, rcvid;

  int fd = open("/dev/pioint", O_RDONLY);
  if (fd < 0) {
    perror("open");
    return 1;
  }
  chid = ChannelCreate(0);
  coid = ConnectAttach(0, 0, chid, _NTO_SIDE_CHANNEL, 0);
  SIGEV_PULSE_INIT(&event, coid, 0,  SI_NOTIFY, 0);

  for (;;) {
    r = ionotify(fd, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT, &event);
    rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
    if (!rcvid) {
      read(r, &buf, 128);
      printf(buf);
    }
  }
 
  return 0;
}




_______________________________________________

OSTech
http://community.qnx.com/sf/go/post120909
To cancel your subscription to this discussion, please e-mail ostech-core_os-unsubscribe@community.qnx.com