annotate src/circbuffer.h @ 14122:dabbcb9b013d

[gaim-migrate @ 16759] This initializes threads for glib and dbus, because under some circumstances multithreaded libraries are causing dbus badness (namely, gnome-vfs). This fix doesn't really belong in Gaim, but in the interest of expedience (we don't want to wait for upstream libraries to get their initializations all worked around to make things safe) the fix goes here. Note that all Gaim frontends will have to initialize glib threads if other threaded libraries which interact with glib or dbus or what-have-you come into play. committer: Tailor Script <tailor@pidgin.im>
author Ethan Blanton <elb@pidgin.im>
date Mon, 14 Aug 2006 21:46:17 +0000
parents 614c56622453
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13951
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
1 /*
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
2 * @file circbuffer.h Buffer Utility Functions
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
3 * @ingroup core
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
4 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
5 * Gaim is the legal property of its developers, whose names are too numerous
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
7 * source distribution.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
8 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
12 * (at your option) any later version.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
13 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
17 * GNU General Public License for more details.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
18 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
22 */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
23 #ifndef _CIRCBUFFER_H
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
24 #define _CIRCBUFFER_H
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
25
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
26 #include <glib.h>
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
27
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
28 #ifdef __cplusplus
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
29 extern "C" {
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
30 #endif
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
31
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
32 typedef struct _GaimCircBuffer {
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
33
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
34 /** A pointer to the starting address of our chunk of memory. */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
35 gchar *buffer;
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
36
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
37 /** The incremental amount to increase this buffer by when
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
38 * the buffer is not big enough to hold incoming data, in bytes. */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
39 gsize growsize;
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
40
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
41 /** The length of this buffer, in bytes. */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
42 gsize buflen;
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
43
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
44 /** The number of bytes of this buffer that contain unread data. */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
45 gsize bufused;
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
46
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
47 /** A pointer to the next byte where new incoming data is
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
48 * buffered to. */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
49 gchar *inptr;
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
50
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
51 /** A pointer to the next byte of buffered data that should be
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
52 * read by the consumer. */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
53 gchar *outptr;
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
54
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
55 } GaimCircBuffer;
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
56
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
57 /**
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
58 * Creates a new circular buffer. This will not allocate any memory for the
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
59 * actual buffer until data is appended to it.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
60 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
61 * @param growsize The amount that the buffer should grow the first time data
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
62 * is appended and every time more space is needed. Pass in
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
63 * "0" to use the default of 256 bytes.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
64 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
65 * @return The new GaimCircBuffer. This should be freed with
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
66 * gaim_circ_buffer_destroy when you are done with it
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
67 */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
68 GaimCircBuffer *gaim_circ_buffer_new(gsize growsize);
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
69
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
70 /**
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
71 * Dispose of the GaimCircBuffer and free any memory used by it (including any
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
72 * memory used by the internal buffer).
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
73 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
74 * @param buf The GaimCircBuffer to free
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
75 */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
76 void gaim_circ_buffer_destroy(GaimCircBuffer *buf);
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
77
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
78 /**
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
79 * Append data to the GaimCircBuffer. This will grow the internal
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
80 * buffer to fit the added data, if needed.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
81 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
82 * @param buf The GaimCircBuffer to which to append the data
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
83 * @param src pointer to the data to copy into the buffer
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
84 * @param len number of bytes to copy into the buffer
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
85 */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
86 void gaim_circ_buffer_append(GaimCircBuffer *buf, gconstpointer src, gsize len);
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
87
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
88 /**
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
89 * Determine the maximum number of contiguous bytes that can be read from the
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
90 * GaimCircBuffer.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
91 * Note: This may not be the total number of bytes that are buffered - a
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
92 * subsequent call after calling gaim_circ_buffer_mark_read() may indicate more
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
93 * data is available to read.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
94 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
95 * @param buf the GaimCircBuffer for which to determine the maximum contiguous
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
96 * bytes that can be read.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
97 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
98 * @return the number of bytes that can be read from the GaimCircBuffer
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
99 */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
100 gsize gaim_circ_buffer_get_max_read(GaimCircBuffer *buf);
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
101
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
102 /**
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
103 * Mark the number of bytes that have been read from the buffer.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
104 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
105 * @param buf The GaimCircBuffer to mark bytes read from
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
106 * @param len The number of bytes to mark as read
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
107 *
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
108 * @return TRUE if we successfully marked the bytes as having been read, FALSE
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
109 * otherwise.
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
110 */
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
111 gboolean gaim_circ_buffer_mark_read(GaimCircBuffer *buf, gsize len);
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
112
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
113 #ifdef __cplusplus
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
114 }
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
115 #endif
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
116
614c56622453 [gaim-migrate @ 16496]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
117 #endif /* _CIRCBUFFER_H */