;;; -*- Mode:Lisp; Readtable:CL; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for System version 123.49
;;; Reason:
;;;  net:free-packet checks that the int-pkt-thread is NIL -- if it isn't, the
;;;  packet is already free.
;;; Written 12-Oct-87 15:05:00 by pld at site LMI Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.48, Experimental Local-File 73.0, Experimental FILE-Server 22.0, Experimental Unix-Interface 11.0, Experimental Tape 18.0, Experimental KERMIT 34.0, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, microcode 1754, SDU Boot Tape 3.12, SDU ROM 8.


; From modified file DJ: L.NETWORK.KERNEL; PACKETS.LISP#18 at 12-Oct-87 15:05:11
#10R NETWORK#: 
(COMPILER-LET ((*PACKAGE* (GLOBAL:PKG-FIND-PACKAGE "NETWORK")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERNEL; PACKETS  "

(defun free-packet (int-pkt)
  "Returns an INT-PKT to the free list"
  ;;Allow a displaced array to be freed (presumeably skipping link-level headers, etc.)
  (setq int-pkt (original-array int-pkt))
  (unless (check-packet int-pkt)
    (error "Attempt to free non-interrupt packet ~A" int-pkt))
  (unless (null (int-pkt-thread int-pkt))
    (error "Attempt to free an already-freed int-pkt"))
  (prog (old-free-list)
     loop
	(setq old-free-list (int-free-list))
	(setf (int-pkt-thread int-pkt) old-free-list)
	(or (sys:%store-conditional int-free-list-pointer old-free-list int-pkt)
	    (go loop))
	(sys:%chaos-wakeup)))

))
