■スレッドリストへ戻る■ 全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 最新50
read.cgi再開発スレ
- 440 : ◆cZfSunOs.U :04/12/07 07:25:30 ID:4/kWaSl/
- >>435 設定情報は確かにそういうやり方の方がスマートかも知れませんね.
ただ,それなら今ある仕組みのままでも,SetEnv 使えば DSO プログラム側から
apr_table_get(r->subprocess_env, "key") で取り出せます.
一方,広告テキストなどはさすがに httpd.conf に書き連ねるのは......
ってことで,こちらはファイルから読み込んで server pool に突っ込んでおく
のが良さそうですね.だいたいこんな感じでしょうか.
----[read.h に追加]---------------------------------------------------
#include <pthread.h>
#include "apr_pools.h"
#include "apr_thread_rwlock.h"
----[read2ch.h に追加]------------------------------------------------
#define AD_FILENAME "ad.txt"
#define AD_CHECK_INTERVAL 60
----[read.c はこんな感じに]-------------------------------------------
:
typedef struct {
apr_thread_rwlock_t *rwlock;
volatile apr_time_t lastchecked, mtime;
apr_pool_t *pool;
apr_mmap_t *m;
} ad_pool_t;
:
static ad_pool_t *get_ad_pool(request_rec *r, const char *ad_key)
{
/* APR mutex には静的初期化マクロが用意されていないので,ここは pthread mutex を使用 */
static pthread_mutex_t ad_mutex = PTHREAD_MUTEX_INITIALIZER;
ad_pool_t *ad_pool, **ad_poolp = &ad_pool;
apr_pool_t *p = r->server->process->pool;
apr_pool_userdata_get((void **)ad_poolp, ad_key, p);
if (!ad_pool) {
pthread_mutex_lock(&ad_mutex);
apr_pool_userdata_get((void **)ad_poolp, ad_key, p);
if (!ad_pool) {
ad_pool = apr_palloc(p, sizeof *ad_pool);
ad_pool->lastchecked = ad_pool->mtime = 0;
if (apr_thread_rwlock_create(&ad_pool->rwlock, p)
|| apr_pool_create(&ad_pool->pool, p))
ad_pool = NULL;
else
apr_pool_userdata_set(ad_pool, ad_key, apr_pool_cleanup_null, p);
}
pthread_mutex_unlock(&ad_mutex);
}
return ad_pool;
}
- 441 : ◆cZfSunOs.U :04/12/07 07:27:44 ID:4/kWaSl/
- static void update_ad_pool(global_vars_t *gv, request_rec *r, ad_pool_t *ad_pool)
{
char *adfile;
apr_file_t *f;
apr_finfo_t finfo;
if (gv->t_now - ad_pool->lastchecked < AD_CHECK_INTERVAL * APR_USEC_PER_SEC)
return;
apr_thread_rwlock_wrlock(ad_pool->rwlock);
ad_pool->lastchecked = gv->t_now;
adfile = apr_pstrcat(r->pool, gv->cwd, "../", gv->zz_bs, "/", AD_FILENAME, NULL);
if (apr_stat(&finfo, adfile, APR_FINFO_MIN, r->pool)) {
ad_pool->mtime = 0;
apr_pool_clear(ad_pool->pool);
}
else if (finfo.mtime > ad_pool->mtime
&& gv->t_now - finfo.mtime >= APR_USEC_PER_SEC) {
apr_pool_clear(ad_pool->pool);
ad_pool->mtime = apr_file_open(&f, adfile, APR_READ, APR_OS_DEFAULT, r->pool)
|| apr_file_info_get(&finfo, APR_FINFO_MIN, f)
|| apr_mmap_create(&ad_pool->m, f, 0, finfo.size, APR_MMAP_READ, ad_pool->pool)
? 0 : finfo.mtime;
}
apr_thread_rwlock_unlock(ad_pool->rwlock);
}
:
int dso_main(request_rec *r, int argc, char **argv)
{
:
char *ad_key;
ad_pool_t *ad_pool;
:
ad_key = apr_pstrcat(r->pool, "read.ad.", gv->zz_bs, NULL);
ad_pool = get_ad_pool(r, ad_key);
if (ad_pool) {
update_ad_pool(gv, r, ad_pool);
apr_thread_rwlock_rdlock(ad_pool->rwlock);
if (ad_pool->mtime)
ap_rwrite(ad_pool->m->mm, ad_pool->m->size, r);
apr_thread_rwlock_unlock(ad_pool->rwlock);
}
:
}
----------------------------------------------------------------------
235KB
新着レスの表示
スレッドリストへ戻る 全部 前100 次100 最新50
0ch BBS 2004-10-30