Commit cbdd54e4 authored by unknown's avatar unknown
Browse files

Fix SLEEP() to be interruptable. (Bug #12582)


include/my_global.h:
  Add set_timespec_nsec() for setting higher-resolution time.
sql/item_func.cc:
  Use pthread_cond_timedwait() for SLEEP() so that it can be killed
  using the normal thread/query-killing code.
parent 8fd77a04
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -939,6 +939,13 @@ typedef char bool; /* Ordinary boolean values 0 1 */
#endif /* HAVE_TIMESPEC_TS_SEC */
#endif /* set_timespec */

#define set_timespec_nsec(ABSTIME,NSEC) \
{\
  ulonglong now= my_getsystime(); \
  (ABSTIME).tv_sec= (now / ULL(10000000)) + (NSEC / ULL(1000000000)); \
  (ABSTIME).tv_nsec= (now % ULL(10000000)) * 100 + (NSEC % ULL(1000000000)); \
}

/*
  Define-funktions for reading and storing in machine independent format
  (low byte first)
+28 −2
Original line number Diff line number Diff line
@@ -3266,10 +3266,36 @@ void Item_func_benchmark::print(String *str)

longlong Item_func_sleep::val_int()
{
  THD *thd= current_thd;
  struct timespec abstime;
  pthread_cond_t cond;
  int error= 0;

  DBUG_ASSERT(fixed == 1);

  double time= args[0]->val_real();
  my_sleep((ulong)time*1000000L);
  return 0;
  set_timespec_nsec(abstime, (ulonglong)(time * ULL(1000000000)));

  pthread_cond_init(&cond, NULL);
  pthread_mutex_lock(&LOCK_user_locks);

  thd->mysys_var->current_mutex= &LOCK_user_locks;
  thd->mysys_var->current_cond=  &cond;

  while (!thd->killed &&
         (error= pthread_cond_timedwait(&cond, &LOCK_user_locks,
                                        &abstime) != ETIMEDOUT) &&
         error != EINVAL) ;

  pthread_mutex_lock(&thd->mysys_var->mutex);
  thd->mysys_var->current_mutex= 0;
  thd->mysys_var->current_cond=  0;
  pthread_mutex_unlock(&thd->mysys_var->mutex);

  pthread_mutex_unlock(&LOCK_user_locks);
  pthread_cond_destroy(&cond);

  return (error == ETIMEDOUT) ? 0 : 1;
}