lua_vmprep.h revision ba7fdc26d604339f841adf2a389fa37e7bb15313
888d5172c9670a1a6278556625f1f6199ec53a2dfielding/**
240b85022b73af58a6d971cd3d05d54037d8f682nd * Licensed to the Apache Software Foundation (ASF) under one or more
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * contributor license agreements. See the NOTICE file distributed with
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * this work for additional information regarding copyright ownership.
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * The ASF licenses this file to You under the Apache License, Version 2.0
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * (the "License"); you may not use this file except in compliance with
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * the License. You may obtain a copy of the License at
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding *
240b85022b73af58a6d971cd3d05d54037d8f682nd * http://www.apache.org/licenses/LICENSE-2.0
240b85022b73af58a6d971cd3d05d54037d8f682nd *
240b85022b73af58a6d971cd3d05d54037d8f682nd * Unless required by applicable law or agreed to in writing, software
240b85022b73af58a6d971cd3d05d54037d8f682nd * distributed under the License is distributed on an "AS IS" BASIS,
240b85022b73af58a6d971cd3d05d54037d8f682nd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
240b85022b73af58a6d971cd3d05d54037d8f682nd * See the License for the specific language governing permissions and
240b85022b73af58a6d971cd3d05d54037d8f682nd * limitations under the License.
240b85022b73af58a6d971cd3d05d54037d8f682nd */
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
240b85022b73af58a6d971cd3d05d54037d8f682nd#include "lua.h"
240b85022b73af58a6d971cd3d05d54037d8f682nd#include "lauxlib.h"
240b85022b73af58a6d971cd3d05d54037d8f682nd#include "lualib.h"
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez#include "httpd.h"
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez
189ab8a7e8c8b1139f8f12130a8f01ba35cbf853wsanchez#include "apr_thread_rwlock.h"
189ab8a7e8c8b1139f8f12130a8f01ba35cbf853wsanchez#include "apr_strings.h"
5a322de173626af6d7e4e3e6bb67082ae5e7981egregames#include "apr_tables.h"
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez#include "apr_hash.h"
8e157dab9212d6770973543a56bf644387e5a178jim#include "apr_buckets.h"
abe277e8a4d9853f601b149f7a3cd62e58c2145etrawick#include "apr_file_info.h"
189ab8a7e8c8b1139f8f12130a8f01ba35cbf853wsanchez#include "apr_time.h"
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez#include "apr_pools.h"
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez#include "apr_reslist.h"
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez
7559b8d0f626adc4721ab6cdd37a8c9240ab297dwsanchez#ifndef VMPREP_H
1e5333ef1a0edb888d75c0cdd90b33fa7e89fc31wsanchez#define VMPREP_H
7559b8d0f626adc4721ab6cdd37a8c9240ab297dwsanchez
7559b8d0f626adc4721ab6cdd37a8c9240ab297dwsanchez#define AP_LUA_SCOPE_UNSET 0
7559b8d0f626adc4721ab6cdd37a8c9240ab297dwsanchez#define AP_LUA_SCOPE_ONCE 1
7559b8d0f626adc4721ab6cdd37a8c9240ab297dwsanchez#define AP_LUA_SCOPE_REQUEST 2
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars#define AP_LUA_SCOPE_CONN 3
f2bb0fcbae983ee168351523a860675292b18e5arbb#define AP_LUA_SCOPE_THREAD 4
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars#define AP_LUA_SCOPE_SERVER 5
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars
62c34f2ec7702e37bb57679c3bfe624bc9822de4rbb#define AP_LUA_CACHE_UNSET 0
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars#define AP_LUA_CACHE_NEVER 1
888d5172c9670a1a6278556625f1f6199ec53a2dfielding#define AP_LUA_CACHE_STAT 2
86d87cb5057a62612a598348e737c4ab5a0a657cwsanchez#define AP_LUA_CACHE_FOREVER 3
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingtypedef void (*ap_lua_state_open_callback) (lua_State *L, apr_pool_t *p,
62c34f2ec7702e37bb57679c3bfe624bc9822de4rbb void *ctx);
c600cf3a41e0271a863287eb0b0a189d14eb1243trawick/**
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * Specification for a lua virtual machine
888d5172c9670a1a6278556625f1f6199ec53a2dfielding */
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingtypedef struct
86d87cb5057a62612a598348e737c4ab5a0a657cwsanchez{
888d5172c9670a1a6278556625f1f6199ec53a2dfielding /* NEED TO ADD ADDITIONAL PACKAGE PATHS AS PART OF SPEC INSTEAD OF DIR CONFIG */
62c34f2ec7702e37bb57679c3bfe624bc9822de4rbb apr_array_header_t *package_paths;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding apr_array_header_t *package_cpaths;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding /* name of base file to load in the vm */
888d5172c9670a1a6278556625f1f6199ec53a2dfielding const char *file;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding /* APL_SCOPE_ONCE | APL_SCOPE_REQUEST | APL_SCOPE_CONN | APL_SCOPE_THREAD | APL_SCOPE_SERVER */
888d5172c9670a1a6278556625f1f6199ec53a2dfielding int scope;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding unsigned int vm_min;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding unsigned int vm_max;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding ap_lua_state_open_callback cb;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding void* cb_arg;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding /* pool to use for lifecycle if APL_SCOPE_ONCE is set, otherwise unused */
888d5172c9670a1a6278556625f1f6199ec53a2dfielding apr_pool_t *pool;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
f2bb0fcbae983ee168351523a860675292b18e5arbb /* Pre-compiled Lua Byte code to load directly. If bytecode_len is >0,
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * the file part of this structure is ignored for loading purposes, but
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * it is used for error messages.
888d5172c9670a1a6278556625f1f6199ec53a2dfielding */
888d5172c9670a1a6278556625f1f6199ec53a2dfielding const char *bytecode;
04ec2a6297e5cbf087f92909927919ca425ff633gregames apr_size_t bytecode_len;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
86d87cb5057a62612a598348e737c4ab5a0a657cwsanchez int codecache;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding} ap_lua_vm_spec;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingtypedef struct
888d5172c9670a1a6278556625f1f6199ec53a2dfielding{
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars const char *function_name;
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars const char *file_name;
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars int scope;
6c423f77cd58c4eb48f5c489d05f5f976c1e74ddlars ap_regex_t *uri_pattern;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding const char *bytecode;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding apr_size_t bytecode_len;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding int codecache;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding} ap_lua_mapped_handler_spec;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingtypedef struct {
888d5172c9670a1a6278556625f1f6199ec53a2dfielding apr_size_t runs;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding apr_time_t modified;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding apr_size_t size;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding} ap_lua_finfo;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingtypedef struct {
888d5172c9670a1a6278556625f1f6199ec53a2dfielding lua_State* L;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding ap_lua_finfo* finfo;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding} ap_lua_server_spec;
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding/* remove and make static once out of mod_wombat.c */
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingAP_LUA_DECLARE(void) ap_lua_openlibs(lua_State *L);
4481373210a7c58c0f059410a1ad80593cdbdb09slive
4481373210a7c58c0f059410a1ad80593cdbdb09slive/* remove and make static once out of mod_wombat.c */
4481373210a7c58c0f059410a1ad80593cdbdb09sliveAP_LUA_DECLARE(void) ap_lua_registerlib(lua_State *L, char *name, lua_CFunction f);
4481373210a7c58c0f059410a1ad80593cdbdb09slive
888d5172c9670a1a6278556625f1f6199ec53a2dfielding/**
4481373210a7c58c0f059410a1ad80593cdbdb09slive * Fake out addition of the "apache2" module
888d5172c9670a1a6278556625f1f6199ec53a2dfielding */
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingAP_LUA_DECLARE(void) ap_lua_load_apache2_lmodule(lua_State *L);
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding/*
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * alternate means of getting lua_State (preferred eventually)
94a719cfed2369f14a96e1835623198c2df96080rbb * Obtain a lua_State which has loaded file and is associated with lifecycle_pool
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * If one exists, will return extant one, otherwise will create, attach, and return
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * This does no locking around the lua_State, so if the pool is shared between
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * threads, locking is up the client.
888d5172c9670a1a6278556625f1f6199ec53a2dfielding *
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * @lifecycle_pool -> pool whose lifeycle controls the lua_State
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * @file file to be opened, also used as a key for uniquing lua_States
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * @cb callback for vm initialization called *before* the file is opened
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * @ctx a baton passed to cb
888d5172c9670a1a6278556625f1f6199ec53a2dfielding */
5a322de173626af6d7e4e3e6bb67082ae5e7981egregamesAP_LUA_DECLARE(lua_State*) ap_lua_get_lua_state(apr_pool_t *lifecycle_pool,
5a322de173626af6d7e4e3e6bb67082ae5e7981egregames ap_lua_vm_spec *spec, request_rec* r);
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding#if APR_HAS_THREADS || defined(DOXYGEN)
888d5172c9670a1a6278556625f1f6199ec53a2dfielding/*
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * Initialize mod_lua mutex.
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * @pool pool for mutex
888d5172c9670a1a6278556625f1f6199ec53a2dfielding * @s server_rec for logging
888d5172c9670a1a6278556625f1f6199ec53a2dfielding */
888d5172c9670a1a6278556625f1f6199ec53a2dfieldingvoid ap_lua_init_mutex(apr_pool_t *pool, server_rec *s);
888d5172c9670a1a6278556625f1f6199ec53a2dfielding#endif
888d5172c9670a1a6278556625f1f6199ec53a2dfielding
888d5172c9670a1a6278556625f1f6199ec53a2dfielding#endif
888d5172c9670a1a6278556625f1f6199ec53a2dfielding