talloc: Add a separate pool size
[sfrench/samba-autobuild/.git] / lib / talloc / pytalloc_util.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Python/Talloc glue
4    Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <Python.h>
21 #include "replace.h"
22 #include <talloc.h>
23 #include "pytalloc.h"
24 #include <assert.h>
25
26 _PUBLIC_ PyTypeObject *pytalloc_GetObjectType(void)
27 {
28         static PyTypeObject *type = NULL;
29         PyObject *mod;
30
31         if (type != NULL) {
32                 return type;
33         }
34
35         mod = PyImport_ImportModule("talloc");
36         if (mod == NULL) {
37                 return NULL;
38         }
39
40         type = (PyTypeObject *)PyObject_GetAttrString(mod, "Object");
41         Py_DECREF(mod);
42
43         return type;
44 }
45
46 /**
47  * Import an existing talloc pointer into a Python object.
48  */
49 _PUBLIC_ PyObject *pytalloc_steal_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx,
50                                                    void *ptr)
51 {
52         pytalloc_Object *ret = (pytalloc_Object *)py_type->tp_alloc(py_type, 0);
53         ret->talloc_ctx = talloc_new(NULL);
54         if (ret->talloc_ctx == NULL) {
55                 return NULL;
56         }
57         if (talloc_steal(ret->talloc_ctx, mem_ctx) == NULL) {
58                 return NULL;
59         }
60         talloc_set_name_const(ret->talloc_ctx, py_type->tp_name);
61         ret->ptr = ptr;
62         return (PyObject *)ret;
63 }
64
65 /**
66  * Import an existing talloc pointer into a Python object.
67  */
68 _PUBLIC_ PyObject *pytalloc_steal(PyTypeObject *py_type, void *ptr)
69 {
70         return pytalloc_steal_ex(py_type, ptr, ptr);
71 }
72
73
74 /**
75  * Import an existing talloc pointer into a Python object, leaving the
76  * original parent, and creating a reference to the object in the python
77  * object
78  */
79 _PUBLIC_ PyObject *pytalloc_reference_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, void *ptr)
80 {
81         pytalloc_Object *ret;
82
83         if (ptr == NULL) {
84                 Py_RETURN_NONE;
85         }
86
87         ret = (pytalloc_Object *)py_type->tp_alloc(py_type, 0);
88         ret->talloc_ctx = talloc_new(NULL);
89         if (ret->talloc_ctx == NULL) {
90                 return NULL;
91         }
92         if (talloc_reference(ret->talloc_ctx, mem_ctx) == NULL) {
93                 return NULL;
94         }
95         talloc_set_name_const(ret->talloc_ctx, py_type->tp_name);
96         ret->ptr = ptr;
97         return (PyObject *)ret;
98 }
99
100 static void py_cobject_talloc_free(void *ptr)
101 {
102         talloc_free(ptr);
103 }
104
105 _PUBLIC_ PyObject *pytalloc_CObject_FromTallocPtr(void *ptr)
106 {
107         if (ptr == NULL) {
108                 Py_RETURN_NONE;
109         }
110         return PyCObject_FromVoidPtr(ptr, py_cobject_talloc_free);
111 }
112
113 _PUBLIC_ int pytalloc_Check(PyObject *obj)
114 {
115         PyTypeObject *tp = pytalloc_GetObjectType();
116
117         return PyObject_TypeCheck(obj, tp);
118 }