commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd] 07/28: libdiskfs: Factorize code for last hard reference being re


From: Samuel Thibault
Subject: [hurd] 07/28: libdiskfs: Factorize code for last hard reference being released
Date: Wed, 16 Nov 2016 08:30:26 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch upstream
in repository hurd.

commit 9ddc4f2a1717455e50eb6fd010cda4e5f4080c42
Author: Samuel Thibault <address@hidden>
Date:   Mon Oct 31 19:18:41 2016 +0100

    libdiskfs: Factorize code for last hard reference being released
    
    * libdiskfs/node-lastref.c: New file
    * libdiskfs/Makefile (OTHERSRCS): Add node-lastref.c
    * libdiskfs/libdiskfs/node-nput.c (diskfs_nput): Replace last hard reference
    code with a call to _diskfs_lastref.
    * libdiskfs/node-nrele.c (diskfs_nrele): Likewise.
---
 libdiskfs/Makefile       |  4 ++--
 libdiskfs/node-lastref.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
 libdiskfs/node-nput.c    | 24 +-----------------------
 libdiskfs/node-nrele.c   | 22 +---------------------
 libdiskfs/priv.h         |  4 ++++
 5 files changed, 57 insertions(+), 46 deletions(-)

diff --git a/libdiskfs/Makefile b/libdiskfs/Makefile
index 803761d..93c96fa 100644
--- a/libdiskfs/Makefile
+++ b/libdiskfs/Makefile
@@ -40,8 +40,8 @@ IFSOCKSRCS=ifsock.c
 OTHERSRCS = conch-fetch.c conch-set.c dir-clear.c dir-init.c dir-renamed.c \
        extern-inline.c \
        node-create.c node-drop.c node-make.c node-rdwr.c node-update.c \
-       node-nref.c node-nput.c node-nrele.c node-nrefl.c node-nputl.c \
-       node-nrelel.c node-cache.c \
+       node-nref.c node-nput.c node-nrele.c node-lastref.c node-nrefl.c \
+       node-nputl.c node-nrelel.c node-cache.c \
        peropen-make.c peropen-rele.c protid-make.c protid-rele.c \
        init-init.c init-startup.c init-first.c init-main.c \
        rdwr-internal.c boot-start.c demuxer.c node-times.c shutdown.c \
diff --git a/libdiskfs/node-lastref.c b/libdiskfs/node-lastref.c
new file mode 100644
index 0000000..068566a
--- /dev/null
+++ b/libdiskfs/node-lastref.c
@@ -0,0 +1,49 @@
+/*
+   Copyright (C) 1999 Free Software Foundation, Inc.
+   Written by Thomas Bushnell, BSG.
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. */
+
+#include "priv.h"
+
+/* Called when the last hard reference is released.  If there are no
+   links, then request soft references to be dropped.  */
+void
+_diskfs_lastref (struct node *np)
+{
+  /* This is our cue that something akin to "last process closes file"
+     in the POSIX.1 sense happened, so make sure any pending node time
+     updates now happen in a timely fashion.  */
+  diskfs_set_node_times (np);
+  diskfs_lost_hardrefs (np);
+  if (!np->dn_stat.st_nlink)
+    {
+      if (np->sockaddr != MACH_PORT_NULL)
+       {
+         mach_port_deallocate (mach_task_self (), np->sockaddr);
+         np->sockaddr = MACH_PORT_NULL;
+       }
+
+      /* There are no links.  If there are soft references that
+        can be dropped, we can't let them postpone deallocation.
+        So attempt to drop them.  But that's a user-supplied
+        routine, which might result in further recursive calls to
+        the ref-counting system.  This is not a problem, as we
+        hold a weak reference ourselves. */
+      diskfs_try_dropping_softrefs (np);
+    }
+}
diff --git a/libdiskfs/node-nput.c b/libdiskfs/node-nput.c
index d59769b..73f6b2c 100644
--- a/libdiskfs/node-nput.c
+++ b/libdiskfs/node-nput.c
@@ -34,29 +34,7 @@ diskfs_nput (struct node *np)
   refcounts_demote (&np->refcounts, &result);
 
   if (result.hard == 0)
-    {
-      /* This is our cue that something akin to "last process closes file"
-        in the POSIX.1 sense happened, so make sure any pending node time
-        updates now happen in a timely fashion.  */
-      diskfs_set_node_times (np);
-      diskfs_lost_hardrefs (np);
-      if (!np->dn_stat.st_nlink)
-       {
-         if (np->sockaddr != MACH_PORT_NULL)
-           {
-             mach_port_deallocate (mach_task_self (), np->sockaddr);
-             np->sockaddr = MACH_PORT_NULL;
-           }
-
-         /* There are no links.  If there are soft references that
-            can be dropped, we can't let them postpone deallocation.
-            So attempt to drop them.  But that's a user-supplied
-            routine, which might result in further recursive calls to
-            the ref-counting system.  This is not a problem, as we
-            hold a weak reference ourselves. */
-         diskfs_try_dropping_softrefs (np);
-       }
-    }
+    _diskfs_lastref (np);
 
   /* Finally get rid of our reference.  */
   refcounts_deref_weak (&np->refcounts, &result);
diff --git a/libdiskfs/node-nrele.c b/libdiskfs/node-nrele.c
index 7368835..6b7b707 100644
--- a/libdiskfs/node-nrele.c
+++ b/libdiskfs/node-nrele.c
@@ -40,27 +40,7 @@ diskfs_nrele (struct node *np)
     {
       locked = TRUE;
       pthread_mutex_lock (&np->lock);
-      /* This is our cue that something akin to "last process closes file"
-        in the POSIX.1 sense happened, so make sure any pending node time
-        updates now happen in a timely fashion.  */
-      diskfs_set_node_times (np);
-      diskfs_lost_hardrefs (np);
-      if (!np->dn_stat.st_nlink)
-       {
-         if (np->sockaddr != MACH_PORT_NULL)
-           {
-             mach_port_deallocate (mach_task_self (), np->sockaddr);
-             np->sockaddr = MACH_PORT_NULL;
-           }
-
-         /* There are no links.  If there are soft references that
-            can be dropped, we can't let them postpone deallocation.
-            So attempt to drop them.  But that's a user-supplied
-            routine, which might result in further recursive calls to
-            the ref-counting system.  This is not a problem, as we
-            hold a weak reference ourselves. */
-         diskfs_try_dropping_softrefs (np);
-       }
+      _diskfs_lastref (np);
     }
 
   /* Finally get rid of our reference.  */
diff --git a/libdiskfs/priv.h b/libdiskfs/priv.h
index 2ac3c9e..276d093 100644
--- a/libdiskfs/priv.h
+++ b/libdiskfs/priv.h
@@ -96,6 +96,10 @@ void _diskfs_boot_privports (void);
 /* Clean routine for control port. */
 void _diskfs_control_clean (void *);
 
+/* Called when the last hard reference is released.  If there are no
+   links, then request soft references to be dropped.  */
+void _diskfs_lastref (struct node *np);
+
 /* Number of outstanding PT_CTL ports. */
 extern int _diskfs_ncontrol_ports;
 

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/hurd.git



reply via email to

[Prev in Thread] Current Thread [Next in Thread]