作者amaki.bbs@luna.twbbs.org (午覺羊) 看板: plan
標題[修改]把.USR放入shm裡
時間月下夜想 (2003/12/15 Mon 21:57:24) Updated: 2003/12/15
你不一定要做這修改,然而如果你的機器常出現userno重複者,那麼你可以考慮做這
修改。
這修改有幾個好處:
1. 給pal_body()做檢查用
2. 簡化整理userno的工作,變成只需要寫一支簡單的utility即可完工(應該很好寫,
就是開啟shm然後開始逐一把.USR的位置填入.ACCT裡,只有不正確的才要改)。
3. 找userno時不再需要讀硬碟,可以直接在shm裡比
SCHEMA結構16 bytes,我剛跑去看了一下itoc的站台歷史紀錄約有一萬人註冊,假設你
的站台有2萬好了,大約要用掉 16 ×20000 = 312.5 Kbytes,大站台應該沒有記憶體
不夠的顧慮。
: include / config.h
#define SCHESHM_KEY 2996 /* .USR */
: include / struct.h
在結構定義BCACHE後面加入這段,MAX_SCHEMA_SHM視你的站台規模自訂。
#define MAX_SCHEMA_SHM 131072 /* 131072 = 1024 * 128 */
typedef struct
{
SCHEMA schema[MAX_SCHEMA_SHM];
int number;
time_t uptime;
} SCACHE;
: maple / cache.c
在utmp_search()後面抄上這一段
/*-------------------------------------------------------*/
/* .USR cache */
/*-------------------------------------------------------*/
SCACHE *schema_shm;
void
schema_shm_init()
{
SCACHE *xshm;
time_t *uptime;
int n, turn;
turn = 0;
xshm = schema_shm;
if (xshm == NULL)
{
schema_shm = xshm = shm_new(SCHESHM_KEY, sizeof(SCACHE));
}
uptime = &(xshm->uptime);
for (;;)
{
n = *uptime;
if (n > 0)
return;
if (n < 0)
{
if (++turn < 30)
{
sleep(2);
continue;
}
}
*uptime = -1;
if ((n = open(FN_SCHEMA, O_RDONLY)) >= 0)
{
memset(xshm->schema, 0, sizeof(SCHEMA) * MAX_SCHEMA_SHM);
xshm->number =
read(n, xshm->schema, sizeof(SCHEMA) * MAX_SCHEMA_SHM) / sizeof(SCHEMA);
close(n);
}
time(uptime);
blog("CACHE", "reload schema_cache");
return;
}
}
: maple / bbsd.c
改main()
ushm_init();
bshm_init();
+ schema_shm_init();
fshm_init();
: util / reaper.c
前面加上
static int funo;
static int max_uno;
static SCHEMA schema;
+ static SCACHE *schema_shm;
main()前面抄上這一段
static void
schema_shmsync()
{
int fd;
SCACHE *xshm;
time_t *uptime;
xshm = schema_shm;
if (xshm == NULL)
{
schema_shm = xshm = shm_new(SCHESHM_KEY, sizeof(SCACHE));
}
uptime = &(xshm->uptime);
if ((fd = open(FN_SCHEMA, O_RDONLY)) >= 0)
{
memset(xshm->schema, 0, sizeof(SCHEMA) * MAX_SCHEMA_SHM);
xshm->number =
read(fd, xshm->schema, sizeof(SCHEMA) * MAX_SCHEMA_SHM) / sizeof(SCHEMA);
close(fd);
}
time(uptime);
}
改main()
#endif
+ schema_shmsync();
exit(0);
}
--
Origin: luna.twbbs.org精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻