/* ******************************************************************************* * Copyright (c) 1996 Martin Poole ******************************************************************************* ** ** WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! ** ** Any changes to be made to this file should first be checked with ** mplib1 source control for library integrity. ** ** mplib1 source control can be reached at mplib1@quatermass.co.uk ** * * $Source: /home/cvs/cvsroot/onelan/onelan/src/mplib1/libsrc/bpo_l_003.c,v $ * $Author: mpoole $ * $Date: 2002/10/07 09:37:36 $ * $Revision: 1.2 $ * ******************************************************************************* * * Change History * * $Log: bpo_l_003.c,v $ * Revision 1.2 2002/10/07 09:37:36 mpoole * Initial checkin of mplib1-3.1.0 * * Revision 1.1 2002/10/07 09:36:53 mpoole * Initial checkin of mplib1-3.1.0 * * ******************************************************************************* */ #ident "$Header: /home/cvs/cvsroot/onelan/onelan/src/mplib1/libsrc/bpo_l_003.c,v 1.2 2002/10/07 09:37:36 mpoole Exp $" /* ------------------------------------------------------------------ Include files ------------------------------------------------------------------ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* ------------------------------------------------------------------ defines ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ Code starts here ------------------------------------------------------------------ */ bpo_Node_t * bpo_Remove_List_Node( bpo_List_t *lp, bpo_Node_t *node1 ) { bpo_Node_t *nnode,*pnode; void *base; /* Ensure we have a list that is in shared, and that the supplied node is in the same shared segment. */ if ( lp && (base = Get_SODB_Base( lp )) && (base == Get_SODB_Base( node1 )) ) { /* Lock the list whilst we test the proerties of it and the node */ bpo_pid_Lock( &lp->lno_Pid_Lock ); /* Does the node look valid ? It should have forward and back offsets and should be in the designated list */ if ( node1->lno_Succ && node1->lno_Pred && node1->lno_List && (node1->lno_List == lp->lno_me) ) { /* get pointers to the surrounding nodes */ nnode = GNNODE( node1, node1->lno_Succ ); pnode = GNNODE( node1, node1->lno_Pred ); /* relink the list around the node we are removing */ if (nnode && nnode->lno_Pred == node1->lno_me) nnode->lno_Pred = node1->lno_Pred; if (pnode && pnode->lno_Succ == node1->lno_me) pnode->lno_Succ = node1->lno_Succ; /* do the list housekeeping */ lp->lno_count--; lp->lno_serial_nbr++; /* and clean up the node for next use */ node1->lno_Succ = 0; node1->lno_Pred = 0; node1->lno_List = 0; }else node1=NULL; /* Unlock and off we go */ bpo_pid_Unlock( &lp->lno_Pid_Lock ); }else node1=NULL; return(node1); } bpo_Node_t * bpo_Remove_Node( bpo_Node_t *node1 ) { return( bpo_Remove_List_Node( GRPTR( node1, node1->lno_List ), node1 ) ); } /* -- End of File -- */