diff options
Diffstat (limited to 'halimpl/osi/osi_main.cc')
-rw-r--r-- | halimpl/osi/osi_main.cc | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/halimpl/osi/osi_main.cc b/halimpl/osi/osi_main.cc new file mode 100644 index 0000000..9b67265 --- /dev/null +++ b/halimpl/osi/osi_main.cc @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2013 SAMSUNG S.LSI + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <pthread.h> +#include <stdlib.h> +#include <string.h> +#include "hal.h" +#include "osi.h" + +#include <errno.h> +#include <time.h> + +int osi_debug_level; +tOSI_INFO osi_info; + +OSI_STATE OSI_init(void) { + int32_t index; + + memset(&osi_info, 0, sizeof(osi_info)); + + /* Initialize lock */ + pthread_mutex_init(&osi_info.mutex, NULL); + + /* Initialize task information */ + for (index = 0; index < OSI_MAX_TASK; index++) { + osi_info.task[index].state = OSI_FREE; + } + + /* Initialize memory information */ + osi_info.mem_max_cnt = OSI_MAX_MEM_POOL; + for (index = 0; index < OSI_MAX_MEM_POOL; index++) { +#ifdef OSI_USE_DYNAMIC_BUF + osi_info.mem[index] = (tOSI_MEM_HANDLER)malloc(OSI_MEM_POOL_SIZE); + if (osi_info.mem[index] == NULL) { + OSI_loge("%s : maximum conut of buffer is set to %d, (expected: %d)", + index, OSI_MAX_MEM_POOL); + osi_info.mem_max_cnt = index; + break; + } + osi_info.mem[index]->state = OSI_FREE; +#else + osi_info.mem[index].state = OSI_FREE; +#endif + } + + /* Initialize queue information */ + osi_info.queue_max_cnt = OSI_MAX_QUEUE; + for (index = 0; index < OSI_MAX_QUEUE; index++) { + osi_info.queue[index].state = OSI_FREE; + osi_info.queue[index].tail = OSI_QUEUE_SIZE; + } + + /* Initialize timer information */ + for (index = 0; index < OSI_MAX_TIMER; index++) { + osi_info.timer[index].state = OSI_FREE; + osi_info.timer[index].name = NULL; + osi_info.timer[index].callback = NULL; + osi_info.timer[index].callback_param = NULL; + } + + return OSI_OK; +} + +void OSI_deinit() { + int index; +#ifdef OSI_USE_DYNAMIC_BUF + for (index = 0; index < osi_info.mem_max_cnt; index++) { + if (osi_info.mem[index]) free(osi_info.mem[index]); + } +#endif + + /* deinitialize timer */ + for (index = 0; index < OSI_MAX_TIMER; index++) { + OSI_timer_free(&osi_info.timer[index]); + } + osi_info.usingTimer = 0; +} + +void osi_lock() { pthread_mutex_lock(&osi_info.mutex); } + +void osi_unlock() { pthread_mutex_unlock(&osi_info.mutex); } + +void OSI_delay(uint32_t timeout) { + struct timespec delay; + int err; + + delay.tv_sec = timeout / 1000; + delay.tv_nsec = 1000 * 1000 * (timeout % 1000); + + do { + err = nanosleep(&delay, &delay); + } while (err < 0 && errno == EINTR); +} |