srv0que.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Server query execution
  3. (c) 1996 Innobase Oy
  4. Created 6/5/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "srv0que.h"
  7. #include "srv0srv.h"
  8. #include "sync0sync.h"
  9. #include "os0thread.h"
  10. #include "usr0sess.h"
  11. #include "que0que.h"
  12. /**************************************************************************
  13. Checks if there is work to do in the server task queue. If there is, the
  14. thread starts processing a task. Before leaving, it again checks the task
  15. queue and picks a new task if any exists. This is called by a SRV_WORKER
  16. thread. */
  17. void
  18. srv_que_task_queue_check(void)
  19. /*==========================*/
  20. {
  21. que_thr_t* thr;
  22. for (;;) {
  23. mutex_enter(&kernel_mutex);
  24. thr = UT_LIST_GET_FIRST(srv_sys->tasks);
  25. if (thr == NULL) {
  26. mutex_exit(&kernel_mutex);
  27. return;
  28. }
  29. UT_LIST_REMOVE(queue, srv_sys->tasks, thr);
  30. mutex_exit(&kernel_mutex);
  31. que_run_threads(thr);
  32. }
  33. }
  34. /**************************************************************************
  35. Performs round-robin on the server tasks. This is called by a SRV_WORKER
  36. thread every second or so. */
  37. que_thr_t*
  38. srv_que_round_robin(
  39. /*================*/
  40. /* out: the new (may be == thr) query thread
  41. to run */
  42. que_thr_t* thr) /* in: query thread */
  43. {
  44. que_thr_t* new_thr;
  45. ut_ad(thr);
  46. ut_ad(thr->state == QUE_THR_RUNNING);
  47. mutex_enter(&kernel_mutex);
  48. UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
  49. new_thr = UT_LIST_GET_FIRST(srv_sys->tasks);
  50. mutex_exit(&kernel_mutex);
  51. return(new_thr);
  52. }
  53. /**************************************************************************
  54. Enqueues a task to server task queue and releases a worker thread, if there
  55. is a suspended one. */
  56. void
  57. srv_que_task_enqueue_low(
  58. /*=====================*/
  59. que_thr_t* thr) /* in: query thread */
  60. {
  61. ut_ad(thr);
  62. #ifdef UNIV_SYNC_DEBUG
  63. ut_ad(mutex_own(&kernel_mutex));
  64. #endif /* UNIV_SYNC_DEBUG */
  65. UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
  66. srv_release_threads(SRV_WORKER, 1);
  67. }
  68. /**************************************************************************
  69. Enqueues a task to server task queue and releases a worker thread, if there
  70. is a suspended one. */
  71. void
  72. srv_que_task_enqueue(
  73. /*=================*/
  74. que_thr_t* thr) /* in: query thread */
  75. {
  76. ut_ad(thr);
  77. ut_a(0); /* Under MySQL this is never called */
  78. mutex_enter(&kernel_mutex);
  79. srv_que_task_enqueue_low(thr);
  80. mutex_exit(&kernel_mutex);
  81. }