static void *uaenet_trap_threadr (void *arg) { struct uaenetdatawin32 *sd = (struct uaenetdatawin32*)arg; struct pcap_pkthdr *header; const u_char *pkt_data; uae_set_thread_priority (NULL, 1); sd->threadactiver = 1; uae_sem_post (&sd->sync_semr); while (sd->threadactiver == 1) { int r; r = pcap_next_ex (sd->fp, &header, &pkt_data); if (r == 1) { uae_sem_wait (&sd->change_sem); sd->gotfunc ((struct s2devstruct*)sd->user, pkt_data, header->len); uae_sem_post (&sd->change_sem); } if (r < 0) { write_log (L"pcap_next_ex failed, err=%d\n", r); break; } } sd->threadactiver = 0; uae_sem_post (&sd->sync_semr); return 0; }
static void *dev_thread (void *devs) { struct devstruct *dev = (struct devstruct*)devs; uae_set_thread_priority (2); dev->thread_running = 1; uae_sem_post (&dev->sync_sem); for (;;) { uaecptr request = (uaecptr)read_comm_pipe_u32_blocking (&dev->requests); uae_sem_wait (&change_sem); if (!request) { dev->thread_running = 0; uae_sem_post (&dev->sync_sem); uae_sem_post (&change_sem); return 0; } else if (get_async_request (dev, request, 1)) { uae_ReplyMsg (request); release_async_request (dev, request); } else if (dev_do_io (dev, request, 0) == 0) { uae_ReplyMsg (request); } else { add_async_request (dev, request); uaeser_trigger (dev->sysdata); } uae_sem_post (&change_sem); } return 0; }
static void *uaenet_trap_threadw (void *arg) { struct uaenetdatawin32 *sd = (struct uaenetdatawin32*)arg; uae_set_thread_priority (NULL, 1); sd->threadactivew = 1; uae_sem_post (&sd->sync_semw); while (sd->threadactivew == 1) { int donotwait = 0; int towrite = sd->mtu; uae_sem_wait (&sd->change_sem); if (sd->getfunc ((struct s2devstruct*)sd->user, sd->writebuffer, &towrite)) { if (log_ethernet & 1) { TCHAR out[1600 * 2], *p; p = out; for (int i = 0; i < towrite && i < 1600; i++) { _stprintf(p, _T("%02x"), sd->writebuffer[i]); p += 2; *p = 0; } write_log(_T("OUT %4d: %s\n"), towrite, out); } ppcap_sendpacket(sd->fp, sd->writebuffer, towrite); donotwait = 1; } uae_sem_post (&sd->change_sem); if (!donotwait) WaitForSingleObject (sd->evttw, INFINITE); } sd->threadactivew = 0; uae_sem_post (&sd->sync_semw); return 0; }
static void *dev_thread (void *devs) { struct s2devstruct *dev = (struct s2devstruct*)devs; uae_set_thread_priority (NULL, 1); dev->thread_running = 1; uae_sem_post (&dev->sync_sem); for (;;) { uaecptr request = (uaecptr)read_comm_pipe_u32_blocking (&dev->requests); uae_sem_wait (&change_sem); if (!request) { dev->thread_running = 0; uae_sem_post (&dev->sync_sem); uae_sem_post (&change_sem); write_log (_T("%s: dev_thread killed\n"), getdevname ()); return 0; } else if (get_async_request (dev, request, 1)) { uae_ReplyMsg (request); release_async_request (dev, request); rem_async_packet (dev, request); } else if (dev_do_io (dev, request, 0) == 0) { uae_ReplyMsg (request); rem_async_packet (dev, request); } else { add_async_request (dev, request); ethernet_trigger (dev->sysdata); } uae_sem_post (&change_sem); } return 0; }
static void *dev_thread (void *devs) { struct devstruct *dev = devs; uae_set_thread_priority (2); dev->thread_running = 1; sys_command_open_thread (DF_SCSI, dev->unitnum); sys_command_open_thread (DF_IOCTL, dev->unitnum); uae_sem_post (&dev->sync_sem); for (;;) { uaecptr request = (uaecptr)read_comm_pipe_u32_blocking (&dev->requests); uae_sem_wait (&change_sem); if (!request) { dev->thread_running = 0; uae_sem_post (&dev->sync_sem); uae_sem_post (&change_sem); break; } else if (dev_do_io (dev, request) == 0) { put_byte (request + 30, get_byte (request + 30) & ~1); release_async_request (dev, request); uae_ReplyMsg (request); } else { if (log_scsi) write_log ("async request %08.8X\n", request); } uae_sem_post (&change_sem); } sys_command_close_thread (DF_SCSI, dev->unitnum); sys_command_close_thread (DF_IOCTL, dev->unitnum); return 0; }
static void *console_thread (void *v) { uae_set_thread_priority (2); for (;;) { TCHAR wc = 0; //console_getch (); char c[2] = { 0, 0 }; write_log (_T("*")); ua_copy (c, 1, &wc); record_key_direct ((0x10 << 1) | 0); record_key_direct ((0x10 << 1) | 1); } return NULL; }
static void *console_thread (void *v) { uae_set_thread_priority (NULL, 1); for (;;) { TCHAR wc = console_getch (); char c[2]; write_log (L"*"); c[0] = 0; c[1] = 0; ua_copy (c, 1, &wc); record_key_direct ((0x10 << 1) | 0); record_key_direct ((0x10 << 1) | 1); } }
static void *uaenet_trap_threadw (void *arg) { struct uaenetdata *sd = (struct uaenetdata*)arg; uae_set_thread_priority (1); sd->threadactivew = 1; uae_sem_post (&sd->sync_semw); while (sd->threadactivew == 1) { int32_t towrite = sd->mtu; uae_sem_wait (&sd->change_sem); if (sd->getfunc (sd->user, sd->writebuffer, &towrite)) { pcap_sendpacket (sd->fp, sd->writebuffer, towrite); } uae_sem_post (&sd->change_sem); } sd->threadactivew = 0; uae_sem_post (&sd->sync_semw); return 0; }
/* * Thread body for trap context */ static void *trap_thread (void *arg) { ExtendedTrapContext *context = (ExtendedTrapContext *) arg; uae_set_thread_priority (2); /* Wait until main thread is ready to switch to the * this trap context. */ uae_sem_wait (&context->switch_to_trap_sem); /* Execute trap handler function. */ context->trap_retval = context->trap_handler ((TrapContext *)context); /* Trap handler is done - we still need to tidy up * and make sure the handler's return value is propagated * to the calling 68k thread. * * We do this by causing our exit handler to be executed on the 68k context. */ /* Enter critical section - only one trap at a time, please! */ uae_sem_wait (&trap_mutex); /* Don't allow an interrupt and thus potentially another * trap to be invoked while we hold the above mutex. * This is probably just being paranoid. */ context->regs.intmask = 7; /* Set PC to address of the exit handler, so that it will be called * when the 68k context resumes. */ m68k_setpc (&context->regs, exit_trap_trapaddr); current_context = context; /* Switch back to 68k context */ uae_sem_post (&context->switch_to_emu_sem); /* Good bye, cruel world... */ /* dummy return value */ write_log("trap_thread: exit (arg=0x%08X)\n", arg); return 0; }
static void *uaenet_trap_threadw (void *arg) { struct uaenetdatawin32 *sd = (struct uaenetdatawin32*)arg; uae_set_thread_priority (NULL, 1); sd->threadactivew = 1; uae_sem_post (&sd->sync_semw); while (sd->threadactivew == 1) { int donotwait = 0; int towrite = sd->mtu; uae_sem_wait (&sd->change_sem); if (sd->getfunc ((struct s2devstruct*)sd->user, sd->writebuffer, &towrite)) { pcap_sendpacket (sd->fp, sd->writebuffer, towrite); donotwait = 1; } uae_sem_post (&sd->change_sem); if (!donotwait) WaitForSingleObject (sd->evttw, INFINITE); } sd->threadactivew = 0; uae_sem_post (&sd->sync_semw); return 0; }
static void *uaenet_trap_thread (void *arg) { struct uaenetdatawin32 *sd = arg; HANDLE handles[4]; int cnt, towrite; int readactive, writeactive; DWORD actual; uae_set_thread_priority (NULL, 2); sd->threadactive = 1; uae_sem_post (&sd->sync_sem); readactive = 0; writeactive = 0; while (sd->threadactive == 1) { int donotwait = 0; uae_sem_wait (&sd->change_sem); if (readactive) { if (GetOverlappedResult (sd->hCom, &sd->olr, &actual, FALSE)) { readactive = 0; uaenet_gotdata (sd->user, sd->readbuffer, actual); donotwait = 1; } } if (writeactive) { if (GetOverlappedResult (sd->hCom, &sd->olw, &actual, FALSE)) { writeactive = 0; donotwait = 1; } } if (!readactive) { if (!ReadFile (sd->hCom, sd->readbuffer, sd->mtu, &actual, &sd->olr)) { DWORD err = GetLastError(); if (err == ERROR_IO_PENDING) readactive = 1; } else { uaenet_gotdata (sd->user, sd->readbuffer, actual); donotwait = 1; } } towrite = 0; if (!writeactive && uaenet_getdata (sd->user, sd->writebuffer, &towrite)) { donotwait = 1; if (!WriteFile (sd->hCom, sd->writebuffer, towrite, &actual, &sd->olw)) { DWORD err = GetLastError(); if (err == ERROR_IO_PENDING) writeactive = 1; } } uae_sem_post (&sd->change_sem); if (!donotwait) { cnt = 0; handles[cnt++] = sd->evtt; if (readactive) handles[cnt++] = sd->olr.hEvent; if (writeactive) handles[cnt++] = sd->olw.hEvent; WaitForMultipleObjects(cnt, handles, FALSE, INFINITE); } } sd->threadactive = 0; uae_sem_post (&sd->sync_sem); return 0; }