source: branches/samba-3.5.x/lib/talloc/pytalloc.c@ 717

Last change on this file since 717 was 414, checked in by Herwig Bauernfeind, 15 years ago

Samba 3.5.0: Initial import

File size: 2.5 KB
Line 
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 "replace.h"
21#include <talloc.h>
22#include <pytalloc.h>
23
24/**
25 * Simple dealloc for talloc-wrapping PyObjects
26 */
27void py_talloc_dealloc(PyObject* self)
28{
29 py_talloc_Object *obj = (py_talloc_Object *)self;
30 talloc_free(obj->talloc_ctx);
31 obj->talloc_ctx = NULL;
32 self->ob_type->tp_free(self);
33}
34
35/**
36 * Import an existing talloc pointer into a Python object.
37 */
38PyObject *py_talloc_steal_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx,
39 void *ptr)
40{
41 py_talloc_Object *ret = (py_talloc_Object *)py_type->tp_alloc(py_type, 0);
42 ret->talloc_ctx = talloc_new(NULL);
43 if (ret->talloc_ctx == NULL) {
44 return NULL;
45 }
46 if (talloc_steal(ret->talloc_ctx, mem_ctx) == NULL) {
47 return NULL;
48 }
49 ret->ptr = ptr;
50 return (PyObject *)ret;
51}
52
53
54/**
55 * Import an existing talloc pointer into a Python object, leaving the
56 * original parent, and creating a reference to the object in the python
57 * object
58 */
59PyObject *py_talloc_reference_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, void *ptr)
60{
61 py_talloc_Object *ret = (py_talloc_Object *)py_type->tp_alloc(py_type, 0);
62 ret->talloc_ctx = talloc_new(NULL);
63 if (ret->talloc_ctx == NULL) {
64 return NULL;
65 }
66 if (talloc_reference(ret->talloc_ctx, mem_ctx) == NULL) {
67 return NULL;
68 }
69 ret->ptr = ptr;
70 return (PyObject *)ret;
71}
72
73/**
74 * Default (but slightly more useful than the default) implementation of Repr().
75 */
76PyObject *py_talloc_default_repr(PyObject *obj)
77{
78 py_talloc_Object *talloc_obj = (py_talloc_Object *)obj;
79 PyTypeObject *type = (PyTypeObject*)PyObject_Type(obj);
80
81 return PyString_FromFormat("<%s talloc object at 0x%p>",
82 type->tp_name, talloc_obj->ptr);
83}
84
85static void py_cobject_talloc_free(void *ptr)
86{
87 talloc_free(ptr);
88}
89
90PyObject *PyCObject_FromTallocPtr(void *ptr)
91{
92 return PyCObject_FromVoidPtr(ptr, py_cobject_talloc_free);
93}
Note: See TracBrowser for help on using the repository browser.