aboutsummaryrefslogtreecommitdiff
path: root/vendor/voclient/voapps/task/voTaskUtil.c
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]); 
}