/* check all monitored ranges, and log changes */ void write_mem_range(size_t start, size_t end) { write_record_type(fd, RTYPE_RANGE_DATA); (void)write(fd, &start, sizeof(size_t)); (void)write(fd, &end, sizeof(size_t)); (void)write(fd, (void*)start, end - start); }
flightrec_status log_comment(const char *data, size_t size) { pthread_mutex_lock(&mutex); write_record_type(fd, RTYPE_COMMENT); (void)write(fd, &size, sizeof(size_t)); (void)write(fd, data, size); pthread_mutex_unlock(&mutex); return FDR_OK; }
flightrec_status add_monitored_range(size_t addr_start, size_t addr_end) { pthread_mutex_lock(&mutex); std::pair<MemIntervalSet::iterator, bool> rv = persistent.insert(MemInterval(addr_start, addr_end)); if(rv.second) { write_record_type(fd, RTYPE_ADD_UPDATED_RANGE); write(fd, &addr_start, sizeof(size_t)); write(fd, &addr_end, sizeof(size_t)); } pthread_mutex_unlock(&mutex); return rv.second ? FDR_OK : FDR_OVERLAP; }
flightrec_status remove_monitored_range(size_t addr_start, size_t addr_end) { pthread_mutex_lock(&mutex); // XXX currently assumes a complete match, partial munmaps are not supported size_t ret = persistent.erase(MemInterval(addr_start, addr_end)); if(ret) { write_record_type(fd, RTYPE_REMOVE_UPDATED_RANGE); (void)write(fd, &addr_start, sizeof(size_t)); (void)write(fd, &addr_end, sizeof(size_t)); } pthread_mutex_unlock(&mutex); return ret ? FDR_OK : FDR_NOT_FOUND; }
flightrec_status log_event(Event *context) { /* count parameters */ uint32_t num_parameters = context->parameters.size(); pthread_mutex_lock(&mutex); /* log updates to monitored ranges */ check_monitored_ranges(); /* log temp ranges */ for(MemIntervalSet::const_iterator i=context->temp.begin(); i!=context->temp.end(); ++i) { write_record_type(fd, RTYPE_RANGE_TEMP_DATA); (void)write(fd, &i->start, sizeof(size_t)); (void)write(fd, &i->end, sizeof(size_t)); (void)write(fd, (void*)i->start, i->end - i->start); } write_record_type(fd, RTYPE_EVENT); uint8_t name_len = strlen(context->event_type); (void)write(fd, &name_len, sizeof(uint8_t)); (void)write(fd, context->event_type, name_len); /* log parameters */ (void)write(fd, &num_parameters, sizeof(uint32_t)); for(size_t i=0; i<num_parameters; ++i) { uint8_t name_len = strlen(context->parameters[i].name); (void)write(fd, &name_len, sizeof(uint8_t)); (void)write(fd, context->parameters[i].name, name_len); (void)write(fd, &context->parameters[i].value, sizeof(size_t)); } delete context; pthread_mutex_unlock(&mutex); return FDR_OK; }