view tools/xenstore/talloc.h @ 7238:971e7c7411b3

Raise an exception if an error appears on the pipes to our children, and make
sure that the child's pipes are closed even under that exception. Move the
handling of POLLHUP to the end of the loop, so that we guarantee to read any
remaining data from the child if POLLHUP and POLLIN appear at the same time.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
author emellor@ewan
date Thu Oct 06 10:13:11 2005 +0100 (2005-10-06)
parents 6d3e8f90c2df
children 40e3df4cffe4
line source
1 #ifndef _TALLOC_H_
2 #define _TALLOC_H_
3 /*
4 Unix SMB/CIFS implementation.
5 Samba temporary memory allocation functions
7 Copyright (C) Andrew Tridgell 2004-2005
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
24 /* this is only needed for compatibility with the old talloc */
25 typedef void TALLOC_CTX;
27 /*
28 this uses a little trick to allow __LINE__ to be stringified
29 */
30 #define _STRING_LINE_(s) #s
31 #define _STRING_LINE2_(s) _STRING_LINE_(s)
32 #define __LINESTR__ _STRING_LINE2_(__LINE__)
33 #define __location__ __FILE__ ":" __LINESTR__
37 #endif
39 /* useful macros for creating type checked pointers */
40 #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type)
41 #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__)
43 #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__)
45 #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type)
46 #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__)
48 #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type)
49 #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type)
50 #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__)
52 #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type)
53 #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__)
55 #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__)
57 #define malloc_p(type) (type *)malloc(sizeof(type))
58 #define malloc_array_p(type, count) (type *)realloc_array(NULL, sizeof(type), count)
59 #define realloc_p(p, type, count) (type *)realloc_array(p, sizeof(type), count)
61 #define data_blob(ptr, size) data_blob_named(ptr, size, "DATA_BLOB: "__location__)
62 #define data_blob_talloc(ctx, ptr, size) data_blob_talloc_named(ctx, ptr, size, "DATA_BLOB: "__location__)
63 #define data_blob_dup_talloc(ctx, blob) data_blob_talloc_named(ctx, (blob)->data, (blob)->length, "DATA_BLOB: "__location__)
65 #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type)
66 #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type)
70 #define talloc_zero_p(ctx, type) talloc_zero(ctx, type)
71 #define talloc_p(ctx, type) talloc(ctx, type)
72 #define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count)
73 #define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count)
74 #define talloc_destroy(ctx) talloc_free(ctx)
75 #endif
78 #if (__GNUC__ >= 3)
79 /** Use gcc attribute to check printf fns. a1 is the 1-based index of
80 * the parameter containing the format, and a2 the index of the first
81 * argument. Note that some gcc 2.x versions don't handle this
82 * properly **/
83 #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
84 #else
85 #define PRINTF_ATTRIBUTE(a1, a2)
86 #endif
87 #endif
90 /* The following definitions come from talloc.c */
91 void *_talloc(const void *context, size_t size);
92 void talloc_set_destructor(const void *ptr, int (*destructor)(void *));
93 void talloc_increase_ref_count(const void *ptr);
94 void *talloc_reference(const void *context, const void *ptr);
95 int talloc_unlink(const void *context, void *ptr);
96 void talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
97 void talloc_set_name_const(const void *ptr, const char *name);
98 void *talloc_named(const void *context, size_t size,
99 const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
100 void *talloc_named_const(const void *context, size_t size, const char *name);
101 const char *talloc_get_name(const void *ptr);
102 void *talloc_check_name(const void *ptr, const char *name);
103 void talloc_report_depth(const void *ptr, FILE *f, int depth);
104 void *talloc_parent(const void *ptr);
105 void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);
106 int talloc_free(void *ptr);
107 void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name);
108 void *talloc_steal(const void *new_ctx, const void *ptr);
109 off_t talloc_total_size(const void *ptr);
110 off_t talloc_total_blocks(const void *ptr);
111 void talloc_report_full(const void *ptr, FILE *f);
112 void talloc_report(const void *ptr, FILE *f);
113 void talloc_enable_null_tracking(void);
114 void talloc_enable_leak_report(void);
115 void talloc_enable_leak_report_full(void);
116 void *_talloc_zero(const void *ctx, size_t size, const char *name);
117 void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name);
118 char *talloc_strdup(const void *t, const char *p);
119 char *talloc_strndup(const void *t, const char *p, size_t n);
120 char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
121 char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
122 char *talloc_asprintf_append(char *s,
123 const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
124 void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name);
125 void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name);
126 void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name);
127 void *talloc_realloc_fn(const void *context, void *ptr, size_t size);
128 void *talloc_autofree_context(void);
129 size_t talloc_get_size(const void *ctx);
131 typedef int talloc_fail_handler(void *);
132 talloc_fail_handler *talloc_set_fail_handler(talloc_fail_handler *, void *);
133 #endif