source: trunk/xcache/xc_extension.c @ 1026

Last change on this file since 1026 was 1026, checked in by moo, 2 years ago

refactor: split extension init to sub module. TODO: compatibility regression

  • Property svn:eol-style set to native
File size: 2.2 KB
Line 
1
2#include "xc_extension.h"
3#include "xcache.h"
4#include "util/xc_trace.h"
5
6
7int xcache_zend_extension_register(zend_extension *new_extension, zend_bool prepend) /* {{{ */
8{
9    zend_extension extension;
10
11    extension = *new_extension;
12    extension.handle = 0;
13
14    zend_extension_dispatch_message(ZEND_EXTMSG_NEW_EXTENSION, &extension);
15
16    if (prepend) {
17        zend_llist_prepend_element(&zend_extensions, &extension);
18    }
19    else {
20        zend_llist_add_element(&zend_extensions, &extension);
21    }
22    TRACE("%s", "registered");
23    return SUCCESS;
24}
25/* }}} */
26static int xc_ptr_compare_func(void *p1, void *p2) /* {{{ */
27{
28    return p1 == p2;
29}
30/* }}} */
31static int xc_zend_extension_remove(zend_extension *extension) /* {{{ */
32{
33    llist_dtor_func_t dtor;
34
35    assert(extension);
36    dtor = zend_extensions.dtor; /* avoid dtor */
37    zend_extensions.dtor = NULL;
38    zend_llist_del_element(&zend_extensions, extension, xc_ptr_compare_func);
39    zend_extensions.dtor = dtor;
40    return SUCCESS;
41}
42/* }}} */
43int xcache_zend_extension_unregister(zend_extension *extension) /* {{{ */
44{
45    zend_extension *ext = zend_get_extension(extension->name);
46    if (!ext) {
47        return FAILURE;
48    }
49
50    if (ext->shutdown) {
51        ext->shutdown(ext);
52    }
53    xc_zend_extension_remove(ext);
54    return SUCCESS;
55}
56/* }}} */
57
58zend_llist_element *xcache_llist_get_element_by_zend_extension(zend_llist *l, const char *extension_name) /* {{{ */
59{
60    zend_llist_element *element;
61
62    for (element = zend_extensions.head; element; element = element->next) {
63        zend_extension *extension = (zend_extension *) element->data;
64
65        if (!strcmp(extension->name, extension_name)) {
66            return element;
67        }
68    }
69    return NULL;
70}
71/* }}} */
72void xcache_llist_prepend(zend_llist *l, zend_llist_element *element) /* {{{ */
73{
74    element->next = l->head;
75    element->prev = NULL;
76    if (l->head) {
77        l->head->prev = element;
78    }
79    else {
80        l->tail = element;
81    }
82    l->head = element;
83    ++l->count;
84}
85/* }}} */
86void xcache_llist_unlink(zend_llist *l, zend_llist_element *element) /* {{{ */
87{
88    if ((element)->prev) {
89        (element)->prev->next = (element)->next;
90    }
91    else {
92        (l)->head = (element)->next;
93    }
94
95    if ((element)->next) {
96        (element)->next->prev = (element)->prev;
97    }
98    else {
99        (l)->tail = (element)->prev;
100    }
101
102    --l->count;
103}
104/* }}} */
Note: See TracBrowser for help on using the repository browser.