I think that the call to InterlockedCompareExchangePointer() can and should be
replaced by ordinary if and assignment. The synchronization it provides doesn't
seem to be necessary.

VH.


2005-05-29  Vaclav Haisman  <[EMAIL PROTECTED]>

        * thread.h (List_remove): Make node parameter const. Don't use
        InterlockedCompareExchangePointer.
Index: thread.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/thread.h,v
retrieving revision 1.92
diff -c -p -d -r1.92 thread.h
*** thread.h    28 May 2004 19:50:07 -0000      1.92
--- thread.h    29 May 2005 14:46:08 -0000
*************** List_insert (list_node *&head, list_node
*** 136,149 ****
  }
  
  template <class list_node> inline void
! List_remove (fast_mutex &mx, list_node *&head, list_node *node)
  {
    if (!node)
      return;
    mx.lock ();
    if (head)
      {
!       if (InterlockedCompareExchangePointer (&head, node->next, node) != node)
        {
          list_node *cur = head;
  
--- 136,151 ----
  }
  
  template <class list_node> inline void
! List_remove (fast_mutex &mx, list_node *&head, list_node const *node)
  {
    if (!node)
      return;
    mx.lock ();
    if (head)
      {
!       if (head == node)
!         head = head->next;
!       else
        {
          list_node *cur = head;

Reply via email to