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

235KB
新着レスの表示

スレッドリストへ戻る 全部 前100 次100 最新50

0ch BBS 2004-10-30