From c517fd305a42963187396880747a7da82867ff86 Mon Sep 17 00:00:00 2001 From: ultramage Date: Fri, 13 Nov 2009 21:06:21 +0000 Subject: [PATCH] Resolved a client hang in the scenario where the client sent loadendack before the server finished loading all data (bugreport:3700). Improved the performance of pc_autosave() to stop scanning players after it has already found the player it wanted to save (bugreport:3717). The 'overweight' status changes (SC_WEIGHT50/SC_WEIGHT90) will now be cleared on logout, to avoid saving them into the database (they get derived from player weight during login anyway). Improved lock.c on windows to use C's access(0) function instead of doing fopen/fclose when testing for existence of files. Re-added the 'static' attribute to mapindex_getmapname_ext's buffer; returning the address of a non-static local variable is undefined behavior (see r13901). git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14144 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/common/lock.c | 16 +++------------- src/common/mapindex.c | 2 +- src/map/clif.c | 22 ++++++++++++++-------- src/map/map.c | 4 ++++ src/map/pc.c | 3 ++- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/common/lock.c b/src/common/lock.c index e4ec363024..5cb4c3a679 100644 --- a/src/common/lock.c +++ b/src/common/lock.c @@ -11,21 +11,12 @@ #ifndef WIN32 #include #else -#include +#include #define F_OK 0x0 #define R_OK 0x4 #endif -#ifndef WIN32 - #define exists(filename) (!access(filename, F_OK)) -#else -// could be speed up maybe? -int exists(char *file) { - FILE *fp; - if ((fp = fopen(file,"r")) && fclose(fp) == 0) return 1; - return 0; -} -#endif +#define exists(filename) (!access(filename, F_OK)) // 書き込みファイルの保護処理 // (書き込みが終わるまで、旧ファイルを保管しておく) @@ -33,13 +24,12 @@ int exists(char *file) { // 新しいファイルの書き込み開始 FILE* lock_fopen (const char* filename, int *info) { char newfile[512]; - FILE *fp; int no = 0; // 安全なファイル名を得る(手抜き) do { sprintf(newfile, "%s_%04d.tmp", filename, ++no); - } while((fp = fopen(newfile,"r")) && (fclose(fp), no < 9999)); + } while(exists(newfile) && no < 9999); *info = no; return fopen(newfile,"w"); } diff --git a/src/common/mapindex.c b/src/common/mapindex.c index ca2ff47510..a1c86af979 100644 --- a/src/common/mapindex.c +++ b/src/common/mapindex.c @@ -47,7 +47,7 @@ const char* mapindex_getmapname(const char* string, char* output) /// Result gets placed either into 'buf' or in a static local buffer. const char* mapindex_getmapname_ext(const char* string, char* output) { - char buf[MAP_NAME_LENGTH_EXT]; + static char buf[MAP_NAME_LENGTH_EXT]; char* dest = (output != NULL) ? output : buf; size_t len; diff --git a/src/map/clif.c b/src/map/clif.c index ed9f12c722..2eb6147806 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -13416,15 +13416,21 @@ int clif_parse(int fd) if ((int)RFIFOREST(fd) < packet_len) return 0; // not enough data received to form the packet - if (packet_db[packet_ver][cmd].func) { - if (sd && sd->bl.prev == NULL && packet_db[packet_ver][cmd].func != clif_parse_LoadEndAck) - ; //Only valid packet when player is not on a map is the finish-loading packet. + if( packet_db[packet_ver][cmd].func == clif_parse_debug ) + packet_db[packet_ver][cmd].func(fd, sd); + else + if( packet_db[packet_ver][cmd].func != NULL ) + { + if( !sd && packet_db[packet_ver][cmd].func != clif_parse_WantToConnection ) + ; //Only valid packet when there is no session else - if ((sd && sd->state.active) - || packet_db[packet_ver][cmd].func == clif_parse_WantToConnection - || packet_db[packet_ver][cmd].func == clif_parse_debug - ) //Only execute the function when there's an active sd (except for debug/wanttoconnect packets) - packet_db[packet_ver][cmd].func(fd, sd); + if( sd && sd->bl.prev == NULL && packet_db[packet_ver][cmd].func != clif_parse_LoadEndAck ) + ; //Only valid packet when player is not on a map + else + if( sd && session[sd->fd]->flag.eof ) + ; //No more packets accepted + else + packet_db[packet_ver][cmd].func(fd, sd); } #if DUMP_UNKNOWN_PACKET else if (battle_config.error_log) diff --git a/src/map/map.c b/src/map/map.c index 8a845c4bea..7488a5a153 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1600,6 +1600,10 @@ int map_quit(struct map_session_data *sd) status_change_end(&sd->bl,SC_GUILDAURA,-1); if(sd->sc.data[SC_ENDURE] && sd->sc.data[SC_ENDURE]->val4) status_change_end(&sd->bl,SC_ENDURE,-1); //No need to save infinite endure. + if(sd->sc.data[SC_WEIGHT50]) + status_change_end(&sd->bl,SC_WEIGHT50,-1); + if(sd->sc.data[SC_WEIGHT90]) + status_change_end(&sd->bl,SC_WEIGHT90,-1); if (battle_config.debuff_on_logout&1) { if(sd->sc.data[SC_ORCISH]) status_change_end(&sd->bl,SC_ORCISH,-1); diff --git a/src/map/pc.c b/src/map/pc.c index 72663a5b0d..5d94a1942c 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1086,7 +1086,7 @@ int pc_reg_received(struct map_session_data *sd) intif_request_questlog(sd); #endif - if (!sd->state.connect_new && sd->fd) + if (sd->state.connect_new == 0 && sd->fd) { //Character already loaded map! Gotta trigger LoadEndAck manually. sd->state.connect_new = 1; clif_parse_LoadEndAck(sd->fd, sd); @@ -7467,6 +7467,7 @@ int pc_autosave(int tid, unsigned int tick, int id, intptr data) save_flag = 2; chrif_save(sd,0); + break; } mapit_free(iter);