diff --git a/examples/IR/ir_web.cpp b/examples/IR/ir_web.cpp index a4a36cf7..776e87ea 100644 --- a/examples/IR/ir_web.cpp +++ b/examples/IR/ir_web.cpp @@ -197,7 +197,7 @@ extern U_EXPORT void runDynamicPage_ir_web(int param); usp_body_ir_web(); UHTTP::putDataSession(); - U_http_info.endHeader = 0; UHTTP::mime_index = U_html; + U_http_info.endHeader = 0; } } \ No newline at end of file diff --git a/include/ulib/json/value.h b/include/ulib/json/value.h index 7de5c4e3..ff4911b5 100644 --- a/include/ulib/json/value.h +++ b/include/ulib/json/value.h @@ -358,6 +358,9 @@ public: */ static uint32_t size_output; + static char* pstringify; // buffer to stringify json + + void stringify() const; UString output() const { @@ -606,7 +609,6 @@ protected: value; static UFlatBuffer* pfb; - static char* pstringify; // buffer to stringify json typedef struct parser_stack_data { uint64_t keys; @@ -776,7 +778,6 @@ protected: } } - void stringify() const; void prettify(uint32_t indent) const; void toFlatBufferFromJSON() const; @@ -2400,71 +2401,80 @@ public: # if defined(HAVE_CXX17) && !defined(__clang__) # include - -template class U_EXPORT UJsonTypeHandler > : public UJsonTypeHandler_Base { -public: - typedef std::unordered_map stringtobitmaskmap; - - explicit UJsonTypeHandler(stringtobitmaskmap& map) : UJsonTypeHandler_Base(&map) {} - - void clear() - { - U_TRACE_NO_PARAM(0, "UJsonTypeHandler::clear()") - - ((stringtobitmaskmap*)pval)->clear(); - } - - void toJSON(UString& json) - { - U_TRACE(0, "UJsonTypeHandler::toJSON(%V)", json.rep) - - stringtobitmaskmap* pmap = (stringtobitmaskmap*)pval; - - if (pmap->empty()) - { - char* ptr = json.pend(); - - u_put_unalignedp16(ptr, U_MULTICHAR_CONSTANT16('{','}')); - - json.rep->_length += 2; - } - else - { - json.__push('{'); - - // this is is C++17 vvv - for (const auto & [ key, value ] : *pmap) json.toJSON(key, UJsonTypeHandler(value)); - - json.setLastChar('}'); - } - - U_INTERNAL_DUMP("json(%u) = %V", json.size(), json.rep) - } - - void fromJSON(UValue& json) - { - U_TRACE(0, "UJsonTypeHandler::fromJSON(%p)", &json) - - U_ASSERT(((stringtobitmaskmap*)pval)->empty()) - - UValue* pelement = json.toNode(); - - while (pelement) - { - uint64_t pitem; - - UJsonTypeHandler(pitem).fromJSON(*pelement); - - UStringRep* rep = (UStringRep*)u_getPayload(pelement->pkey.ival); - - U_INTERNAL_DUMP("pelement->pkey(%p) = %V", rep, rep) - - ((stringtobitmaskmap*)pval)->insert_or_assign(rep, pitem); // insert_or_assign is C++17 - - pelement = pelement->next; - } - } -}; +# define PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(type, templateParameter, accessQualifier) \ + \ + template class U_EXPORT UJsonTypeHandler > : public UJsonTypeHandler_Base { \ + public: \ + typedef std::unordered_map ustringmap; \ + \ + explicit UJsonTypeHandler(ustringmap& map) : UJsonTypeHandler_Base(&map) {} \ + \ + void clear() \ + { \ + U_TRACE_NO_PARAM(0, "UJsonTypeHandler::clear()") \ + \ + ((ustringmap*)pval)->clear(); \ + } \ + \ + void toJSON(UString& json) \ + { \ + U_TRACE(0, "UJsonTypeHandler::toJSON(%p)", &json) \ + \ + ustringmap* pmap = (ustringmap*)pval; \ + \ + if (pmap->empty()) \ + { \ + char* ptr = json.pend(); \ + \ + u_put_unalignedp16(ptr, U_MULTICHAR_CONSTANT16('{','}')); \ + \ + json.rep->_length += 2; \ + } \ + else \ + { \ + json.__push('{'); \ + \ + for (auto & [ key, value ] : *pmap) json.toJSON(key, UJsonTypeHandler(value)); \ + \ + json.setLastChar('}'); \ + } \ + \ + U_INTERNAL_DUMP("json(%u) = %V", json.size(), json.rep) \ + } \ + \ + void fromJSON(UValue& json) \ + { \ + U_TRACE(0, "UJsonTypeHandler::fromJSON(%p)", &json) \ + \ + U_ASSERT(((ustringmap*)pval)->empty()) \ + \ + UValue* pelement = json.toNode(); \ + \ + while (pelement) \ + { \ + type pitem; \ + \ + UJsonTypeHandler(accessQualifier pitem).fromJSON(*pelement); \ + \ + UString key = UString((UStringRep*)u_getPayload(pelement->pkey.ival)); \ + \ + U_INTERNAL_DUMP("pelement->pkey(%p) = %V", key, key.rep) \ + \ + ((ustringmap*)pval)->insert_or_assign(key, pitem); \ + \ + pelement = pelement->next; \ + } \ + } \ + }; \ + +#define noPointer +#define yesPointer * +PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE( int64_t, , noPointer) +PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(uint64_t, , noPointer) +PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(T, class T, noPointer) +PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(T*, class T, yesPointer) +#undef noPointer +#undef yesPointer # endif #endif #endif diff --git a/include/ulib/orm/driver/orm_driver_mysql.h b/include/ulib/orm/driver/orm_driver_mysql.h index 330c1794..ca2d1796 100644 --- a/include/ulib/orm/driver/orm_driver_mysql.h +++ b/include/ulib/orm/driver/orm_driver_mysql.h @@ -21,7 +21,7 @@ extern "C" { } #ifndef U_MYSQL_STRING_SIZE -#define U_MYSQL_STRING_SIZE (8192-sizeof(USqlStatementBindResult)) +#define U_MYSQL_STRING_SIZE (4096-sizeof(USqlStatementBindResult)) #endif class U_EXPORT UMySqlStatementBindParam : public USqlStatementBindParam { diff --git a/src/ulib/net/server/client_image.cpp b/src/ulib/net/server/client_image.cpp index 0695d779..05a5f84e 100644 --- a/src/ulib/net/server/client_image.cpp +++ b/src/ulib/net/server/client_image.cpp @@ -1300,6 +1300,8 @@ data_missing: #if defined(U_SERVER_CAPTIVE_PORTAL) && defined(ENABLE_THREAD) if (UHTTP::checkForUSP()) U_RETURN(U_NOTIFIER_OK); + + if (U_ClientImage_parallelization == U_PARALLELIZATION_PARENT) U_RETURN(U_NOTIFIER_DELETE); #endif size_request = 0; @@ -1585,7 +1587,7 @@ end: if (U_ClientImage_parallelization == U_PARALLELIZATION_CHILD) goto death; } death: - UServer_Base::endNewChild(); // no return; + UServer_Base::endNewChild(); // no return } last_event = u_now->tv_sec; diff --git a/src/ulib/net/server/plugin/usp/cached_worlds.usp b/src/ulib/net/server/plugin/usp/cached_worlds.usp index 8694ad53..aa9025ba 100644 --- a/src/ulib/net/server/plugin/usp/cached_worlds.usp +++ b/src/ulib/net/server/plugin/usp/cached_worlds.usp @@ -7,15 +7,6 @@ TechEmpower Web Framework Benchmarks static UCache* cache; -static void handlerQuery(uint32_t i) -{ - U_TRACE(5, "::handlerQuery(%u)", i) - - U_INTERNAL_ASSERT_POINTER(cache) - - World::rnum = cache->getNumber(World::rnumber[i]); -} - static void usp_init_cached_worlds() { U_TRACE(5, "::usp_init_cached_worlds()") @@ -49,17 +40,16 @@ static void usp_init_cached_worlds() World::handlerFork(); } -#ifdef DEBUG -static void usp_end_cached_worlds() +static void handlerQuery(uint32_t i) { - U_TRACE(5, "::usp_end_cached_worlds()") + U_TRACE(5, "::handlerQuery(%u)", i) - if (cache) U_DELETE(cache) + U_INTERNAL_ASSERT_POINTER(cache) + + World::rnum = cache->getNumber(World::rnumber[i]); } -#endif --> diff --git a/src/ulib/net/server/plugin/usp/libWorld.cxx b/src/ulib/net/server/plugin/usp/libWorld.cxx index 4c29d78a..8a2b380b 100644 --- a/src/ulib/net/server/plugin/usp/libWorld.cxx +++ b/src/ulib/net/server/plugin/usp/libWorld.cxx @@ -2,6 +2,7 @@ #include "world.h" +char World::wbuffer[18000]; char* World::pwbuffer; World* World::pworld_query; uint32_t World::rnum; diff --git a/src/ulib/net/server/plugin/usp/mdb.usp b/src/ulib/net/server/plugin/usp/mdb.usp index 4655af24..ffc16cd5 100644 --- a/src/ulib/net/server/plugin/usp/mdb.usp +++ b/src/ulib/net/server/plugin/usp/mdb.usp @@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks #include "worldNoSql.h" static void usp_fork_mdb() { WorldNoSql::handlerForkMongoDB(); } - -#ifdef DEBUG -static void usp_end_mdb() { WorldNoSql::handlerEndMongoDB(); } -#endif --> Fortune::doQuery(FortuneNoSql::handlerQueryREDIS); --> diff --git a/src/ulib/net/server/plugin/usp/rquery.usp b/src/ulib/net/server/plugin/usp/rquery.usp index a54c4be3..7173c2db 100644 --- a/src/ulib/net/server/plugin/usp/rquery.usp +++ b/src/ulib/net/server/plugin/usp/rquery.usp @@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks #include "worldNoSql.h" static void usp_fork_rquery() { WorldNoSql::handlerForkREDIS(); } - -#ifdef DEBUG -static void usp_end_rquery() { WorldNoSql::handlerEndREDIS(); } -#endif --> + diff --git a/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/libWorld.cxx b/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/libWorld.cxx index 56ed1659..fb9e167b 100644 --- a/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/libWorld.cxx +++ b/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/libWorld.cxx @@ -2,6 +2,7 @@ #include "world.h" +char World::wbuffer[18000]; char* World::pwbuffer; World* World::pworld_query; uint32_t World::rnum; diff --git a/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/mdb.usp b/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/mdb.usp index 4655af24..ffc16cd5 100644 --- a/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/mdb.usp +++ b/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/mdb.usp @@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks #include "worldNoSql.h" static void usp_fork_mdb() { WorldNoSql::handlerForkMongoDB(); } - -#ifdef DEBUG -static void usp_end_mdb() { WorldNoSql::handlerEndMongoDB(); } -#endif --> Fortune::doQuery(FortuneNoSql::handlerQueryREDIS); --> diff --git a/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/rquery.usp b/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/rquery.usp index a54c4be3..7173c2db 100644 --- a/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/rquery.usp +++ b/tests/examples/benchmark/FrameworkBenchmarks/ULib/src/rquery.usp @@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks #include "worldNoSql.h" static void usp_fork_rquery() { WorldNoSql::handlerForkREDIS(); } - -#ifdef DEBUG -static void usp_end_rquery() { WorldNoSql::handlerEndREDIS(); } -#endif --> +