/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MODPERL_GLOBAL_H
#define MODPERL_GLOBAL_H

typedef struct {
#if MP_THREADED
    perl_mutex glock;
#endif
    int flags;
    void *data;
    const char *name;
} modperl_global_t;

#if MP_THREADED
typedef apr_threadkey_t modperl_tls_t;
#else
typedef modperl_global_t modperl_tls_t;
#endif

void modperl_global_request_cfg_set(request_rec *r);

request_rec *modperl_global_request(pTHX_ SV *svr);

void modperl_global_request_set(request_rec *r);

void modperl_global_request_obj_set(pTHX_ SV *svr);

void modperl_global_init(modperl_global_t *global, apr_pool_t *p,
                         void *data, const char *name);

void modperl_global_lock(modperl_global_t *global);

void modperl_global_unlock(modperl_global_t *global);

void *modperl_global_get(modperl_global_t *global);

void modperl_global_set(modperl_global_t *global, void *data);

#define MP_GLOBAL_DECL(gname, type)                                \
    void modperl_global_init_##gname(apr_pool_t *p, type gname);   \
    void modperl_global_lock_##gname(void);                        \
    void modperl_global_unlock_##gname(void);                      \
    type modperl_global_get_##gname(void);                         \
    void modperl_global_set_##gname(void *)

/* modperl_global_get_pconf returns a thread un-safe object */
MP_GLOBAL_DECL(pconf, apr_pool_t *);

/* modperl_global_get_server_rec returns a thread un-safe object */
MP_GLOBAL_DECL(server_rec, server_rec *);

void modperl_global_anon_cnt_init(apr_pool_t *p);
int modperl_global_anon_cnt_next(void);

apr_status_t modperl_tls_create(apr_pool_t *p, modperl_tls_t **key);
apr_status_t modperl_tls_get(modperl_tls_t *key, void **data);
apr_status_t modperl_tls_set(modperl_tls_t *key, void *data);
void modperl_tls_reset_cleanup(apr_pool_t *p, modperl_tls_t *key, void *data);

#define MP_TLS_DECL(gname, type) \
apr_status_t modperl_tls_create_##gname(apr_pool_t *p); \
apr_status_t modperl_tls_get_##gname(type *data); \
apr_status_t modperl_tls_set_##gname(void *data); \
void modperl_tls_reset_cleanup_##gname(apr_pool_t *p, type data)

MP_TLS_DECL(request_rec, request_rec *);

#endif /* MODPERL_GLOBAL_H */
