summaryrefslogtreecommitdiff
path: root/src/extension.cpp
blob: 0a7def6d91899e8eaa403a03d33c500c50481fef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/**
 *  Extension.cpp
 *
 *  @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
 *  @copyright 2013 Copernica BV
 */
#include "includes.h"

/**
 *  Set up namespace
 */
namespace PhpCpp {

/**
 *  Pointer to the one and only extension
 *  @var Extension
 */
static Extension *extension;

/**
 *  Constructor
 *  @param  name        Name of the extension
 *  @param  version     Version number
 */
Extension::Extension(const char *name, const char *version) : _name(name), _version(version), _entry(NULL)
{
    // store pointer to the one and only extension
    extension = this;
}

/**
 *  Destructor
 */
Extension::~Extension()
{
    // deallocate entry
    if (_entry) delete _entry;
}

/**
 *  Function that is called when the extension initializes
 *  @param  type        Module type
 *  @param  number      Module number
 *  @param  tsrm_ls     Optional thread safety thing
 *  @return int         0 on success
 */
static int extension_startup(INIT_FUNC_ARGS)
{
    return BOOL2SUCCESS(extension->initialize());
}

/**
 *  Function that is called when the extension is about to be stopped
 *  @param  type        Module type
 *  @param  number      Module number
 *  @return int
 */
static int extension_shutdown(SHUTDOWN_FUNC_ARGS)
{
    return BOOL2SUCCESS(extension->finalize());
}

/**
 *  Retrieve a pointer to the entry
 *  @return zend_module_entry
 */
zend_module_entry *Extension::entry()
{
    // already initialized?
    if (_entry) return _entry;
    
    // allocate now
    _entry = new zend_module_entry;
    
    // assign all members
    _entry->size = sizeof(zend_module_entry);               // size of the data
    _entry->zend_api = ZEND_MODULE_API_NO;                  // api number
    _entry->zend_debug = ZEND_DEBUG;                        // debug mode enabled?
    _entry->zts = USING_ZTS;                                // is thread safety enabled?
    _entry->ini_entry = NULL;                               // the php.ini record
    _entry->deps = NULL;                                    // dependencies on other modules
    _entry->name = _name;                                   // extension name
    _entry->functions = NULL;                               // functions supported by this module
    _entry->module_startup_func = extension_startup;        // startup function for the whole extension
    _entry->module_shutdown_func = extension_shutdown;      // shutdown function for the whole extension
    _entry->request_startup_func = NULL;         // startup function per request
    _entry->request_shutdown_func = NULL;       // shutdown function per request
    _entry->info_func = NULL;                               // information for retrieving info
    _entry->version = _version;                             // version string
    _entry->globals_size = 0;                               // number of global variables
#ifdef ZTS
    _entry->globals_id_ptr = NULL;                          // pointer to the globals, thread safe
#else
    _entry->globals_ptr = NULL;                             // pointer to the globals
#endif
    _entry->globals_ctor = NULL;                            // constructor for global variables
    _entry->globals_dtor = NULL;                            // destructor for global variables
    _entry->post_deactivate_func = NULL;                    // unknown function
    _entry->module_started = 0;                             // module is not yet started
    _entry->type = 0;                                       // temporary or persistent module, will be filled by Zend engine
    _entry->handle = NULL;                                  // dlopen() handle, will be filled by Zend engine
    _entry->module_number = 0;                              // module number will be filled in by Zend engine
    _entry->build_id = ZEND_MODULE_BUILD_ID;                // check if extension and zend engine are compatible
    
    // done
    return _entry;
}

/**
 *  End of namespace
 */
}