■スレッドリストへ戻る■ 全部 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