Example #1
0
int main( int argc, char **argv)
{
	int rcvid;
	struct my_msg msg;
	name_attach_t *attach;

	/* attach the name the client will use to find us */
	/* our channel will be in the attach structure */
	if ( (attach = name_attach( NULL, MY_SERV, 0 )) == NULL)					// register a name in the namespace and create a channel
	{
     	printf("server: failed to attach name, errno: %d\n", errno );
     	exit(1);
    }
  
	/* wait for the message from the client */
	rcvid = MsgReceive( attach->chid, &msg, sizeof( msg ), NULL );
	if ( msg.type == MSG_GIVE_PULSE )
	{ 
     	/* wait until it is time to notify the client */
     	sleep(2);

     	/* deliver notification to client that client requested */
     	MsgDeliverEvent( rcvid, &msg.event );
     	printf("server: delivered event\n");
	} else
  	{
    		printf("server: unexpected message\n");
  	}
  
	return 0;
}
void* IDSEXT::idsEventThread(void *args)
{
    IDSEXT *idsExt = reinterpret_cast<IDSEXT *>(args);

    struct _pulse msg;

    eventCHID = ChannelCreate(_NTO_CHF_COID_DISCONNECT);

    while ( idsExt->connected ) {
        if (MsgReceive(eventCHID, &msg, sizeof(msg), NULL) == 0) {
            // Find provider - process msg
            ids_provider_mapping* current = idsExt->providers;

            while ( current != NULL ) {
                if ( msg.code == current->providerFd ) {
                    // Re-arm ionotify
                    if (ids_process_msg(current->providerFd) != IDS_SUCCESS) {
                        fprintf(stderr, "Failed to process IDS message\n");
                        idsExt->removeProvider(current->providerFd);
                    } else {
                        if (ionotify(current->providerFd, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT, current->sigEvent) & _NOTIFY_COND_INPUT) {
                            MsgDeliverEvent(0, current->sigEvent);
                        }
                    }
                }
                current = current->next;
            }
        }
    }

    pthread_detach(pthread_self());
    return NULL;
}
std::string IDSEXT::RegisterProvider(const std::string& providerName)
{
    Json::FastWriter writer;
    Json::Value resultJSON;

    ids_provider_mapping *registeredItem = reinterpret_cast<ids_provider_mapping *>(malloc(sizeof(ids_provider_mapping)));
    if (!registeredItem) {
        fprintf(stderr, "Unable to register IDS provider - malloc error\n");
        return "";
    }

    registeredItem->providerName = strdup(providerName.c_str());
    resultJSON["result"] = ids_register_provider(registeredItem->providerName, &registeredItem->provider, &registeredItem->providerFd);
    if ( (ids_result_t) resultJSON["result"].asInt() == IDS_SUCCESS ) {
        registeredItem->next = providers;
        providers = registeredItem;

        registeredItem->sigEvent = new sigevent;
        registeredItem->sigEvent->sigev_notify = SIGEV_PULSE;
        registeredItem->sigEvent->sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0, eventCHID, _NTO_SIDE_CHANNEL, 0);
        registeredItem->sigEvent->sigev_priority = getprio(0);
        registeredItem->sigEvent->sigev_code = registeredItem->providerFd;
        registeredItem->sigEvent->sigev_value.sival_int = registeredItem->providerFd;

        if (ionotify(registeredItem->providerFd, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT, registeredItem->sigEvent) & _NOTIFY_COND_INPUT) {
            MsgDeliverEvent(0, registeredItem->sigEvent);
        }
    } else {
        resultJSON["errno"] = strerror(errno);
    }

    std::string resultStr = writer.write(resultJSON);
    return( resultStr.c_str() );
}
Example #4
0
static int drain_and_arm_mmr_events(mmr_context_t *ctxt) {
    const mmr_event_t *ev = mmr_event_get(ctxt);
    int rc;

    while (ev != NULL && ev->type != MMR_EVENT_NONE) {
        ev = mmr_event_get(ctxt);
    }
    if (NULL == ev) {
        return EXIT_FAILURE;
    }

    rc = mmr_event_arm(ctxt, &mmr_sigevent);
    if (rc < 0) {
        //errno has been set by mmr_event_arm; just return failure
        return EXIT_FAILURE;
    } else if (rc > 0) {
        //event is already available, manually arm
        MsgDeliverEvent(0, &mmr_sigevent);
    }
    //reach here if rc >= 0
    return EXIT_SUCCESS;
}
Example #5
0
void
iofunc_notify_trigger_strict(resmgr_context_t *ctp, iofunc_notify_t *nop, int cnt, int index) {
	iofunc_notify_event_t	*nep;

	// Trigger all events which have a trigger cnt.
	
	nop += index;
	nop->cnt = INT_MAX;
	for(nep = nop->list ; nep ; nep = nep->next) {
		/* SIGEV_NONE also implies nep->cnt == INT_MAX */
		if(SIGEV_GET_TYPE(&nep->event) == SIGEV_NONE)
			continue;
		if((ctp == NULL || (ctp->info.scoid == nep->scoid &&
		    ctp->info.coid == nep->coid)) && nep->cnt <= cnt) {
			if(SIGEV_GET_TYPE(&nep->event) >= SIGEV_SIGNAL  &&
			   SIGEV_GET_TYPE(&nep->event) <= SIGEV_PULSE  &&
			   nep->event.sigev_code == SI_NOTIFY) {
				nep->event.sigev_value.sival_int |= _NOTIFY_COND_INPUT << index;
				if(nep->flags & _NOTIFY_COND_EXTEN) {
					nep->event.sigev_value.sival_int |= _NOTIFY_COND_EXTEN;
					/*
					 * Don't have enough bits in sival_int for
					 * extended flags.  If they've asked for
					 * the extended events, it means they're
					 * expecting the code to be overwritten.
					 */
					nep->event.sigev_code = -(_NOTIFY_CONDE_RDNORM << index);
				}
			}
			(void)MsgDeliverEvent(nep->rcvid, &nep->event);
			nep->event.sigev_notify = SIGEV_NONE;
			nep->cnt = INT_MAX;
		}

		// Calculate a new min cnt on the fly for the interrupt handler.
		if(nop->cnt > nep->cnt)
			nop->cnt = nep->cnt;
	}
}
Example #6
0
static int mmr_sigevent_handler(void *p) {
    int rc;
    mmr_context_t *ctxt = (mmr_context_t *)p;
    if (NULL == p) {
        show_dialog_message("mmr context error\n");
        return EXIT_FAILURE;
    }
    const mmr_event_t *mmr_event = mmr_event_get( ctxt );
    if (NULL == mmr_event) {
        show_dialog_message("mmr event error\n");
        return EXIT_FAILURE;
    }

    static mmr_state_t last_state = MMR_EVENT_NONE;
    static int last_speed = 0;

    if ((last_state != mmr_event->state) || (last_speed != mmr_event->speed)) {
        last_state = mmr_event->state;
        last_speed = mmr_event->speed;
        switch (mmr_event->state) {
            case MMR_STATE_PLAYING:
               if (0 == mmr_event->speed)
                   show_dialog_message("MMRenderer Status: Pausing\n");
               else 
                   show_dialog_message("MMRenderer Status: Playing\n");
               break;
            case MMR_STATE_STOPPED:
               show_dialog_message("MMRenderer Status: Stopped\n");
               break;
            case MMR_STATE_IDLE:
               show_dialog_message("MMRenderer Status: Idle\n");
               break;
            case MMR_STATE_DESTROYED:
               show_dialog_message("MMRenderer Status: Destroyed\n");
               break;
            default:
               show_dialog_message("MMRenderer Status: Unknown\n");
               break;
        }
    }

    if ((MMR_EVENT_ERROR == mmr_event->type) && (MMR_STATE_STOPPED == mmr_event->state)){
        /*
         * We have reached the end.  Do not rearm. Return failure to signal we 
         * don't want to be recalled.
         */
        show_dialog_message("MMRenderer Status: No more data\n");
        return EXIT_FAILURE;
    }

    rc = mmr_event_arm(ctxt, &mmr_sigevent);
    if ( rc > 0) {
        //event is already available, manually arm
        MsgDeliverEvent(0, &mmr_sigevent);
    } else if ( rc < 0 ) {
        show_dialog_message("mmr_event_arm() error\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}
Example #7
0
void *worker(void *v) {
	wrk_info_t wrk_info = *(wrk_info_t*)v;
	int result;
	struct sigevent clientevent, timeoutevent;
	struct sigaction timeoutact;
	iov_t *piov, header;
	frame_t frame;
	timer_t timer;
	syncsig_t *psync = &wrk_info.psync[wrk_info.id];
	struct itimerspec timeout, stoptimeout;

	struct timespec slp;
	slp.tv_nsec = 10000000;
	slp.tv_sec = 0;

	timeout.it_interval.tv_sec = 0;
	timeout.it_interval.tv_nsec = 0;
	timeout.it_value.tv_sec = 0;
	timeout.it_value.tv_nsec = 0;
	stoptimeout = timeout;
	sem_init(&psync->sem, 0, 1);
	SETIOV(&header, &frame, sizeof(frame_t));
	SIGEV_SIGNAL_VALUE_INIT(&timeoutevent, SIGUSR1, psync);
	//SIGEV_SIGNAL_INIT(&timeoutevent, SIGUSR1) ;
	__ERROR_CHECK(timer_create(CLOCK_MONOTONIC, &timeoutevent, &timer),-1,"timer_create");
	__ERROR_CHECK(signal(SIGUSR1, wrk_sigusr1),-1,"signal");
	//timeoutact.sa_handler = &wrk_sigusr1;

	//sigaction(SIGUSR1, &timeoutact, NULL);

	while(true) {
		psync->rcvid = -1;
		wrk_info.psync[wrk_info.id].status = READY;
		psync->rcvid = MsgReceivev(wrk_info.chid, &header, 1, NULL);
		__ERROR_CONT(psync->rcvid, -1, MSG_ERR_MSGREC);
		wrk_info.psync[wrk_info.id].status = WORK;
		if(0 == psync->rcvid) {
			switch(frame.header.code) {
			case _PULSE_CODE_DISCONNECT:
				printf("Client has gone\n");
				break;
			case _PULSE_CODE_UNBLOCK:
				printf("_PULSE_CODE_UNBLOCK\n");
				for(size_t i=0; i<wrk_info.wrk_amount; ++i) {
					if(wrk_info.psync[i].rcvid == frame.header.value.sival_int) {
						if(wrk_info.psync[i].status != SEND) {
							__ERROR_CHECK(MsgError(frame.header.value.sival_int, ETIME),-1,MSG_ERR_MSGERR);
						}
						break;
					}
				}
				break;
			default:
				break;
			}
		} else {
			if (frame.header.type == _IO_CONNECT) {
				printf("Send OK\n");
				frame_reply(psync->rcvid, NULL);
				continue;
			}
			wrk_info.proute[frame.cid] = wrk_info.id;
			timeout.it_value = frame.timeout;
			//printf("%u  %u\n", timeout.it_value.tv_sec, timeout.it_value.tv_nsec);
			sem_wait(&psync->sem);
			if(frame.protocol != REPLY) {
				__ERROR_CHECK(timer_settime(timer, 0, &timeout, NULL),-1,"timer_settime");
			}
			//printf("Thread %i, client %i\n", wrk_info.id, frame.cid);
			frame_datareceive(psync->rcvid, &frame);
			sem_post(&psync->sem);
			//sleep(1);
			nanosleep( &slp, NULL);

			if(frame.protocol == NOREPLY) {
				SIGEV_PULSE_INIT( &clientevent, frame.coid,
									SIGEV_PULSE_PRIO_INHERIT, PULSE_CODE_DATA_READY, 0);
				frame_reply(psync->rcvid, NULL);
			}
			if(frame.protocol != REPLY) {
				frame_repinit(&frame, &wrk_info.pcash[frame.cid].framerep);
				for(size_t i=0; i<frame.size; ++i) {
					processtask(frame.ptask+i, wrk_info.pcash[frame.cid].framerep.ptask+i,
							&wrk_info.pcash[frame.cid].spline);
				}
				__ERROR_CHECK(timer_settime(timer, 0, &stoptimeout, NULL),-1,"timer_settime");
			}

			wrk_info.psync[wrk_info.id].status = SEND;
			if(frame.protocol == NOREPLY) {
				result = -1;
				for(int i=0; i<3 && result == -1; ++i) {
					result = MsgDeliverEvent(psync->rcvid, &clientevent);
					__ERROR_CHECK(result, -1, "MsgDeliverEvent");
				}
			} else {
				frame_reply(psync->rcvid, &wrk_info.pcash[frame.cid].framerep);
				frame_destroy(&wrk_info.pcash[frame.cid].framerep);
			}
		}
	}
}