diff options
author | Max Kellermann <max@duempel.org> | 2009-03-15 02:29:12 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-03-15 02:29:12 +0100 |
commit | 565afefc66b7753ed27f6b7febaf32667c38c44a (patch) | |
tree | f4597b75af009f2c887c2b56f17033a2fb10b692 /src/page.c | |
parent | eb34bd2efff21232d4d91224310c724b8df003aa (diff) | |
download | mpd-565afefc66b7753ed27f6b7febaf32667c38c44a.tar.gz mpd-565afefc66b7753ed27f6b7febaf32667c38c44a.tar.xz mpd-565afefc66b7753ed27f6b7febaf32667c38c44a.zip |
page: new library for reference counted buffers
Diffstat (limited to 'src/page.c')
-rw-r--r-- | src/page.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/page.c b/src/page.c new file mode 100644 index 000000000..a4f52ae4a --- /dev/null +++ b/src/page.c @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2003-2009 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "page.h" + +#include <glib.h> + +#include <assert.h> +#include <string.h> + +/** + * Allocates a new #page object, without filling the data element. + */ +static struct page * +page_new(size_t size) +{ + struct page *page = g_malloc(sizeof(*page) + size - + sizeof(page->data)); + + assert(size > 0); + + page->ref = 1; + page->size = size; + return page; +} + +struct page * +page_new_copy(const void *data, size_t size) +{ + struct page *page = page_new(size); + + assert(data != NULL); + + memcpy(page->data, data, size); + return page; +} + +void +page_ref(struct page *page) +{ + g_atomic_int_inc(&page->ref); +} + +static void +page_free(struct page *page) +{ + assert(page->ref == 0); + + g_free(page); +} + +bool +page_unref(struct page *page) +{ + bool unused = g_atomic_int_dec_and_test(&page->ref); + + if (unused) + page_free(page); + + return unused; +} |