static void process_events(void) { struct event* pos; struct timeval timeout; for (pos = g_event_list; pos != NULL; pos = event_get_next(pos)) { /* event timeout */ event_get_timeout(pos, &timeout); if (timeval_is_infinite(&timeout) == false) { timeval_sub_one_tick(&timeout); event_set_timeout(pos, &timeout); if (timeval_is_null(&timeout) == true) event_signal(pos); } /* event was signaled */ if (event_is_signaled(pos)) { event_signal_tasks(pos); event_clear_signal(pos); } } }
// Searching for either a NAND block or a sync point static int st_scanning(struct state *st) { int ret; union evt evt; hdr_count = 0; st->fdh->seek(0); qDebug() << "Counting headers...\n"; while(1) { int s = st->fdh->pos(); if (s == -1) { perror("Couldn't seek"); return 1; } ret = event_get_next(st, &evt); if (ret < 0) break; hdr_count++; hdrs = (struct small_hdr *)realloc(hdrs, hdr_count*sizeof(struct small_hdr)); hdrs[hdr_count-1].sec = evt.header.sec_start; hdrs[hdr_count-1].nsec = evt.header.nsec_start; hdrs[hdr_count-1].pos = s; } qDebug() << "Found" << hdr_count << "headers to sort"; sstate_set(st, ST_GROUPING); return 0; }
/* We're all done sorting. Write out the logfile. * Format: * Magic number 0x43 0x9f 0x22 0x53 * Number of elements * Array of absolute offsets from the start of the file * Magic number 0xa4 0xc3 0x2d 0xe5 * Array of events */ static int st_write(struct state *st) { int jump_offset; struct evt_file_header file_header; uint32_t offset; qDebug() << "Writing out..."; st->out_fdh->seek(0); offset = 0; // Write out the file header memset(&file_header, 0, sizeof(file_header)); memcpy(file_header.magic1, EVENT_HDR_1, strlen(EVENT_HDR_1)); file_header.version = _ntohl(1); file_header.count = _htonl(hdr_count); offset += st->out_fdh->write((char *)&file_header, sizeof(file_header)); // Advance the offset past the jump table offset += hdr_count*sizeof(offset); // Read in the jump table entries st->fdh->seek(0); for (jump_offset=0; jump_offset<hdr_count; jump_offset++) { union evt evt; uint32_t offset_swab = _htonl(offset); st->out_fdh->write((char *)&offset_swab, sizeof(offset_swab)); st->fdh->seek(hdrs[jump_offset].pos); memset(&evt, 0, sizeof(evt)); event_get_next(st, &evt); if (evt.header.size > 32768) return 1; offset += evt.header.size; } offset += st->out_fdh->write(EVENT_HDR_2, 4); // Now copy over the exact events for (jump_offset=0; jump_offset<hdr_count; jump_offset++) { union evt evt; st->fdh->seek(hdrs[jump_offset].pos); event_get_next(st, &evt); event_write(st, &evt); } sstate_set(st, ST_DONE); return 1; }