void FiberBase::start() { Isolate* isolate = holder(); set_caller(JSFiber::current()); isolate->m_jobs.put(this); Ref(); }
void ProtocolParser::worker(Caller& caller) { // Remember caller for use in ByteStreamReader's methods set_caller(caller); // Buffer to read strings from const int buffer_len = RESPStream::STRING_LENGTH_MAX; Byte buffer[buffer_len] = {}; int bytes_read = 0; // Data to read std::string sid; aku_Sample sample; // try { RESPStream stream(this); while(true) { // read id auto next = stream.next_type(); switch(next) { case RESPStream::AK_INTEGER: sample.paramid = stream.read_int(); break; case RESPStream::AK_STRING: bytes_read = stream.read_string(buffer, buffer_len); consumer_->series_to_param_id(buffer, bytes_read, &sample); break; case RESPStream::AK_BULK_STR: // Compressed chunk of data bytes_read = stream.read_bulkstr(buffer, buffer_len); consumer_->add_bulk_string(buffer, bytes_read); continue; default: // Bad frame { std::string msg; size_t pos; std::tie(msg, pos) = get_error_context("unexpected parameter id format"); BOOST_THROW_EXCEPTION(ProtocolParserError(msg, pos)); } }; // read ts next = stream.next_type(); switch(next) { case RESPStream::AK_INTEGER: sample.timestamp = stream.read_int(); break; case RESPStream::AK_STRING: bytes_read = stream.read_string(buffer, buffer_len); buffer[bytes_read] = '\0'; if (aku_parse_timestamp(buffer, &sample) == AKU_SUCCESS) { break; } default: { std::string msg; size_t pos; std::tie(msg, pos) = get_error_context("Unexpected parameter timestamp format"); BOOST_THROW_EXCEPTION(ProtocolParserError(msg, pos)); } }; // read value next = stream.next_type(); switch(next) { case RESPStream::AK_INTEGER: sample.payload.type = AKU_PAYLOAD_FLOAT; sample.payload.float64 = stream.read_int(); sample.payload.size = sizeof(aku_Sample); break; case RESPStream::AK_STRING: bytes_read = stream.read_string(buffer, buffer_len); buffer[bytes_read] = '\0'; sample.payload.type = AKU_PAYLOAD_FLOAT; sample.payload.float64 = strtod(buffer, nullptr); sample.payload.size = sizeof(aku_Sample); memset(buffer, 0, bytes_read); break; default: // Bad frame { std::string msg; size_t pos; std::tie(msg, pos) = get_error_context("Unexpected parameter value format"); BOOST_THROW_EXCEPTION(ProtocolParserError(msg, pos)); } }; consumer_->write(sample); } } catch(EStopIteration const&) { logger_.info() << "EStopIteration"; done_ = true; } }
void FiberBase::start() { set_caller(JSFiber::current()); g_jobs.put(this); Ref(); }
void Message::use_from_task(Task* task, size_t args) { set_caller(task->active()); set_args(args); stack_args_ = caller_->stack_back_position(args - 1); arguments_ = stack_args_; }
void ProtocolParser::worker(Caller& caller) { // Remember caller for use in ByteStreamReader's methods set_caller(caller); // Buffer to read strings from const int buffer_len = RESPStream::STRING_LENGTH_MAX; Byte buffer[buffer_len] = {}; int bytes_read = 0; // Data to read aku_ParamId id = 0; std::string sid; bool integer_id = false; aku_Timestamp ts = 0; double value =.0; // try { RESPStream stream(this); while(true) { // read id auto next = stream.next_type(); switch(next) { case RESPStream::INTEGER: id = stream.read_int(); integer_id = true; break; case RESPStream::STRING: bytes_read = stream.read_string(buffer, buffer_len); sid = std::string(buffer, buffer + bytes_read); integer_id = false; break; case RESPStream::BULK_STR: // Compressed chunk of data bytes_read = stream.read_bulkstr(buffer, buffer_len); consumer_->add_bulk_string(buffer, bytes_read); continue; default: // Bad frame { std::string msg; size_t pos; std::tie(msg, pos) = get_error_context("unexpected parameter id format"); BOOST_THROW_EXCEPTION(ProtocolParserError(msg, pos)); } }; // read ts next = stream.next_type(); switch(next) { case RESPStream::INTEGER: ts = stream.read_int(); break; case RESPStream::STRING: bytes_read = stream.read_string(buffer, buffer_len); // TODO: parse date-time { std::string msg; size_t pos; std::tie(msg, pos) = get_error_context("not implemented"); BOOST_THROW_EXCEPTION(ProtocolParserError(msg, pos)); } default: // Bad frame { std::string msg; size_t pos; std::tie(msg, pos) = get_error_context("Unexpected parameter timestamp format"); BOOST_THROW_EXCEPTION(ProtocolParserError(msg, pos)); } }; // read value next = stream.next_type(); switch(next) { case RESPStream::INTEGER: value = stream.read_int(); break; case RESPStream::STRING: bytes_read = stream.read_string(buffer, buffer_len); value = strtod(buffer, nullptr); memset(buffer, 0, bytes_read); break; default: // Bad frame { std::string msg; size_t pos; std::tie(msg, pos) = get_error_context("Unexpected parameter value format"); BOOST_THROW_EXCEPTION(ProtocolParserError(msg, pos)); } }; if (integer_id) { consumer_->write_double(id, ts, value); } else { // TODO: write blob BOOST_THROW_EXCEPTION(std::runtime_error("not implemented")); } } } catch(EStopIteration const&) { logger_.info() << "EStopIteration"; done_ = true; } }