File: ntrackidpool.c

package info (click to toggle)
ntrack 008-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 1,960 kB
  • ctags: 349
  • sloc: sh: 10,127; ansic: 1,682; makefile: 366; cpp: 122; python: 11
file content (81 lines) | stat: -rw-r--r-- 2,335 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/* 
 * Copyright (C) 2009  Alexander Sack <asac@jwsdot.com>
 *
 * This file is part of:
 *     ntrack - Network Status Tracking for Desktop Applications
 *              http://launchpad.net/ntrack
 *
 *  ntrack is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as
 *  published by the Free Software Foundation, either version 3 of
 *  the License, or (at your option) any later version.
 *
 *  ntrack 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 Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with ntrack.  If not, see <http://www.gnu.org/licenses/>.
 */
#include "ntrackidpool.h"
#include "ntracklist.h"

#include <assert.h>
#include <stdlib.h>

#define NTRACK_POOL_GEN_SIZE 128

struct _ntrack_id_pool {
	ntrack_list_t *pool;
	long size;
};

ntrack_id_pool_t*
ntrack_id_pool_new ()
{
	ntrack_id_pool_t *self = calloc (sizeof (ntrack_id_pool_t), 1);
	self->size = 0;
	self->pool = NULL;
	return self;
}

long
ntrack_id_pool_acquire (ntrack_id_pool_t *self)
{
	long rval;
	if (!ntrack_list_size (self->pool)) {
		int c = NTRACK_POOL_GEN_SIZE;
		while (c) {
			self->pool = ntrack_list_insert_sorted_unique (self->pool,
			                                               (void*) self->size,
			                                               FALSE,
			                                               ntrack_compare_direct);
			self->size++;
			c--;
		}
	}
	rval = (long) self->pool->data;
	self->pool = ntrack_list_remove (self->pool, self->pool);
	return rval;
}

void
ntrack_id_pool_release (ntrack_id_pool_t *self, long id)
{
	assert (id < self->size);
	self->pool = ntrack_list_insert_sorted_unique (self->pool,
	                                               (void*) id,
	                                               FALSE,
	                                               ntrack_compare_direct);
}

void
ntrack_id_pool_free (ntrack_id_pool_t *self)
{
	while (self->pool)
		self->pool = ntrack_list_remove (self->pool, self->pool);
	free (self);
}