void connection::read_package_body_handler(std::shared_ptr<stream_buffer> buffer, const error_code& err, std::size_t bytes) { if (!check_error(err)) { return; } if (bytes == 0) { return; } std::unique_ptr<istream> stream { new istream(buffer) }; stream->response_dispatch.connect(create_dispatch_slot()); auto iter = _callbacks.find(stream->uid()); if (iter != _callbacks.end()) { callback cb = _callbacks[stream->uid()]; _callbacks.erase(iter); cb(std::move(stream)); } else { received(shared_from_this(), std::move(stream)); } wait_package(); }
static YogVal get_package(YogEnv* env, YogVM* vm, YogVal pkg) { YOG_ASSERT(env, PTR_AS(YogBasicObj, pkg)->flags & FLAG_PKG, "invalid package"); if (BASIC_OBJ_TYPE(pkg) == TYPE_IMPORTING_PKG) { ImportingPackage_lock(env, pkg); release_packages_lock(env, vm); wait_package(env, pkg); ImportingPackage_unlock(env, pkg); return PTR_AS(ImportingPackage, pkg)->pkg; } YOG_ASSERT(env, BASIC_OBJ_TYPE(pkg) == TYPE_PACKAGE, "Invalid package"); release_packages_lock(env, vm); return pkg; }
connection::connection(std::shared_ptr<socket> sckt) : _socket(sckt), _socket_locked(false), _uid_counter(0) { wait_package(); }