Re: [PATCHES] Win32 CHECK_FOR_INTERRUPTS() performance

Поиск
Список
Период
Сортировка
От Andrew Dunstan
Тема Re: [PATCHES] Win32 CHECK_FOR_INTERRUPTS() performance
Дата
Msg-id 4359A1D1.2040304@dunslane.net
обсуждение исходный текст
Ответ на Re: [PATCHES] Win32 CHECK_FOR_INTERRUPTS() performance  (Andrew Dunstan <andrew@dunslane.net>)
Список pgsql-hackers
And the patch that was applied gives the same result.

What is more, I am not seeing the reported speedup - in fact I am seeing 
no speedup worth mentioning.

This is on XP-Pro, with default postgres settings. The test sets were 
somewhat larger than thos Magnus used - basically TPC-H lineitems and 
orders tables (6m and 1.5m rows respectively).

cheers

andrew


Andrew Dunstan wrote:

>
> Heads up - I have seen 2 regression hangs. I am checking further. Has 
> anyone else run the regression suite with any version of this patch?
>
> cheers
>
> andrew
>
> Tom Lane wrote:
>
>> I wrote:
>>  
>>
>>> BTW, expanding on Andrew's comment, ISTM we could move the kernel call
>>> out of the macro, ie make it look like ...
>>>   
>>
>>
>> I've applied the attached version of Qingqing's revised patch.  I'm not
>> in a position to test it, and am about to go out for the evening, but if
>> anyone can check the committed version soon and verify that I didn't
>> break anything ...
>>
>> (BTW, DLLIMPORT is only needed in extern declarations, not in the actual
>> definition of the variable.)
>>
>>             regards, tom lane
>>
>> *** src/backend/port/win32/signal.c.orig    Fri Oct 14 22:59:56 2005
>> --- src/backend/port/win32/signal.c    Fri Oct 21 17:36:24 2005
>> ***************
>> *** 15,32 ****
>>  
>>  #include <libpq/pqsignal.h>
>>  
>> ! ! /* pg_signal_crit_sec is used to protect only pg_signal_queue. 
>> That is the only
>> !  * variable that can be accessed from the signal sending threads! */
>>  static CRITICAL_SECTION pg_signal_crit_sec;
>> - static int    pg_signal_queue;
>>  
>>  static pqsigfunc pg_signal_array[PG_SIGNAL_COUNT];
>>  static pqsigfunc pg_signal_defaults[PG_SIGNAL_COUNT];
>> - static int    pg_signal_mask;
>> - - DLLIMPORT HANDLE pgwin32_signal_event;
>> - HANDLE        pgwin32_initial_signal_pipe = INVALID_HANDLE_VALUE;
>>  
>>  
>>  /* Signal handling thread function */
>> --- 15,40 ----
>>  
>>  #include <libpq/pqsignal.h>
>>  
>> ! /*
>> !  * These are exported for use by the UNBLOCKED_SIGNAL_QUEUE() macro.
>> !  * pg_signal_queue must be volatile since it is changed by the signal
>> !  * handling thread and inspected without any lock by the main thread.
>> !  * pg_signal_mask is only changed by main thread so shouldn't need it.
>> !  */
>> ! volatile int pg_signal_queue;
>> ! int        pg_signal_mask;
>> ! ! HANDLE    pgwin32_signal_event;
>> ! HANDLE    pgwin32_initial_signal_pipe = INVALID_HANDLE_VALUE;
>> ! ! /*
>> !  * pg_signal_crit_sec is used to protect only pg_signal_queue. That 
>> is the only
>> !  * variable that can be accessed from the signal sending threads!
>> !  */
>>  static CRITICAL_SECTION pg_signal_crit_sec;
>>  
>>  static pqsigfunc pg_signal_array[PG_SIGNAL_COUNT];
>>  static pqsigfunc pg_signal_defaults[PG_SIGNAL_COUNT];
>>  
>>  
>>  /* Signal handling thread function */
>> ***************
>> *** 81,101 ****
>>                  (errmsg_internal("failed to set console control 
>> handler")));
>>  }
>>  
>>  
>> ! /* Dispatch all signals currently queued and not blocked
>>   * Blocked signals are ignored, and will be fired at the time of
>> !  * the sigsetmask() call. */
>>  void
>>  pgwin32_dispatch_queued_signals(void)
>>  {
>>      int            i;
>>  
>>      EnterCriticalSection(&pg_signal_crit_sec);
>> !     while (pg_signal_queue & ~pg_signal_mask)
>>      {
>>          /* One or more unblocked signals queued for execution */
>> ! !         int            exec_mask = pg_signal_queue & 
>> ~pg_signal_mask;
>>  
>>          for (i = 0; i < PG_SIGNAL_COUNT; i++)
>>          {
>> --- 89,119 ----
>>                  (errmsg_internal("failed to set console control 
>> handler")));
>>  }
>>  
>> + /*
>> +  * Support routine for CHECK_FOR_INTERRUPTS() macro
>> +  */
>> + void
>> + pgwin32_check_queued_signals(void)
>> + {
>> +     if (WaitForSingleObjectEx(pgwin32_signal_event, 0, TRUE) == 
>> WAIT_OBJECT_0)
>> +         pgwin32_dispatch_queued_signals();
>> + }
>>  
>> ! /*
>> !  * Dispatch all signals currently queued and not blocked
>>   * Blocked signals are ignored, and will be fired at the time of
>> !  * the sigsetmask() call.
>> !  */
>>  void
>>  pgwin32_dispatch_queued_signals(void)
>>  {
>>      int            i;
>>  
>>      EnterCriticalSection(&pg_signal_crit_sec);
>> !     while (UNBLOCKED_SIGNAL_QUEUE())
>>      {
>>          /* One or more unblocked signals queued for execution */
>> !         int            exec_mask = UNBLOCKED_SIGNAL_QUEUE();
>>  
>>          for (i = 0; i < PG_SIGNAL_COUNT; i++)
>>          {
>> *** src/include/miscadmin.h.orig    Fri Oct 14 23:00:22 2005
>> --- src/include/miscadmin.h    Fri Oct 21 17:36:18 2005
>> ***************
>> *** 83,97 ****
>>      if (InterruptPending) \
>>          ProcessInterrupts(); \
>>  } while(0)
>>  #else                            /* WIN32 */
>>  
>>  #define CHECK_FOR_INTERRUPTS() \
>>  do { \
>> !     if (WaitForSingleObjectEx(pgwin32_signal_event,0,TRUE) == 
>> WAIT_OBJECT_0) \
>> !         pgwin32_dispatch_queued_signals(); \
>>      if (InterruptPending) \
>>          ProcessInterrupts(); \
>>  } while(0)
>>  #endif   /* WIN32 */
>>  
>>  
>> --- 83,99 ----
>>      if (InterruptPending) \
>>          ProcessInterrupts(); \
>>  } while(0)
>> +  #else                            /* WIN32 */
>>  
>>  #define CHECK_FOR_INTERRUPTS() \
>>  do { \
>> !     if (UNBLOCKED_SIGNAL_QUEUE()) \
>> !         pgwin32_check_queued_signals(); \
>>      if (InterruptPending) \
>>          ProcessInterrupts(); \
>>  } while(0)
>> +  #endif   /* WIN32 */
>>  
>>  
>> *** src/include/port/win32.h.orig    Fri Oct 14 23:00:30 2005
>> --- src/include/port/win32.h    Fri Oct 21 17:36:12 2005
>> ***************
>> *** 214,224 ****
>>  
>>  
>>  /* In backend/port/win32/signal.c */
>> ! extern DLLIMPORT HANDLE pgwin32_signal_event;
>>  extern HANDLE pgwin32_initial_signal_pipe;
>>  
>>  void        pgwin32_signal_initialize(void);
>>  HANDLE        pgwin32_create_signal_listener(pid_t pid);
>>  void        pgwin32_dispatch_queued_signals(void);
>>  void        pg_queue_signal(int signum);
>>  
>> --- 214,230 ----
>>  
>>  
>>  /* In backend/port/win32/signal.c */
>> ! extern DLLIMPORT volatile int pg_signal_queue;
>> ! extern DLLIMPORT int pg_signal_mask;
>> ! extern HANDLE pgwin32_signal_event;
>>  extern HANDLE pgwin32_initial_signal_pipe;
>>  
>> + #define UNBLOCKED_SIGNAL_QUEUE()    (pg_signal_queue & 
>> ~pg_signal_mask)
>> + +  void        pgwin32_signal_initialize(void);
>>  HANDLE        pgwin32_create_signal_listener(pid_t pid);
>> + void        pgwin32_check_queued_signals(void);
>>  void        pgwin32_dispatch_queued_signals(void);
>>  void        pg_queue_signal(int signum);
>>  
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 9: In versions below 8.0, the planner will ignore your desire to
>>       choose an index scan if your joining column's datatypes do not
>>       match
>>
>>  
>>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: Don't 'kill -9' the postmaster
>


В списке pgsql-hackers по дате отправления:

Предыдущее
От: "Sean Utt"
Дата:
Сообщение: Re: Question about Ctrl-C and less
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [PATCHES] Win32 CHECK_FOR_INTERRUPTS() performance