void handle_event_callback(ErlDrvPort port, ErlDrvTermData process) { WxeApp * app = (WxeApp *) wxTheApp; ErlDrvMonitor monitor; driver_monitor_process(port, process, &monitor); // Should we be able to handle commands when recursing? probably erl_drv_mutex_lock(wxe_batch_locker_m); //fprintf(stderr, "\r\nCB Start ");fflush(stderr); app->dispatch_cb(wxe_batch, wxe_batch_cb_saved, process); //fprintf(stderr, ".. done \r\n");fflush(stderr); wxe_batch_caller = 0; erl_drv_mutex_unlock(wxe_batch_locker_m); driver_demonitor_process(port, &monitor); }
void handle_event_callback(ErlDrvPort port, ErlDrvTermData process) { WxeApp * app = (WxeApp *) wxTheApp; ErlDrvMonitor monitor; if(wxe_status != WXE_INITIATED) return; // Is thread safe if pdl have been incremented if(driver_monitor_process(port, process, &monitor) == 0) { // Should we be able to handle commands when recursing? probably // fprintf(stderr, "\r\nCB EV Start %lu \r\n", process);fflush(stderr); app->recurse_level++; app->dispatch_cb(wxe_queue, wxe_queue_cb_saved, process); app->recurse_level--; // fprintf(stderr, "CB EV done %lu \r\n", process);fflush(stderr); driver_demonitor_process(port, &monitor); } }
void zmq_drv_t::add_socket(zmq_sock_info* s) { // Insert the new socket info to the head of the list if (zmq_sock_infos) zmq_sock_infos->prev = s; s->next = zmq_sock_infos; zmq_sock_infos = s; // Update map: idx -> socket zmq_sockets[s->idx] = s; // Update map: socket -> idx zmq_idxs[s->socket] = s; { // Update map: pid -> sockets zmq_pid_sockets_map_t::iterator it = zmq_pid_sockets.find(s->owner); if (it != zmq_pid_sockets.end()) it->second.sockets.insert(s); else { monitor_sockets_t ms; driver_monitor_process(port, s->owner, &ms.monitor); ms.sockets.insert(s); zmq_pid_sockets[s->owner] = ms; } } { // Update map: fd -> sockets zmq_fd_sockets_map_t::iterator it = zmq_fd_sockets.find(s->fd); if (it != zmq_fd_sockets.end()) it->second.insert(s); else { zmq_sock_set_t set; set.insert(s); zmq_fd_sockets[s->fd] = set; driver_select(port, (ErlDrvEvent)s->fd, ERL_DRV_READ, 1); zmqdrv_fprintf("registered sig_fd(%d) with VM\r\n", s->fd); } } }
static ErlDrvSSizeT monitor_drv_control(ErlDrvData drv_data, unsigned int command, char *ibuf, ErlDrvSizeT ilen, char **rbuf, ErlDrvSizeT rlen) { MyDrvData *data = (MyDrvData *) drv_data; char *answer = NULL; char buff[64]; ErlDrvSSizeT alen; switch (command) { case OP_I_AM_IPID: data->ipid = driver_caller(data->port); answer = "ok"; break; case OP_MONITOR_ME: { int res; OneMonitor *om = driver_alloc(sizeof(OneMonitor)); om->pid = driver_caller(data->port); om->later_id = 0; res = driver_monitor_process(data->port,om->pid,&(om->mon)); if (res < 0) { answer = "error"; driver_free(om); } else if (res > 0) { answer = "noproc"; driver_free(om); } else { om->next = data->first; data->first = om; answer = "ok"; } break; } case OP_DEMONITOR_ME: { int res; OneMonitor *p,*q = NULL; int found = 0; ErlDrvTermData pid = driver_caller(data->port); for (p = data->first; p != NULL; p = p->next) { if (p->pid == pid) { q = p; ++found; } } if (q == NULL) { answer = "not_monitored"; } else { if (q->later_id > 0) { if (found > 1) { answer = "delayd_but_more"; } else { answer = "delayed"; } } else { res = driver_demonitor_process(data->port, &(q->mon)); if (res < 0) { answer = "error"; } else if (res > 0) { if (found > 1) { answer = "gone_but_more"; } else { answer = "gone"; } } else { if (found > 1) { answer = "ok_but_more"; } else { answer = "ok"; } } } if (data->first == q) { data->first = q->next; } else { for (p = data->first; p != NULL; p = p->next) { if (p->next == q) { p->next = q->next; break; } } } driver_free(q); } break; } case OP_MONITOR_ME_LATER: { int res; OneMonitor *om = driver_alloc(sizeof(OneMonitor)); om->pid = driver_caller(data->port); om->later_id = (++(data->later_counter)); om->next = data->first; data->first = om; sprintf(buff,"ok:%d",om->later_id); answer = buff; break; } case OP_DO_DELAYED_MONITOR: { int id = 0, sign = 1, in_number = 0; OneMonitor *p, *q; char *bp; for (bp = ibuf; bp < (ibuf + ilen); ++bp) { if (*bp <= '9' && *bp >= '0') { int x = *bp - '0'; in_number++; id *= 10; id += x; } else if (*bp == '-') { if (in_number) { break; } sign = -1; ++in_number; } else { if (in_number) { break; } } } id *= sign; q = NULL; for (p = data->first; p != NULL; q = p, p = p->next) { if (p->later_id != 0 && p->later_id == id) { break; } } if (p == NULL) { answer = "not_found"; } else { int res = driver_monitor_process(data->port,p->pid,&(p->mon)); if (res != 0) { if (res < 0) { answer = "error"; } else { answer = "noproc"; } if (q == NULL) { data->first = p->next; } else { q->next = p->next; } driver_free(p); } else { p->later_id = 0; answer = "ok"; } } break; } default: answer = "unknown_op"; } if (answer == NULL) { answer = "internal_error"; } alen = strlen(answer); if (alen >= rlen) { *rbuf = driver_alloc(alen+1); } strcpy(*rbuf,answer); return alen; }