void process_block( job_t *job) { const uint8_t *header_begin = job->header_begin; const uint8_t *header_end = job->header_end; const uint8_t *body_begin = job->body_begin; const uint8_t *body_end = job->body_end; const lookup_t *lookup = job->lookup; pthread_mutex_t *io_mutex = job->io_mutex; pthread_cond_t *condition = &job->condition; uint8_t *buffer = job->buffer; size_t size = reverse_complement( body_begin, body_end, lookup, buffer); pthread_mutex_lock(io_mutex); if (job->prev_job) { if (!job->prev_job->finished) { pthread_cond_wait( &job->prev_job->condition, io_mutex); } } if (header_begin && header_end) { persistent_write( STDOUT, header_begin, header_end - header_begin); } persistent_write(STDOUT, buffer, size); job->finished = 1; pthread_cond_signal(condition); pthread_mutex_unlock(io_mutex); }
static void setting_save_to_storage(e_settings_available setting) { uint16_t crc; uint8_t byte = 0U; uint16_t addr = PERSISTENT_DATA_START + ((uint16_t)setting * 6U); bool to_write = false; to_write |= setting_has_property(setting, SETTING_STATE_CHANGED); to_write |= (setting_has_property(setting, SETTING_STATE_VALID) == false) ? true : false; if (to_write == true) { /* changed, save it and compute the CRC value */ persistent_write(addr++, setting_list[setting].u_setting_value.byte_array[byte++]); persistent_write(addr++, setting_list[setting].u_setting_value.byte_array[byte++]); persistent_write(addr++, setting_list[setting].u_setting_value.byte_array[byte++]); persistent_write(addr++, setting_list[setting].u_setting_value.byte_array[byte++]); /* Compute the CRC */ crc = setting_compute_crc(setting); /* write the CRC */ persistent_write(addr++, crc & 0xFF); persistent_write(addr++, (crc >> 8) & 0xFF); }
void persistent_write (url dir, string key, string val, url file, unsigned int code) { string v= local_prefix (dir) * key; if (is_directory (file)) { persistent_update_key (dir, key, file, code); persistent_write (dir, key, val, persistent_file [v], persistent_hash [v]); } else { hashmap<string,string> map (""); if (is_regular (file)) map= persistent_read_map (file); map (key)= val; if (code == 0 || (N (map) <= MAX_INNER && total_size (map) <= MAX_SIZE)) persistent_write_map (file, map); else { remove (file); mkdir (file); iterator<string> it= iterate (map); while (it->busy ()) { string skey= it->next (); string sval= map [skey]; string sv = local_prefix (dir) * skey; unsigned int scode= persistent_hash [sv]; persistent_write (dir, skey, sval, file, scode); } } } }
static void loaded_msg_write(loaded_msg_t *lm) { char *data = htsmsg_json_serialize_to_str(lm->lm_msg, 1); persistent_write("settings", lm->lm_key, data, strlen(data)); free(data); }
void persistent_set (url dir, string key, string val) { string v= local_prefix (dir) * key; persistent_init_key (dir, key); persistent_write (dir, key, val, persistent_file [v], persistent_hash [v]); persistent_has (v)= true; persistent_cache (v)= val; }
/** store settings marked as persistent to flash * @return 0 on success */ int32_t settings_store(void) { #if USE_PERSISTENT_SETTINGS if (settings_store_flag) { /* from generated/settings.h */ persistent_settings_store(); if (!persistent_write((uint32_t)&pers_settings, sizeof(struct PersistentSettings))) { /* persistent write was successful */ settings_store_flag = TRUE; return 0; } } #endif settings_store_flag = FALSE; return -1; }
void settings_store(void) { #if USE_PERSISTENT_SETTINGS persistent_settings_store(); persistent_write((uint32_t)&pers_settings, sizeof(struct PersistentSettings)); #endif }