void Game::_loop() { while (_running) { _current_time = SDL_GetTicks(); _broadcast(Message(this, INPUT)); if (_current_time - _last_time > THIRTY_FPS) { _broadcast(Message(this, UPDATE, (_current_time - _last_time))); _last_time = _current_time; } _broadcast(Message(this, RENDER)); } }
void MsgRouter::_dispatchQueued() { while( !m_msgQueue.empty() ) { Msg_p pMsg = m_msgQueue.front(); m_insertPos = m_msgQueue.begin()+1; // Insert position set to right after current event. do { if( pMsg->hasCopyTo() ) pMsg->getCopyTo()->receive( pMsg ); if( pMsg->hasSource() ) _dispatchToSourceRoutes( pMsg ); _dispatchToTypeRoutes( pMsg ); _broadcast( pMsg ); } while( pMsg->doRepost() ); m_msgQueue.pop_front(); } m_insertPos = m_msgQueue.begin(); // Insert position set right to start. }
static void _update_address(struct skynet_context * context, struct master *m, int harbor_id, const char * buffer, size_t sz) { if (m->remote_fd[harbor_id] >= 0) { close(m->remote_fd[harbor_id]); m->remote_fd[harbor_id] = -1; } free(m->remote_addr[harbor_id]); char * addr = malloc(sz+1); memcpy(addr, buffer, sz); addr[sz] = '\0'; m->remote_addr[harbor_id] = addr; int fd = _connect_to(addr); if (fd<0) { skynet_error(context, "Can't connect to harbor %d : %s", harbor_id, addr); return; } m->remote_fd[harbor_id] = fd; _broadcast(context, m, addr, sz, harbor_id); int i; for (i=1;i<REMOTE_MAX;i++) { if (i == harbor_id) continue; const char * addr = m->remote_addr[i]; if (addr == NULL) { continue; } _send_to(fd, addr, strlen(addr), i); } }
static void _request_name(struct master *m, const char * buffer, size_t sz) { char name[GLOBALNAME_LENGTH]; _copy_name(name, buffer, sz); struct name * n = _search_name(m, name); if (n == NULL) { return; } _broadcast(m, name, GLOBALNAME_LENGTH, n->value); }
static void _update_name(struct master *m, uint32_t handle, const char * buffer, size_t sz) { char name[GLOBALNAME_LENGTH]; _copy_name(name, buffer, sz); struct name * n = _search_name(m, name); if (n==NULL) { n = _insert_name(m,name); } n->value = handle; _broadcast(m,name,GLOBALNAME_LENGTH, handle); }
static void on_connected(struct master *m, int id) { _broadcast(m, m->remote_addr[id], strlen(m->remote_addr[id]), id); m->connected[id] = true; int i; for (i=1;i<REMOTE_MAX;i++) { if (i == id) continue; const char * addr = m->remote_addr[i]; if (addr == NULL || m->connected[i] == false) { continue; } _send_to(m, id , addr, strlen(addr), i); } }
RTAI_SYSCALL_MODE int _rt_msg_broadcast_if(RT_MSGQ *mq, void *msg, int msg_size, int msgpri, int space) { if (rt_sem_wait_if(&mq->senders) <= 0) { return 0; } if (mq->received.count >= 0) { rt_sem_signal(&mq->senders); return 0; } if (rt_sem_wait_if(&mq->freslots) <= 0) { rt_sem_signal(&mq->senders); return 0; } return _broadcast(mq, msg, msg_size, msgpri, -(mq->received.count + mq->receivers.count), space); }
void Game::message(const Message &msg) { switch (msg.type) { case QUIT: _running = false; break; case START: _loop(); break; default: _broadcast(msg); break; } }
RTAI_SYSCALL_MODE int _rt_msg_broadcast_until(RT_MSGQ *mq, void *msg, int msg_size, int msgpri, RTIME until, int space) { int retval; if ((retval = rt_sem_wait_until(&mq->senders, until)) >= RTE_LOWERR) { return TBX_RET(0, retval); } if (mq->received.count >= 0) { rt_sem_signal(&mq->senders); return 0; } if ((retval = rt_sem_wait_until(&mq->freslots, until)) >= RTE_LOWERR) { rt_sem_signal(&mq->senders); return TBX_RET(0, retval); } return _broadcast(mq, msg, msg_size, msgpri, -(mq->received.count + mq->receivers.count), space); }