示例#1
0
void RemoveEmptyBlocks()
{
    // Start on first->next to prevent removing the first dummy BEGIN event
    struct Event *begin = first;
    
    // Find BEGINs
    while (begin)
    {
        if (begin->type == BEGIN)
        {
            int destroy = 0;
            
            // Find it's matching END
            struct Event *end = begin->next;
            while (end)
            {
                if (end->type == CELL && end->nestingLevel == begin->nestingLevel)
                {
                    // There is a CELL within the current BEGIN. Don't remove it!
                    break;
                }
                else if (end->type == END && end->nestingLevel == begin->nestingLevel - 1)
                {
                    // We found the matching end!
                    destroy = 1;
                    break;
                }
                end = end->next;
            }
            
            // Let's destroy the pair, if necessary.
            if (destroy)
            {
                // Adjust nesting levels
                struct Event *aux = begin->next;
                while (aux != end)
                {
                    aux->nestingLevel--;
                    aux = aux->next;
                }
                
                struct Event *next = begin->next;
                if (begin != first)
                    removeEvent(begin);
                begin = next;

                if (end != last)
                    removeEvent(end);

                continue;
            }                
        }
        begin = begin->next;
    }
}
示例#2
0
void MainWindow::makeConnections() {
    connect(&storage, SIGNAL(eventAdded(CalendarEvent)),
            calendar, SLOT(addEvent(CalendarEvent)));
    connect(&storage, SIGNAL(eventRemoved(CalendarEvent)),
            calendar, SLOT(removeEvent(CalendarEvent)));

    connect(calendar, SIGNAL(eventRemoved(CalendarEvent)),
            &storage, SLOT(removeEvent(CalendarEvent)));
    connect(calendar, SIGNAL(eventUpdated(CalendarEvent,CalendarEvent)),
            &storage, SLOT(updateEvent(CalendarEvent,CalendarEvent)));
}
示例#3
0
// --------------------------------------------------------------------------------
// Processes the events that are ready
void Events::doEvents(void)
{
	for (uint8_t i = 0; i < _total; i++)
	{
		event_t * event = &_events[i];

		// skip null or already processed events
		if (!(event->flags & (1<<EVENT_FLAG_PROCESS)))
			continue;

		// skip high-priority events
		if ((event->flags & (1<<EVENT_PRIORITY_HIGH)))
			continue;

		// process event
		if (event->func)
			event->func(event->state);

		// mark event as processed
		event->flags &= ~(1<<EVENT_FLAG_PROCESS);

		// remove one-shot events
		if (0 != (event->flags & (1<<EVENT_FLAG_ONESHOT)))
			removeEvent(i);
	}
}
示例#4
0
bool WorkerEventQueue::cancelEvent(Event* event) {
  if (!removeEvent(event))
    return false;
  InspectorInstrumentation::asyncTaskCanceled(
      event->target()->getExecutionContext(), event);
  return true;
}
示例#5
0
void epoll::suspendRead( EventReactor* pHandler )
{
    if ( pHandler->getEvents() & POLLIN )
    {
        removeEvent( pHandler, POLLIN );
    }
}
示例#6
0
void epoll::suspendWrite( EventReactor* pHandler )
{
    if ( pHandler->getEvents() & POLLOUT )
    {
        removeEvent( pHandler, POLLOUT );
    }
}
示例#7
0
void
CEventQueue::addEvent(const CEvent& event)
{
	// discard bogus event types
	switch (event.getType()) {
	case CEvent::kUnknown:
	case CEvent::kSystem:
	case CEvent::kTimer:
		return;

	default:
		break;
	}
	
	if ((event.getFlags() & CEvent::kDeliverImmediately) != 0) {
		dispatchEvent(event);
		CEvent::deleteData(event);
	}
	else {
		CArchMutexLock lock(m_mutex);
		
		// store the event's data locally
		UInt32 eventID = saveEvent(event);
		
		// add it
		if (!m_buffer->addEvent(eventID)) {
			// failed to send event
			removeEvent(eventID);
			CEvent::deleteData(event);
		}
	}
}
示例#8
0
文件: screen.cpp 项目: q4a/attal
void Screen::handleDelete()
{
	if( _currentCell->getLord() ) {
		GenericLord * lord = _currentCell->getLord();
		if(lord->getOwner()){
			lord->getOwner()->removeLord(lord);
		}
		lord->setCell( NULL );
	} else if( _currentCell->getCreature() ) {
		GenericMapCreature * creature = _currentCell->getCreature();
		removeMapCreature(creature);
		_currentCell->setCreature( NULL );
	} else if( _currentCell->getBuilding() ) {
		GenericBuilding * build = _currentCell->getBuilding();
		removeBuilding( build );
		_currentCell->setBuilding( NULL );
	} else if( _currentCell->getBase() ) {
		GenericBase * base = _currentCell->getBase();
		removeBase(  base );
		_currentCell->setBase( NULL );
	} else if( _currentCell->getEvent() ) {
		Event * event = (Event *)( _currentCell->getEvent() );
		removeEvent( event );
		_currentCell->setEvent( NULL );
	}

	_currentCell->setDecoration( 0, 0 );
	_currentCell->setTransition( 0 );
	_currentCell->setTransitionCellType( 0 );

	cellChanged( _currentCell );
}
示例#9
0
CFileLPT::~CFileLPT () {
	// close file
	if(fileOpen)
		fclose(file);
	// remove tick handler
	removeEvent(0);
}
示例#10
0
        void undo() const override
        {
            auto& scenar = m_scenarioPath.find();
            auto& globalTn = scenar.timeNode(m_destinationTnId);

            Deserializer<DataStream> s{m_serializedTimeNode};
            auto recreatedTn = new TimeNodeModel{s, &scenar};

            auto events_in_timenode = recreatedTn->events();
            // we remove and re-add events in recreated Tn
            // to ensure correct parentship between elements.
            for(auto evId : events_in_timenode)
            {
                recreatedTn->removeEvent(evId);
                globalTn.removeEvent(evId);
            }
            for(auto evId : events_in_timenode)
            {
                recreatedTn->addEvent(evId);
            }

            scenar.timeNodes.add(recreatedTn);

            globalTn.trigger()->setExpression(m_targetTrigger);
            globalTn.trigger()->setActive(m_targetTriggerActive);

            m_moveCommand->undo();
            updateTimeNodeExtent(m_destinationTnId, scenar);

        }
示例#11
0
// --------------------------------------------------------------------------------
// Removes an event from the event list and frees up it's allocation
void Events::eventsUnregisterEvent(fEventCallback fprt)
{
	for (uint8_t i = 0; i < _total; i++)
	{
		if (_events[i].func == fprt)
			removeEvent(i);
	}
}
示例#12
0
void WorkerEventQueue::dispatchEvent(Event* event,
                                     ExecutionContext* executionContext) {
  if (!event || !removeEvent(event))
    return;

  InspectorInstrumentation::AsyncTask asyncTask(executionContext, event);
  event->target()->dispatchEvent(event);
}
void ONScripter::waitEventSub(int count)
{
    remaining_time = count;
    timerEvent();

    runEventLoop();
    removeEvent( ONS_BREAK_EVENT );
}
示例#14
0
void Timer::removePluginEvents(Script *p)
{
	for(uint i= 1; i< MAX_TIMER_COUNT; i++)
	{
		if( isIDValid(i) && (events[i].plugin==p) )
			removeEvent(i);
	}
}
示例#15
0
bool
CEventQueue::getEvent(CEvent& event, double timeout)
{
	CStopwatch timer(true);
retry:
	// if no events are waiting then handle timers and then wait
	while (m_buffer->isEmpty()) {
		// handle timers first
		if (hasTimerExpired(event)) {
			return true;
		}

		// get time remaining in timeout
		double timeLeft = timeout - timer.getTime();
		if (timeout >= 0.0 && timeLeft <= 0.0) {
			return false;
		}

		// get time until next timer expires.  if there is a timer
		// and it'll expire before the client's timeout then use
		// that duration for our timeout instead.
		double timerTimeout = getNextTimerTimeout();
		if (timeout < 0.0 || (timerTimeout >= 0.0 && timerTimeout < timeLeft)) {
			timeLeft = timerTimeout;
		}

		// wait for an event
		m_buffer->waitForEvent(timeLeft);
	}

	// get the event
	UInt32 dataID;
	IEventQueueBuffer::Type type = m_buffer->getEvent(event, dataID);
	switch (type) {
	case IEventQueueBuffer::kNone:
		if (timeout < 0.0 || timeout <= timer.getTime()) {
			// don't want to fail if client isn't expecting that
			// so if getEvent() fails with an infinite timeout
			// then just try getting another event.
			goto retry;
		}
		return false;

	case IEventQueueBuffer::kSystem:
		return true;

	case IEventQueueBuffer::kUser:
		{
			CArchMutexLock lock(m_mutex);
			event = removeEvent(dataID);
			return true;
		}

	default:
		assert(0 && "invalid event type");
		return false;
	}
}
示例#16
0
static foreign_t
remove_alarm(term_t alarm)
{ Event ev = NULL;

  if ( !get_timer(alarm, &ev) )
    return FALSE;

  return removeEvent(ev);
}
// Remove this event from the event queue, as well as all other
// events that share the same timestamp, as well as destination actor.
void removeAndPropagateSameTagEvents(Event* thisEvent) {
    Event* nextEvent = thisEvent->nextEvent;
    Event* lastEvent = thisEvent;
    *(thisEvent->sinkEvent) = (Event*)thisEvent;
    removeEvent(thisEvent);
    // Now find the next event see we should process it at the same time.
    while(nextEvent && (compareTime(nextEvent->tag.timestamp, thisEvent->tag.timestamp) == EQUAL)
                        && (nextEvent->tag.microstep == thisEvent->tag.microstep) && nextEvent->fireMethod == thisEvent->fireMethod) {
            *(nextEvent->sinkEvent) = (Event*)nextEvent;
                removeEvent(nextEvent);
        lastEvent = nextEvent;
        nextEvent = nextEvent->nextEvent;
        }
    // Make this linked list semi-circular by pointing
    // the prevEvent of thisEvent to the end of the list.
    // This is used later in freeEvent().
    thisEvent->prevEvent = lastEvent;
}
示例#18
0
文件: nullmodem.cpp 项目: wwiv/dosbox
CNullModem::~CNullModem() {
	if (serversocket) delete serversocket;
	if (clientsocket) delete clientsocket;
	// remove events
	for(Bit16u i = SERIAL_BASE_EVENT_COUNT+1;
			i <= SERIAL_NULLMODEM_EVENT_COUNT; i++) {
		removeEvent(i);
	}
}
示例#19
0
bool WorkerEventQueue::cancelEvent(Event* event)
{
    EventDispatcherTask* task = m_eventTaskMap.get(event);
    if (!task)
        return false;
    task->cancel();
    removeEvent(event);
    return true;
}
示例#20
0
void
EventList::removeAllEventsForObject(QObject *widget)
{
    EventList::ConstIterator endIt = constEnd();
    for (EventList::ConstIterator it = constBegin(); it != endIt; ++it) {
        if (((*it)->sender() == widget) || ((*it)->receiver() == widget))
            removeEvent(*it);
    }
}
示例#21
0
void CTimerManager::cancelShutdownOnWakeup()
{
	pthread_mutex_lock(&tm_eventsMutex);
	if (shutdown_eventID > -1) {
		removeEvent(shutdown_eventID);
		shutdown_eventID = -1;
	}
	*wakeup = false;
	pthread_mutex_unlock(&tm_eventsMutex);
}
示例#22
0
/*
 * Under win32, it seems that fd is not allocated continously.
 * Sorry for windows guys:'(
 */
bool SocketRegistryImpl::poll(time_t now)
{
	FdSet fdset;
	int fds[FD_SIZE];
	int nfds = 0;
	FD_ENTRY *e;

	// Set in the fd_set from 0 to maxfd
	for (e = fdTable + maxfd; e >= fdTable; e--) {
		if (e->fd < 0)
			continue;

		// Check timeout
		if (e->timeout && e->timeout <= now) {
			// Reset timer
			e->timeout = 0;
			e->listener->onSocketTimeout();
	
		} else if (e->event) {
			fdset.setFd(e->fd, e->event);
			fds[nfds++] = e->fd;
		}
	}

	int n = fdset.poll();
	if (n < 0)
		return false;

	// Returns if no sockets event
	if (n == 0)
		return true;

	// Dispatch socket events
	for (int i = 0; i < nfds; i++) {
		int events = fdset.getEventsReady(i, fds[i]);
		e = fdTable + fds[i];

		if (events & SOCKET_READ) {
			// Do not poll on this fd any more if an error occurs
			if (!e->listener->onSocketRead()) {
				e->event = 0;
				continue;
			}
		}
		if (events & SOCKET_WRITE) {
			// We remove write event mask here. clients may add it again
			// in onSocketWrite()
			removeEvent(e->fd, SOCKET_WRITE);
			e->timeout = 0;
			e->listener->onSocketWrite();
		}
	}

	return true;
}
示例#23
0
CSerialModem::~CSerialModem() {
	if(serversocket) delete serversocket;
	if(clientsocket) delete clientsocket;
	if(waitingclientsocket) delete waitingclientsocket;

	delete rqueue;
	delete tqueue;

	// remove events
	for(Bitu i = SERIAL_BASE_EVENT_COUNT+1;	i <= SERIAL_MODEM_EVENT_COUNT; i++)
		removeEvent(i);
}
示例#24
0
文件: nullmodem.cpp 项目: wwiv/dosbox
void CNullModem::Disconnect() {
	removeEvent(SERIAL_POLLING_EVENT);
	removeEvent(SERIAL_RX_EVENT);
	// it was disconnected; free the socket and restart the server socket
	LOG_MSG("Serial%d: Disconnected.",COMNUMBER);
	delete clientsocket;
	clientsocket=0;
	setDSR(false);
	setCTS(false);
	setCD(false);
	
	if (serverport) {
		serversocket = new TCPServerSocket(serverport);
		if (serversocket->isopen) 
			setEvent(SERIAL_SERVER_POLLING_EVENT, 50);
		else delete serversocket;
	} else if (dtrrespect) {
		setEvent(SERIAL_NULLMODEM_DTR_EVENT,50);
		DTR_delta = getDTR(); // try to reconnect the next time DTR is set
	}
}
示例#25
0
void EventModel::addEvent(boost::shared_ptr<StanzaEvent> event, bool active) {
	beginResetModel();
	if (active) {
		activeEvents_.push_front(new QtEvent(event, active));
	} else {
		inactiveEvents_.push_front(new QtEvent(event, active));
		if (inactiveEvents_.size() > inactiveEventsLimit) {
			removeEvent(inactiveEvents_[inactiveEventsLimit]->getEvent());
		}
	}
	endResetModel();
}
示例#26
0
void runLoop(EventLoop *loop, bool *run)
{
	struct kevent		*ke;
	Event				*evt;
	/* PRINT("booooooooool %p", run); */
	if(loop == NULL)
		die("EventLoop not initialized");
	int n, i;
	while (*run)
	{
		/* n=epoll_wait(loop->efd, loop->events, loop->maxEvent, -1); */
		n = kevent(loop->efd, NULL, 0, loop->events, loop->maxEvent, NULL);
		PRINT("event %d", n);
		if (n == -1)
			die("kevent error");
		for (i = 0; i < n; i++)
		{
			ke = &loop->events[i];
			evt = (Event*) ke->udata;
			if (evt == NULL)
				die("Whaat !!!???");
			/* PRINT("event %p", evt); */
			/* PRINT("lloop %d", loop->events[i].events); */

			if (ke->flags & EV_EOF)
			{
				PRINT("DISCONNECT %d == %d", evt->fd, ke->ident);
				removeEvent(loop, evt);
				close(evt->fd);
			}
			else if (ke->flags & EVFILT_READ)
			{
				PRINT("EPOLLIN");
				evt->watch=EV_READ;
				PRINT("EPOLLIN");
				evt->callback(loop, evt);
			}
			else if (ke->flags & EVFILT_WRITE)
			{
				PRINT("EPOLLOUT");
				evt->watch=EV_WRITE;
				evt->callback(loop, evt);
			}
			else
				PRINT("Unexpected");
			++i;
		}
	}
}
示例#27
0
void
EventQueue::addEventToBuffer(const Event& event)
{
    ArchMutexLock lock(m_mutex);
    
    // store the event's data locally
    UInt32 eventID = saveEvent(event);
    
    // add it
    if (!m_buffer->addEvent(eventID)) {
        // failed to send event
        removeEvent(eventID);
        Event::deleteData(event);
    }
}
示例#28
0
文件: core.cpp 项目: bo0ts/mango
    /**
     * Remove an object from the engine's list of objects based on
     * ID. Returns a pointer to the object that was removed. If no
     * object with the given ID exists the return value will be NULL.
     */
    Object* CoreEngine::removeObject(int objectID){
      Object* discarded_object;
      if (objectID < 0){
	throw Error(objectType(), "removeObject", "object ID cannot be negative");
      }
      if (objectID >= objects.size()){
	throw Error(objectType(), "removeObject", "object ID larger than internal object vector");	
      }
	    	
      removeEvent(objects[objectID], ALL_EVENTS);
      int s = objects.size();
      discarded_object = objects[objectID];
      objects[objectID] = objects[s-1];
      objects[objectID]->ID = objectID;		
      objects.pop_back();
      return discarded_object;
    }
示例#29
0
void plugin::eventDateTime ( const QString& id_, const QString& sceneid_, const QString& date, const QString& time) {
    if (sceneid_.isEmpty()) {
        removeEvent(id_);
        return;
    }

    // recalculate next event
    EventTimeStructure s;
    s.eventid = id_;
    s.sceneid = sceneid_;
    s.date = QDate::fromString(date, Qt::ISODate);
    s.time = QTime::fromString(time, QLatin1String("h:m"));
    QDateTime datetime(s.date, s.time);
    if (QDateTime::currentDateTime()>datetime)
        return;
    addToEvents(datetime, s);
}
示例#30
0
OMX_ERRORTYPE Component::addEvent(OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2)
{
	OMXEvent event;

	event.eEvent      = eEvent;
	event.nData1      = nData1;
	event.nData2      = nData2;

	pthread_mutex_lock(&event_mutex);
	removeEvent(eEvent, nData1, nData2);
	omxEvents.push_back(event);
	// this allows (all) blocked tasks to be awoken
	pthread_cond_broadcast(&m_omx_event_cond);
	pthread_mutex_unlock(&event_mutex);

	return OMX_ErrorNone;
}