pike.git / src / pike_macros.h

version» Context lines:

pike.git/src/pike_macros.h:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/      /* -  * $Id: pike_macros.h,v 1.21 2000/10/10 00:00:28 hubbe Exp $ +  * $Id: pike_macros.h,v 1.22 2000/12/14 07:22:31 mast Exp $    */   #ifndef MACROS_H   #define MACROS_H      #include <global.h>      #ifdef HAVE_SYS_PARAM_H   #include <sys/param.h>   #endif   
pike.git/src/pike_macros.h:66:    next=p->next; \    while(p->refs == 1 && (next=p->next)) \    { \    add_ref(next); \    free_item(p); \    p=next; \    } \    free_item(p); \   }while(0)    + /* This variant never leaves p pointing at a deallocated block, as the +  * one above can do. I.e. it frees a ref to the item p points at, and +  * sets p to the same or next item with references, or sets it to +  * zero. */ + #define FREE_AND_GET_REFERENCED(p, item_type, free_item) do { \ +  item_type *next; \ +  while (1) { \ +  if (p->refs > 1) { \ +  free_item(p); \ +  break; \ +  } \ +  if (!(next = p->next)) { \ +  free_item(p); \ +  p = 0; \ +  break; \ +  } \ +  add_ref(next); \ +  free_item(p); \ +  p = next; \ +  } \ + } while (0) +    #define DOUBLELINK(first_object, o) do { \    o->next=first_object; \    o->prev=0; \    if(first_object) first_object->prev=o; \    first_object=o; \   }while(0)      #define DOUBLEUNLINK(first_object,o) do{ \    if(o->prev) { \    o->prev->next=o->next; \