From: short <> Date: Thu, 1 May 2003 09:17:03 +0000 (+0000) Subject: +captive_leave() to replace g_idle*() function calls postponing X-Git-Tag: captive-0_8~7 X-Git-Url: http://git.jankratochvil.net/?a=commitdiff_plain;h=2e93665e66c900fe0c254a7b6b39a2235e06591c;p=captive.git +captive_leave() to replace g_idle*() function calls postponing - 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 --- diff --git a/src/libcaptive/client/Makefile.am b/src/libcaptive/client/Makefile.am index 7b21b0c..54622cb 100644 --- a/src/libcaptive/client/Makefile.am +++ b/src/libcaptive/client/Makefile.am @@ -1,6 +1,6 @@ # $Id$ # automake source for the client interface of libcaptive Makefile -# Copyright (C) 2002 Jan Kratochvil +# Copyright (C) 2002-2003 Jan Kratochvil # # 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= \ diff --git a/src/libcaptive/client/directory.c b/src/libcaptive/client/directory.c index 534e5f8..e77e76f 100644 --- a/src/libcaptive/client/directory.c +++ b/src/libcaptive/client/directory.c @@ -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; } diff --git a/src/libcaptive/client/file.c b/src/libcaptive/client/file.c index 610b954..2f41332 100644 --- a/src/libcaptive/client/file.c +++ b/src/libcaptive/client/file.c @@ -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; } diff --git a/src/libcaptive/include/captive/Makefile.am b/src/libcaptive/include/captive/Makefile.am index 12d693a..7351c2e 100644 --- a/src/libcaptive/include/captive/Makefile.am +++ b/src/libcaptive/include/captive/Makefile.am @@ -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)