sf_thread.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2022 StarFive Technology Co., Ltd.
  4. */
  5. #include "sf_thread.h"
  6. #include "SF_OMX_Core.h"
  7. OMX_ERRORTYPE CreateThread(THREAD_HANDLE_TYPE **threadHandle, OMX_PTR function_name, OMX_PTR argument)
  8. {
  9. FunctionIn();
  10. int result = 0;
  11. int detach_ret = 0;
  12. THREAD_HANDLE_TYPE *thread;
  13. OMX_ERRORTYPE ret = OMX_ErrorNone;
  14. thread = malloc(sizeof(THREAD_HANDLE_TYPE));
  15. memset(thread, 0, sizeof(THREAD_HANDLE_TYPE));
  16. pthread_attr_init(&thread->attr);
  17. if (thread->stack_size != 0)
  18. pthread_attr_setstacksize(&thread->attr, thread->stack_size);
  19. /* set priority */
  20. if (thread->schedparam.sched_priority != 0)
  21. pthread_attr_setschedparam(&thread->attr, &thread->schedparam);
  22. detach_ret = pthread_attr_setdetachstate(&thread->attr, PTHREAD_CREATE_JOINABLE);
  23. if (detach_ret != 0)
  24. {
  25. free(thread);
  26. *threadHandle = NULL;
  27. ret = OMX_ErrorUndefined;
  28. goto EXIT;
  29. }
  30. result = pthread_create(&thread->pthread, &thread->attr, function_name, (void *)argument);
  31. /* pthread_setschedparam(thread->pthread, SCHED_RR, &thread->schedparam); */
  32. switch (result)
  33. {
  34. case 0:
  35. *threadHandle = thread;
  36. ret = OMX_ErrorNone;
  37. break;
  38. case EAGAIN:
  39. free(thread);
  40. *threadHandle = NULL;
  41. ret = OMX_ErrorInsufficientResources;
  42. break;
  43. default:
  44. free(thread);
  45. *threadHandle = NULL;
  46. ret = OMX_ErrorUndefined;
  47. break;
  48. }
  49. EXIT:
  50. FunctionOut();
  51. return ret;
  52. }
  53. void ThreadExit(void *value_ptr)
  54. {
  55. pthread_exit(value_ptr);
  56. return;
  57. }