blob: c3a10863d573f3c8252ea30c5df39dec175f9355 [file] [log] [blame]
// Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <assert.h>
#include "error.h"
#include "handle.h"
#include "sdk.h"
#include "wimax.h"
#include "device.h"
#include "log.h"
pthread_mutex_t api_handle_lock;
struct list_head api_handle_list;
void hand_init(void)
{
INIT_LIST_HEAD(&api_handle_list);
pthread_mutex_init(&api_handle_lock, NULL);
}
void hand_deinit(void)
{
struct list_head *head = &api_handle_list;
api_hand_t *handle, *tmp;
pthread_mutex_lock(&api_handle_lock);
list_for_each_entry_safe(handle, tmp, head, list) {
list_del(&handle->list);
if (handle->api)
sdk_free(handle->api);
sdk_free(handle);
}
pthread_mutex_unlock(&api_handle_lock);
pthread_mutex_destroy(&api_handle_lock);
}
api_hand_t *hand_alloc_api(void)
{
struct list_head *head = hand_get_api_handle_list();
api_hand_t *handle;
handle = (api_hand_t *) sdk_malloc(sizeof(api_hand_t));
assert(handle != NULL);
memset(handle, 0, sizeof(api_hand_t));
handle->struct_size = sizeof(api_hand_t);
pthread_mutex_lock(&api_handle_lock);
list_add(&handle->list, head);
pthread_mutex_unlock(&api_handle_lock);
return handle;
}
int hand_free_api(api_hand_t *handle)
{
pthread_mutex_lock(&api_handle_lock);
list_del(&handle->list);
pthread_mutex_unlock(&api_handle_lock);
sdk_free(handle);
return 0;
}
dev_hand_t *hand_alloc_dev(int dev_idx)
{
device_t *dev;
dev_hand_t *handle;
if (!(dev = dm_get_dev(dev_idx)))
return NULL;
handle = (dev_hand_t *) sdk_malloc(sizeof(dev_hand_t));
assert(handle != NULL);
memset(handle, 0, sizeof(dev_hand_t));
handle->dev_idx = dev_idx;
handle->struct_size = sizeof(dev_hand_t);
dm_put_dev(dev_idx);
return handle;
}
int hand_free_dev(dev_hand_t *handle)
{
if (handle == NULL) {
xprintf(SDK_ERR, "handle is NULL\n");
return sdk_set_errno(ERR_INVALID);
}
if (handle->struct_size != sizeof(dev_hand_t)) {
xprintf(SDK_ERR, "handle->struct_size(0x%08X!=0x%08X) is invalid\n",
handle->struct_size, sizeof(dev_hand_t));
return sdk_set_errno(ERR_INVALID);
}
sdk_free(handle);
return 0;
}