void petabricks::CodeGenerator::beginClass(const std::string& name, const std::string& base){ hos() << "class " << name << " : public " << base << " {\n"; hos() << (" typedef "+base+" BASE;\n") << (" typedef "+name+" CLASS;\n") << "public:\n"; _curClass=name; _contCounter=0; JASSERT(_curMembers.empty())(_curMembers.size()); }
std::ostream& HTTPClientSession::sendRequest(HTTPRequest& request) { delete _pResponseStream; _pResponseStream = 0; bool keepAlive = getKeepAlive(); if ((connected() && !keepAlive) || mustReconnect()) { close(); _mustReconnect = false; } try { if (!connected()) reconnect(); if (!keepAlive) request.setKeepAlive(false); if (!request.has(HTTPRequest::HOST)) request.setHost(_host, _port); if (!_proxyHost.empty()) { request.setURI(proxyRequestPrefix() + request.getURI()); proxyAuthenticate(request); } _reconnect = keepAlive; _expectResponseBody = request.getMethod() != HTTPRequest::HTTP_HEAD; if (request.getChunkedTransferEncoding()) { HTTPHeaderOutputStream hos(*this); request.write(hos); _pRequestStream = new HTTPChunkedOutputStream(*this); } else if (request.getContentLength() != HTTPMessage::UNKNOWN_CONTENT_LENGTH) { Poco::CountingOutputStream cs; request.write(cs); _pRequestStream = new HTTPFixedLengthOutputStream(*this, request.getContentLength() + cs.chars()); request.write(*_pRequestStream); } else if (request.getMethod() != HTTPRequest::HTTP_PUT && request.getMethod() != HTTPRequest::HTTP_POST) { Poco::CountingOutputStream cs; request.write(cs); _pRequestStream = new HTTPFixedLengthOutputStream(*this, cs.chars()); request.write(*_pRequestStream); } else { _pRequestStream = new HTTPOutputStream(*this); request.write(*_pRequestStream); } _lastRequest.update(); return *_pRequestStream; } catch (Exception&) { close(); throw; } }
void petabricks::CodeGenerator::endClass(){ const char* delim=""; indent(); os() << _curClass << "::" << _curClass << "("; hos() << _curClass << "("; for(ClassMembers::const_iterator i=_curMembers.begin(); i!=_curMembers.end(); ++i){ if(i->initializer == ClassMember::PASSED()){ os() << delim << _typeToConstRef(i->type) <<" t_"<<i->name; hos() << delim << _typeToConstRef(i->type) <<" t_"<<i->name; delim=", "; } } os() << ")\n"; hos() << ");\n"; indent(); os() << " : BASE()"; for(ClassMembers::const_iterator i=_curMembers.begin(); i!=_curMembers.end(); ++i){ if(i->initializer == ClassMember::PASSED()) os() << ", " << i->name<<"(t_"<<i->name<<")"; else if(i->initializer.size()>0) os() << ", " << i->name<<"("<<i->initializer<<")"; } newline(); write("{"+_curConstructorBody+"}"); _curConstructorBody=""; hos() << "//private:\n"; for(ClassMembers::const_iterator i=_curMembers.begin(); i!=_curMembers.end(); ++i){ hos() << " " << i->type << " " << i->name <<";\n"; } _curMembers.clear(); _curClass=""; hos() << "};\n\n"; newline(); newline(); }
void petabricks::CodeGenerator::beginFunc(const std::string& rt, const std::string& func, const std::vector<std::string>& args, bool is_static){ indent(); os() << rt << " "; if(inClass()) os() << _curClass << "::"; os() << func << '('; jalib::JPrintable::printStlList(os(), args.begin(), args.end(), ", "); os() << "){\n"; _indent++; if(inClass()) hos() << " "; if(is_static) hos() << "static "; hos() << rt << " " << func << '('; jalib::JPrintable::printStlList(hos(), args.begin(), args.end(), ", "); hos() << ");\n"; if(!inClass()) hos() << "\n"; }
void petabricks::CodeGenerator::generateMigrationFunctions(){ CodeGenerator& in = forkhelper(); CodeGenerator& out = forkhelper(); CodeGenerator& size = forkhelper(); CodeGenerator& migrateRegion = forkhelper(); CodeGenerator& getDataHosts = forkhelper(); std::vector<std::string> args; args.push_back("char* _buf"); args.push_back("RemoteHost& _host"); size.beginFunc("size_t", "serialSize"); out.beginFunc("void", "serialize", args); args[0] = "const char* _buf"; in.beginFunc("void", "unserialize", args); size.write("size_t _sz = 0;"); std::vector<std::string> args2; args2.push_back("RemoteHost& sender"); migrateRegion.beginFunc("void", "migrateRegions", args2); std::vector<std::string> args3; args3.push_back("DataHostPidList& list"); getDataHosts.beginFunc("void", "getDataHosts", args3); for(ClassMembers::const_iterator i=_curMembers.begin(); i!=_curMembers.end(); ++i){ if(jalib::StartsWith(i->type, "distributed::")) { out.write(i->name + ".serialize(_buf, _host);"); out.write("_buf += " + i->name + ".serialSize();"); in.write(i->name + ".unserialize(_buf, _host);"); in.write("_buf += " + i->name + ".serialSize();"); size.write("_sz += " + i->name + ".serialSize();"); migrateRegion.comment(i->name + ".updateHandlerChain();"); getDataHosts.write(i->name + ".dataHosts(list);"); }else if(i->type == "IndexT" || i->type == "int" || i->type == "double") { out.write("*reinterpret_cast<"+i->type+"*>(_buf) = "+i->name+";"); in.write(i->name+" = *reinterpret_cast<const "+i->type+"*>(_buf);"); size.write("_sz += sizeof("+i->type+");"); in .write("_buf += sizeof("+i->type+");"); out .write("_buf += sizeof("+i->type+");"); }else if(jalib::StartsWith(i->type, "std::vector<")) { out.write("_serialize_vector(_buf, "+i->name+");"); in.write("_unserialize_vector(_buf, "+i->name+");"); size.write("_sz += _serialSize_vector("+i->name+");"); }else if(i->type == "DynamicTaskPtr") { if(i->initializer != "") { in.write(i->name+" = "+i->initializer+";"); } }else{ JASSERT(false)(i->type).Text("cant yet serialize type"); } } size.write("return _sz;"); in.write("_sender = &_host;"); in.endFunc(); out.endFunc(); size.endFunc(); migrateRegion.endFunc(); getDataHosts.endFunc(); hos() << _curClass << "(const char*, RemoteHost&, bool=false);\n"; os() << _curClass << "::" << _curClass << "(const char* _buf, RemoteHost& _host, bool shouldInit){\n"; incIndent(); write("unserialize(_buf, _host);"); beginIf("shouldInit"); write(_curConstructorBody); endIf(); decIndent(); os() << "\n}\n"; beginFunc(_curClass+"*", "_new_constructor", std::vector<std::string>(1,"const char* _buf, RemoteHost& _host"), true); write("return new "+_curClass+"(_buf, _host);"); endFunc(); beginFunc("RemoteObjectGenerator", "generator"); write("return &RemoteTaskReciever<"+_curClass+">::gen;"); endFunc(); }