diff options
-rw-r--r-- | include/bbs.h | 1 | ||||
-rw-r--r-- | include/pttstruct.h | 5 | ||||
-rw-r--r-- | include/statistic.h | 36 | ||||
-rw-r--r-- | mbbsd/bbs.c | 3 | ||||
-rw-r--r-- | mbbsd/cache.c | 1 | ||||
-rw-r--r-- | mbbsd/edit.c | 1 | ||||
-rw-r--r-- | mbbsd/gamble.c | 1 | ||||
-rw-r--r-- | mbbsd/io.c | 4 | ||||
-rw-r--r-- | mbbsd/mail.c | 1 | ||||
-rw-r--r-- | mbbsd/mbbsd.c | 7 | ||||
-rw-r--r-- | mbbsd/more.c | 1 | ||||
-rw-r--r-- | mbbsd/read.c | 2 | ||||
-rw-r--r-- | mbbsd/talk.c | 7 | ||||
-rw-r--r-- | util/shmctl.c | 44 |
14 files changed, 112 insertions, 2 deletions
diff --git a/include/bbs.h b/include/bbs.h index fb65c3e0..34a878b0 100644 --- a/include/bbs.h +++ b/include/bbs.h @@ -44,6 +44,7 @@ typedef uint32_t time4_t; #else typedef time_t time4_t; #endif +#include "statistic.h" #include "pttstruct.h" #include "fav.h" #include "common.h" diff --git a/include/pttstruct.h b/include/pttstruct.h index 23fda808..5bcf81f3 100644 --- a/include/pttstruct.h +++ b/include/pttstruct.h @@ -542,7 +542,7 @@ typedef struct { /* SHM 中的全域變數, 可用 shmctl 設定或顯示. 供動態調整或測試使用 */ union { - int v[1024]; + int v[512]; struct { int dymaxactive; /* 動態設定最大人數上限 */ int toomanyusers; /* 超過人數上限不給進的個數 */ @@ -551,9 +551,12 @@ typedef struct { time4_t now; #endif int nWelcomes; + /* 注意, 應保持 align sizeof(int) */ } e; } GV2; + /* statistic */ + int statistic[STAT_MAX]; /* 故鄉 fromcache */ unsigned int home_ip[MAX_FROM]; diff --git a/include/statistic.h b/include/statistic.h new file mode 100644 index 00000000..e2e6b61b --- /dev/null +++ b/include/statistic.h @@ -0,0 +1,36 @@ +#ifndef _STATISTIC_H_ +#define _STATISTIC_H_ +#define STAT(X, OP) do { \ + if(SHM && SHM->version==SHM_VERSION && 0<=(X) && (X)<STAT_MAX) \ + SHM->statistic[X] OP; \ +} while(0) +#define STATINC(X) STAT(X, ++) + +enum { // XXX description in shmctl.c + STAT_LOGIN, + STAT_SHELLLOGIN, + STAT_VEDIT, + STAT_TALKREQUEST, + STAT_WRITEREQUEST, + STAT_MORE, + STAT_SYSWRITESOCKET, + STAT_SYSSELECT, + STAT_SYSREADSOCKET, + STAT_DOSEND, + STAT_SEARCHUSER, + STAT_THREAD, + STAT_SELECTREAD, + STAT_QUERY, + STAT_DOTALK, + STAT_FRIENDDESC, + STAT_FRIENDDESC_FILE, + STAT_PICKMYFRIEND, + STAT_PICKBFRIEND, + STAT_GAMBLE, + STAT_DOPOST, + STAT_READPOST, + STAT_RECOMMEND, + STAT_NUM, + STAT_MAX=512 +}; +#endif diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index 7a8b98f7..13fe9e43 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -783,6 +783,7 @@ int do_post(void) { boardheader_t *bp; + STATINC(STAT_DOPOST); bp = getbcache(currbid); if (bp->brdattr & BRD_VOTEBOARD) return do_voteboard(0); @@ -1150,6 +1151,7 @@ read_post(int ent, fileheader_t * fhdr, const char *direct) if (fhdr->owner[0] == '-') return READ_SKIP; + STATINC(STAT_READPOST); setdirpath(genbuf, direct, fhdr->filename); if ((more_result = more(genbuf, YEA)) == -1) @@ -1771,6 +1773,7 @@ recommend(int ent, fileheader_t * fhdr, const char *direct) getans("確定要\033[%s\033[m嗎? 請仔細考慮(Y/N)?[n]", ctype[type]) != 'y') return FULLUPDATE; + STATINC(STAT_RECOMMEND); #ifdef OLDRECOMMEND snprintf(buf, sizeof(buf), "\033[1;31m→ \033[33m%s\033[m\033[33m:%-*s\033[m" diff --git a/mbbsd/cache.c b/mbbsd/cache.c index d1771d49..703f0855 100644 --- a/mbbsd/cache.c +++ b/mbbsd/cache.c @@ -195,6 +195,7 @@ int searchuser(const char *userid, char *rightid) { int h, p, times; + STATINC(STAT_SEARCHUSER); h = StringHash(userid)%(1<<HASH_BITS); p = SHM->hash_head[h]; diff --git a/mbbsd/edit.c b/mbbsd/edit.c index 6ce46305..7316643e 100644 --- a/mbbsd/edit.c +++ b/mbbsd/edit.c @@ -2431,6 +2431,7 @@ vedit(char *fpath, int saveheader, int *islocal) textline_t *oldcurrline; char trans_buffer[256]; + STATINC(STAT_VEDIT); currutmp->mode = EDITING; currutmp->destuid = currstat; diff --git a/mbbsd/gamble.c b/mbbsd/gamble.c index 447c7102..3889577a 100644 --- a/mbbsd/gamble.c +++ b/mbbsd/gamble.c @@ -143,6 +143,7 @@ ticket(int bid) char betname[MAX_ITEM][MAX_ITEM_LEN]; boardheader_t *bh = NULL; + STATINC(STAT_GAMBLE); if (bid) { bh = getbcache(bid); setbpath(path, bh->brdname); @@ -32,6 +32,7 @@ void oflush(void) { if (obufsize) { + STATINC(STAT_SYSWRITESOCKET); #ifdef CONVERT write_wrapper(1, outbuf, obufsize); #else @@ -54,6 +55,7 @@ output(const char *s, int len) assert(len<OBUFSIZE); if (obufsize + len > OBUFSIZE) { + STATINC(STAT_SYSWRITESOCKET); #ifdef CONVERT write_wrapper(1, outbuf, obufsize); #else @@ -138,6 +140,7 @@ dogetch(void) /* jochang: modify first argument of select from FD_SETSIZE */ /* since we are only waiting input from fd 0 and i_newfd(>0) */ + STATINC(STAT_SYSSELECT); while ((len = select(i_newfd + 1, &readfds, NULL, NULL, i_top ? &timeout : NULL)) < 0) { if (errno != EINTR) @@ -172,6 +175,7 @@ dogetch(void) do{ #endif + STATINC(STAT_SYSREADSOCKET); #ifdef CONVERT while ((len = read_wrapper(0, inbuf, IBUFSIZE)) <= 0) { #else diff --git a/mbbsd/mail.c b/mbbsd/mail.c index e60f1df8..8e0c5d1c 100644 --- a/mbbsd/mail.c +++ b/mbbsd/mail.c @@ -225,6 +225,7 @@ do_send(const char *userid, const char *title) int internet_mail, i; userec_t xuser; + STATINC(STAT_DOSEND); if (strchr(userid, '@')) internet_mail = 1; else { diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index 84c26470..e8447a1f 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -230,6 +230,7 @@ mysrand(void) void talk_request(int sig) { + STATINC(STAT_TALKREQUEST); bell(); bell(); if (currutmp->msgcount) { @@ -363,6 +364,7 @@ write_request(int sig) { int i, msgcount; + STATINC(STAT_WRITEREQUEST); #ifdef NOKILLWATERBALL if( reentrant_write_request ) /* kill again by shmctl */ return; @@ -1058,6 +1060,7 @@ start_client(void) setrlimit(RLIMIT_CPU, &rml); #endif + STATINC(STAT_LOGIN); /* system init */ nice(2); /* Ptt: lower priority */ login_start_time = time(0); @@ -1333,11 +1336,15 @@ static int shell_login(int argc, char *argv[], char *envp[]) { + STATINC(STAT_SHELLLOGIN); /* Give up root privileges: no way back from here */ setgid(BBSGID); setuid(BBSUID); chdir(BBSHOME); +#if defined(linux) && defined(DEBUG) +// mtrace(); +#endif use_shell_login_mode = 1; initsetproctitle(argc, argv, envp); diff --git a/mbbsd/more.c b/mbbsd/more.c index 9ea28a40..10ca8a83 100644 --- a/mbbsd/more.c +++ b/mbbsd/more.c @@ -155,6 +155,7 @@ more(char *fpath, int promptend) struct MorePool mp; /* Ptt */ + STATINC(STAT_MORE); memset(pagebreak, 0, sizeof(pagebreak)); if (*search_str) search_char0 = *search_str; diff --git a/mbbsd/read.c b/mbbsd/read.c index 0d21d85d..4860a569 100644 --- a/mbbsd/read.c +++ b/mbbsd/read.c @@ -317,6 +317,7 @@ thread(const keeploc_t * locmem, int stypen) int step = (stypen & RS_FORWARD) ? 1 : -1; char *key; + STATINC(STAT_THREAD); if (stypen & RS_AUTHOR) key = headers[pos - locmem->top_ln].owner; else if (stypen & RS_CURRENT) @@ -394,6 +395,7 @@ select_read(const keeploc_t * locmem, int sr_mode) static int _mode = 0; int len, fd, fr, i, count=0, reference = 0; + STATINC(STAT_SELECTREAD); fileheader_t *fh = &headers[locmem->crs_ln - locmem->top_ln]; if(sr_mode & RS_AUTHOR) { diff --git a/mbbsd/talk.c b/mbbsd/talk.c index db2d3d35..53e2e061 100644 --- a/mbbsd/talk.c +++ b/mbbsd/talk.c @@ -388,6 +388,7 @@ my_query(const char *uident) MSG_LITTLE_BOY, MSG_LITTLE_GIRL, MSG_MAN, MSG_WOMAN, MSG_PLANT, MSG_MIME}; + STATINC(STAT_QUERY); if ((tuid = getuser(uident, &muser))) { move(1, 0); clrtobot(); @@ -1129,6 +1130,7 @@ do_talk(int fd) struct tm *ptime; char genbuf[200], fpath[100]; + STATINC(STAT_DOTALK); ptime = localtime4(&now); setuserfile(fpath, "talk_XXXXXX"); @@ -1619,11 +1621,13 @@ friend_descript(const userinfo_t * uentp, char *desc_buf, int desc_buflen) FILE *fp; char genbuf[STRLEN]; + STATINC(STAT_FRIENDDESC); if((set_friend_bit(currutmp,uentp)|IFH)==0) return space_buf; setuserfile(fpath, friend_file[0]); + STATINC(STAT_FRIENDDESC_FILE); if ((fp = fopen(fpath, "r"))) { snprintf(name, sizeof(name), "%s ", uentp->userid); len = strlen(name); @@ -1768,6 +1772,7 @@ pickup_myfriend(pickup_t * friends, userinfo_t *uentp; int i, where, frstate, ngets = 0; + STATINC(STAT_PICKMYFRIEND); *badfriend = 0; *myfriend = *friendme = 1; for (i = 0; currutmp->friend_online[i] && i < MAX_FRIEND; ++i) { @@ -1803,6 +1808,8 @@ pickup_bfriend(pickup_t * friends, int base) userinfo_t *uentp; int i, ngets = 0; int currsorted = SHM->currsorted, number = SHM->UTMPnumber; + + STATINC(STAT_PICKBFRIEND); friends = friends + base; for (i = 0; i < number && ngets < MAX_FRIEND - base; ++i) { uentp = &SHM->uinfo[SHM->sorted[currsorted][0][i]]; diff --git a/util/shmctl.c b/util/shmctl.c index cdd1ef56..411562d2 100644 --- a/util/shmctl.c +++ b/util/shmctl.c @@ -900,9 +900,50 @@ int testgap(int argc, char *argv[]) return 0; } +int showstat(int argc, char *argv[]) +{ + int i; + int flag_clear=0; + char *stat_desc[]={ + "STAT_LOGIN", + "STAT_SHELLLOGIN", + "STAT_VEDIT", + "STAT_TALKREQUEST", + "STAT_WRITEREQUEST", + "STAT_MORE", + "STAT_SYSWRITESOCKET", + "STAT_SYSSELECT", + "STAT_SYSREADSOCKET", + "STAT_DOSEND", + "STAT_SEARCHUSER", + "STAT_THREAD", + "STAT_SELECTREAD", + "STAT_QUERY", + "STAT_DOTALK", + "STAT_FRIENDDESC", + "STAT_FRIENDDESC_FILE", + "STAT_PICKMYFRIEND", + "STAT_PICKBFRIEND", + "STAT_GAMBLE", + "STAT_DOPOST", + "STAT_READPOST", + "STAT_RECOMMEND", + }; + + if(argv[1] && strcmp(argv[1],"-c")==0) + flag_clear=1; + for(i=0; i<STAT_NUM; i++) { + char *desc= i*sizeof(char*)<sizeof(stat_desc)?stat_desc[i]:"?"; + printf("%s:\t%s\n", desc, SHM->statistic[i]); + } + if(flag_clear) + memset(SHM->statistic, 0, sizeof(SHM->statistic)); + return 0; +} + int dummy(int argc, char *argv[]) { - return 0; + return 0; } struct { @@ -933,6 +974,7 @@ struct { {listbrd, "listbrd", "list board info in SHM"}, {hotboard, "hotboard", "list boards of most bfriends"}, {usermode, "usermode", "list #users in the same mode"}, + {showstat, "showstat", "show statistics"}, {testgap, "testgap", "test SHM->gap zeroness"}, {dummy, "\b\b\b\bMisc:", ""}, |