回精華區
作者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翻