summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-03-19 21:02:47 +0800
committerkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-03-19 21:02:47 +0800
commit60b3015900838f0afbf3377fc3a75351be510cbe (patch)
tree4488111bc74655ed46406290bd982fa68c38a8d1
parent5fdde9d65d7664bcff62833304144a26b2f74e30 (diff)
downloadpttbbs-60b3015900838f0afbf3377fc3a75351be510cbe.tar
pttbbs-60b3015900838f0afbf3377fc3a75351be510cbe.tar.gz
pttbbs-60b3015900838f0afbf3377fc3a75351be510cbe.tar.bz2
pttbbs-60b3015900838f0afbf3377fc3a75351be510cbe.tar.lz
pttbbs-60b3015900838f0afbf3377fc3a75351be510cbe.tar.xz
pttbbs-60b3015900838f0afbf3377fc3a75351be510cbe.tar.zst
pttbbs-60b3015900838f0afbf3377fc3a75351be510cbe.zip
statistic
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2651 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--include/bbs.h1
-rw-r--r--include/pttstruct.h5
-rw-r--r--include/statistic.h36
-rw-r--r--mbbsd/bbs.c3
-rw-r--r--mbbsd/cache.c1
-rw-r--r--mbbsd/edit.c1
-rw-r--r--mbbsd/gamble.c1
-rw-r--r--mbbsd/io.c4
-rw-r--r--mbbsd/mail.c1
-rw-r--r--mbbsd/mbbsd.c7
-rw-r--r--mbbsd/more.c1
-rw-r--r--mbbsd/read.c2
-rw-r--r--mbbsd/talk.c7
-rw-r--r--util/shmctl.c44
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);
diff --git a/mbbsd/io.c b/mbbsd/io.c
index 94e2a849..7155eda9 100644
--- a/mbbsd/io.c
+++ b/mbbsd/io.c
@@ -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:", ""},