+captive_leave() to replace g_idle*() function calls postponing
authorshort <>
Thu, 1 May 2003 09:17:03 +0000 (09:17 +0000)
committershort <>
Thu, 1 May 2003 09:17:03 +0000 (09:17 +0000)
 - g_idle*() can get executed during KeWaitForSingleObject()
+captive_usecount() to track no-files-open state of libcaptive
 - unused now; to be utilized for safe fs unmount-commit-remount points

src/libcaptive/client/Makefile.am
src/libcaptive/client/directory.c
src/libcaptive/client/file.c
src/libcaptive/include/captive/Makefile.am

index 7b21b0c..54622cb 100644 (file)
@@ -1,6 +1,6 @@
 # $Id$
 # automake source for the client interface of libcaptive Makefile 
-# Copyright (C) 2002 Jan Kratochvil <project-captive@jankratochvil.net>
+# Copyright (C) 2002-2003 Jan Kratochvil <project-captive@jankratochvil.net>
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,17 +21,19 @@ include $(top_srcdir)/src/libcaptive/Makefile-libcaptive.am
 
 noinst_LTLIBRARIES=libclient.la
 libclient_la_SOURCES= \
-               init.c \
-               lib.c \
-               lib.h \
                directory.c \
                directory.h \
                file.c \
                file.h \
                giochannel-blind.c \
                giochannel-blind.h \
+               init.c \
+               leave.c \
+               lib.c \
+               lib.h \
                result.c \
-               result.h
+               result.h \
+               usecount.c
 libclient_la_CFLAGS= \
                $(GNOME_VFS_MODULE_CFLAGS)
 libclient_la_LIBADD= \
index 534e5f8..e77e76f 100644 (file)
@@ -29,6 +29,8 @@
 #include "reactos/ddk/iofuncs.h"       /* for IoCreateFile() */
 #include "captive/sandbox.h"
 #include "result.h"
+#include "captive/leave.h"
+#include "captive/usecount.h"
 
 
 static gpointer captive_directory_object_parent_class=NULL;
@@ -102,9 +104,6 @@ IO_STATUS_BLOCK dir_IoStatusBlock;
 NTSTATUS err;
 CaptiveDirectoryObject *captive_directory_object;
 
-       if (CAPTIVE_IS_SANDBOX_PARENT())
-               return captive_sandbox_parent_directory_new_open(captive_directory_object_return,pathname);
-
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
@@ -159,24 +158,41 @@ CaptiveDirectoryObject *captive_directory_object;
 GnomeVFSResult captive_directory_new_open(CaptiveDirectoryObject **captive_directory_object_return,
                const gchar *pathname)
 {
+GnomeVFSResult r;
+
+       if (CAPTIVE_IS_SANDBOX_PARENT())
+               return captive_sandbox_parent_directory_new_open(captive_directory_object_return,pathname);
+
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       return captive_directory_new_internal(captive_directory_object_return,pathname,
+       r=captive_directory_new_internal(captive_directory_object_return,pathname,
                        FALSE,  /* create */
                        0);     /* create_perm; ignored */
+
+       captive_leave();
+       if (r==GNOME_VFS_OK)
+               captive_usecount(+1);
+       return r;
 }
 
 
 GnomeVFSResult captive_directory_new_make(CaptiveDirectoryObject **captive_directory_object_return,
                const gchar *pathname,guint perm)
 {
+GnomeVFSResult r;
+
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       return captive_directory_new_internal(captive_directory_object_return,pathname,
+       r=captive_directory_new_internal(captive_directory_object_return,pathname,
                        TRUE,   /* create */
                        perm);  /* create_perm; ignored */
+
+       captive_leave();
+       if (r==GNOME_VFS_OK)
+               captive_usecount(+1);
+       return r;
 }
 
 
@@ -334,11 +350,14 @@ HANDLE dir_Handle;
        g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_directory_object->dir_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);        /* already closed */
 
+       captive_usecount(-1);   /* close() errors notwithstanding */
+
        dir_Handle=captive_directory_object->dir_Handle;
        captive_directory_object->dir_Handle=NULL;
        err=NtClose(dir_Handle);
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -432,6 +451,7 @@ retry:
                        &dir_IoStatusBlock);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -458,5 +478,6 @@ GnomeVFSResult errvfsresult;
                return errvfsresult;
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
index 610b954..2f41332 100644 (file)
@@ -33,6 +33,8 @@
 #include "captive/client-directory.h"
 #include "reactos/ddk/obfuncs.h"       /* for ObReferenceObjectByHandle() */
 #include "captive/macros.h"
+#include "captive/leave.h"
+#include "captive/usecount.h"
 
 
 static gpointer captive_file_object_parent_class=NULL;
@@ -165,26 +167,40 @@ NTSTATUS err;
 GnomeVFSResult captive_file_new_open
                (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode)
 {
+GnomeVFSResult r;
+
        g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       return captive_file_new_internal(captive_file_object_return,pathname,mode,
+       r=captive_file_new_internal(captive_file_object_return,pathname,mode,
                        FALSE,  /* create */
                        FALSE,  /* create_exclusive; ignored */
                        0);     /* create_perm; ignored */
+
+       captive_leave();
+       if (r==GNOME_VFS_OK)
+               captive_usecount(+1);
+       return r;
 }
 
 
 GnomeVFSResult captive_file_new_create
                (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm)
 {
+GnomeVFSResult r;
+
        g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       return captive_file_new_internal(captive_file_object_return,pathname,mode,
+       r=captive_file_new_internal(captive_file_object_return,pathname,mode,
                        TRUE,   /* create */
                        exclusive,      /* create_exclusive */
                        perm);  /* create_perm */
+
+       captive_leave();
+       if (r==GNOME_VFS_OK)
+               captive_usecount(+1);
+       return r;
 }
 
 
@@ -199,11 +215,14 @@ HANDLE file_Handle;
        g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_file_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);    /* already closed */
 
+       captive_usecount(-1);   /* close() errors notwithstanding */
+
        file_Handle=captive_file_object->file_Handle;
        captive_file_object->file_Handle=NULL;
        err=NtClose(file_Handle);
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -250,6 +269,7 @@ GnomeVFSResult errvfsresult;
 
        captive_file_object->offset+=file_IoStatusBlock.Information;
        *bytes_read_return=file_IoStatusBlock.Information;
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -300,6 +320,7 @@ GnomeVFSResult errvfsresult;
 
        captive_file_object->offset+=file_IoStatusBlock.Information;
        *bytes_written_return=file_IoStatusBlock.Information;
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -331,6 +352,7 @@ GnomeVFSResult captive_file_seek
                        g_return_val_if_reached(GNOME_VFS_ERROR_BAD_PARAMETERS);
                }
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -345,6 +367,7 @@ GnomeVFSResult captive_file_tell(CaptiveFileObject *captive_file_object,GnomeVFS
        g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        *offset_return=captive_file_object->offset;
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -371,6 +394,7 @@ GnomeVFSResult errvfsresult;
                return errvfsresult;
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -555,6 +579,7 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION)
        errvfsresult=FileStandardInformationStruct_to_GnomeVFSFileInfo(file_info,FileStandardInformationStruct);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -686,6 +711,7 @@ NTSTATUS err;
                /* owner ignored for W32 */
                }
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -712,6 +738,7 @@ GnomeVFSResult errvfsresult;
                return errvfsresult;
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -749,8 +776,11 @@ OBJECT_ATTRIBUTES pathname_new_ObjectAttributes;
                goto err_free_ObjectAttributes;
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       errvfsresult=GNOME_VFS_OK;
+
 err_free_ObjectAttributes:
        g_free(pathname_new_ObjectAttributes.ObjectName);       /* left from captive_file_uri_parent_init() */
 
+       captive_leave();
        return errvfsresult;
 }
index 12d693a..7351c2e 100644 (file)
@@ -21,12 +21,13 @@ include $(top_srcdir)/src/libcaptive/Makefile-libcaptive.am
 
 pkginclude_HEADERS+= \
                calltype_reactos.h \
-               client.h \
                client-directory.h \
                client-file.h \
+               client.h \
                config2.h \
                ldr.h \
                ldr_exports.h \
+               leave.h \
                macros.h \
                mm.h \
                ps_reactos.h \
@@ -35,7 +36,8 @@ pkginclude_HEADERS+= \
                signal.h \
                storage.h \
                unicode.h \
-               unicode_reactos.h
+               unicode_reactos.h \
+               usecount.h
 
 # for 'include_test.c' handled by Makefile-head.am/.include_test_all.stamp rule by $(COMPILE)
 CFLAGS+=$(GNOME_VFS_MODULE_CFLAGS)