sf_semaphore.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2022 StarFive Technology Co., Ltd.
  4. */
  5. #include "sf_semaphore.h"
  6. #include "SF_OMX_Core.h"
  7. OMX_ERRORTYPE SF_SemaphoreCreate(OMX_HANDLETYPE *semaphoreHandle)
  8. {
  9. sem_t *sema;
  10. sema = (sem_t *)malloc(sizeof(sem_t));
  11. if (!sema)
  12. return OMX_ErrorInsufficientResources;
  13. if (sem_init(sema, 0, 0) != 0) {
  14. free(sema);
  15. return OMX_ErrorUndefined;
  16. }
  17. *semaphoreHandle = (OMX_HANDLETYPE)sema;
  18. LOG(SF_LOG_INFO,"SF_SemaphoreCreate %p\r\n", sema);
  19. return OMX_ErrorNone;
  20. }
  21. OMX_ERRORTYPE SF_SemaphoreTerminate(OMX_HANDLETYPE semaphoreHandle)
  22. {
  23. sem_t *sema = (sem_t *)semaphoreHandle;
  24. if (sema == NULL)
  25. return OMX_ErrorBadParameter;
  26. if (sem_destroy(sema) != 0)
  27. return OMX_ErrorUndefined;
  28. free(sema);
  29. return OMX_ErrorNone;
  30. }
  31. OMX_ERRORTYPE SF_SemaphoreWait(OMX_HANDLETYPE semaphoreHandle)
  32. {
  33. LOG(SF_LOG_INFO,"SF_SemaphoreWait %p\r\n", semaphoreHandle);
  34. sem_t *sema = (sem_t *)semaphoreHandle;
  35. FunctionIn();
  36. if (sema == NULL)
  37. return OMX_ErrorBadParameter;
  38. if (sem_wait(sema) != 0)
  39. return OMX_ErrorUndefined;
  40. FunctionOut();
  41. return OMX_ErrorNone;
  42. }
  43. OMX_ERRORTYPE SF_SemaphorePost(OMX_HANDLETYPE semaphoreHandle)
  44. {
  45. sem_t *sema = (sem_t *)semaphoreHandle;
  46. FunctionIn();
  47. if (sema == NULL)
  48. return OMX_ErrorBadParameter;
  49. if (sem_post(sema) != 0)
  50. return OMX_ErrorUndefined;
  51. FunctionOut();
  52. return OMX_ErrorNone;
  53. }
  54. OMX_ERRORTYPE SF_Set_SemaphoreCount(OMX_HANDLETYPE semaphoreHandle, OMX_S32 val)
  55. {
  56. sem_t *sema = (sem_t *)semaphoreHandle;
  57. if (sema == NULL)
  58. return OMX_ErrorBadParameter;
  59. if (sem_init(sema, 0, val) != 0)
  60. return OMX_ErrorUndefined;
  61. return OMX_ErrorNone;
  62. }
  63. OMX_ERRORTYPE SF_Get_SemaphoreCount(OMX_HANDLETYPE semaphoreHandle, OMX_S32 *val)
  64. {
  65. sem_t *sema = (sem_t *)semaphoreHandle;
  66. int semaVal = 0;
  67. if (sema == NULL)
  68. return OMX_ErrorBadParameter;
  69. if (sem_getvalue(sema, &semaVal) != 0)
  70. return OMX_ErrorUndefined;
  71. *val = (OMX_S32)semaVal;
  72. return OMX_ErrorNone;
  73. }