blob: 0664da6ea23719c80fc77b8069031274265832ee (
plain) (
blame)
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/**
* VOTASKUTIL.C -- Utility methods to convert pointers to user handles.
*
* @brief Utility methods to convert pointers to user handles.
*
* @file voTaskUtil.c
* @author Mike Fitzpatrick
* @date 9/24/12
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include "voTask.h"
#define MAX_HANDLES 128
int numHandles = 0;
long taskHandles[MAX_HANDLES];
/* Public procedures
*/
handle_t task_P2H (void *ptr);
void *task_H2P (handle_t handle);
handle_t task_newHandle (void *ptr);
void task_freeHandle (handle_t handle);
/* Utility routines for keep track of handles.
*/
/**
* TASK_NEWHANDLE -- Get an unused object handle.
*
* @brief Get an unused object handle
* @fn handle_t task_newHandle (void *ptr)
*
* @param ptr pointer to object to be stored
* @return new object handle
*/
handle_t
task_newHandle (void *ptr)
{
/* Initialize the handle-to-ptr converter the first time we're called,
** or whenever we've restarted.
*/
if (numHandles == 0)
memset (taskHandles, 0, sizeof (taskHandles));
taskHandles[++numHandles] = (long) ptr;
return (numHandles);
}
/**
* TASK_FREEHANDLE -- Free the handle for later re-use.
*
* @brief Free the handle for later re-use.
* @fn task_freeHandle (handle_t handle)
*
* @param handle object handle
* @return nothing
*/
void
task_freeHandle (handle_t handle)
{
register int i, j;
void *ptr = task_H2P (handle);
if (handle <= 0) {
fprintf (stderr, "Error: Attempt to free zero handle!\n");
return;
}
for (i=1; i < MAX_HANDLES; i++) {
if ((void *) ptr == (void *) taskHandles[i]) {
for (j=i+1; j < MAX_HANDLES; j++) {
if (taskHandles[j])
taskHandles[i++] = taskHandles[j];
else
break;
}
numHandles = ((numHandles-1) >= 0 ? (numHandles-1) : 0);
break;
}
}
}
/**
* TASK_P2H -- Convert a pointer to a handle
*
* @brief Convert a pointer to a handle
* @fn handle_t task_P2H (void *ptr)
*
* @param ptr pointer to object
* @return handle to object, < 0 on error
*/
handle_t
task_P2H (void *ptr)
{
register int i;
for (i=1; i < MAX_HANDLES; i++) {
if ((void *) ptr == (void *) taskHandles[i])
return ((int) i);
}
return (-1);
}
/**
* TASK_H2P -- Convert a handle to a pointer
*
* @brief Convert a handle to a pointer
* @fn void *task_H2P (int handle)
*
* @param handle object handle
* @return pointer to object or NULL
*/
void *
task_H2P (handle_t handle)
{
return ((void *) taskHandles[handle]);
}
|