diff options
author | unknown <ram@mysql.r18.ru> | 2002-10-30 15:57:05 +0400 |
---|---|---|
committer | unknown <ram@mysql.r18.ru> | 2002-10-30 15:57:05 +0400 |
commit | 155e78f014de1a2e259ae5119f4621fbb210a784 (patch) | |
tree | 6881a3cca88bea0bb9eeffd5aae34be437152786 /bdb/os_win32 | |
parent | b8798d25ab71436bf690ee8ae48285a655c5487e (diff) | |
download | mariadb-git-155e78f014de1a2e259ae5119f4621fbb210a784.tar.gz |
BDB 4.1.24
BitKeeper/deleted/.del-ex_access.wpj~3df6ae8c99bf7c5f:
Delete: bdb/build_vxworks/ex_access/ex_access.wpj
BitKeeper/deleted/.del-ex_btrec.wpj~a7622f1c6f432dc6:
Delete: bdb/build_vxworks/ex_btrec/ex_btrec.wpj
BitKeeper/deleted/.del-ex_dbclient.wpj~7345440f3b204cdd:
Delete: bdb/build_vxworks/ex_dbclient/ex_dbclient.wpj
BitKeeper/deleted/.del-ex_env.wpj~fbe1ab10b04e8b74:
Delete: bdb/build_vxworks/ex_env/ex_env.wpj
BitKeeper/deleted/.del-ex_mpool.wpj~4479cfd5c45f327d:
Delete: bdb/build_vxworks/ex_mpool/ex_mpool.wpj
BitKeeper/deleted/.del-ex_tpcb.wpj~f78093006e14bf41:
Delete: bdb/build_vxworks/ex_tpcb/ex_tpcb.wpj
BitKeeper/deleted/.del-db_buildall.dsp~bd749ff6da11682:
Delete: bdb/build_win32/db_buildall.dsp
BitKeeper/deleted/.del-cxx_app.cpp~ad8df8e0791011ed:
Delete: bdb/cxx/cxx_app.cpp
BitKeeper/deleted/.del-cxx_log.cpp~a50ff3118fe06952:
Delete: bdb/cxx/cxx_log.cpp
BitKeeper/deleted/.del-cxx_table.cpp~ecd751e79b055556:
Delete: bdb/cxx/cxx_table.cpp
BitKeeper/deleted/.del-namemap.txt~796a3acd3885d8fd:
Delete: bdb/cxx/namemap.txt
BitKeeper/deleted/.del-Design.fileop~3ca4da68f1727373:
Delete: bdb/db/Design.fileop
BitKeeper/deleted/.del-db185_int.h~61bee3736e7959ef:
Delete: bdb/db185/db185_int.h
BitKeeper/deleted/.del-acconfig.h~411e8854d67ad8b5:
Delete: bdb/dist/acconfig.h
BitKeeper/deleted/.del-mutex.m4~a13383cde18a64e1:
Delete: bdb/dist/aclocal/mutex.m4
BitKeeper/deleted/.del-options.m4~b9d0ca637213750a:
Delete: bdb/dist/aclocal/options.m4
BitKeeper/deleted/.del-programs.m4~3ce7890b47732b30:
Delete: bdb/dist/aclocal/programs.m4
BitKeeper/deleted/.del-tcl.m4~f944e2db93c3b6db:
Delete: bdb/dist/aclocal/tcl.m4
BitKeeper/deleted/.del-types.m4~59cae158c9a32cff:
Delete: bdb/dist/aclocal/types.m4
BitKeeper/deleted/.del-script~d38f6d3a4f159cb4:
Delete: bdb/dist/build/script
BitKeeper/deleted/.del-configure.in~ac795a92c8fe049c:
Delete: bdb/dist/configure.in
BitKeeper/deleted/.del-ltconfig~66bbd007d8024af:
Delete: bdb/dist/ltconfig
BitKeeper/deleted/.del-rec_ctemp~a28554362534f00a:
Delete: bdb/dist/rec_ctemp
BitKeeper/deleted/.del-s_tcl~2ffe4326459fcd9f:
Delete: bdb/dist/s_tcl
BitKeeper/deleted/.del-.IGNORE_ME~d8148b08fa7d5d15:
Delete: bdb/dist/template/.IGNORE_ME
BitKeeper/deleted/.del-btree.h~179f2aefec1753d:
Delete: bdb/include/btree.h
BitKeeper/deleted/.del-cxx_int.h~6b649c04766508f8:
Delete: bdb/include/cxx_int.h
BitKeeper/deleted/.del-db.src~6b433ae615b16a8d:
Delete: bdb/include/db.src
BitKeeper/deleted/.del-db_185.h~ad8b373d9391d35c:
Delete: bdb/include/db_185.h
BitKeeper/deleted/.del-db_am.h~a714912b6b75932f:
Delete: bdb/include/db_am.h
BitKeeper/deleted/.del-db_cxx.h~fcafadf45f5d19e9:
Delete: bdb/include/db_cxx.h
BitKeeper/deleted/.del-db_dispatch.h~6844f20f7eb46904:
Delete: bdb/include/db_dispatch.h
BitKeeper/deleted/.del-db_int.src~419a3f48b6a01da7:
Delete: bdb/include/db_int.src
BitKeeper/deleted/.del-db_join.h~76f9747a42c3399a:
Delete: bdb/include/db_join.h
BitKeeper/deleted/.del-db_page.h~e302ca3a4db3abdc:
Delete: bdb/include/db_page.h
BitKeeper/deleted/.del-db_server_int.h~e1d20b6ba3bca1ab:
Delete: bdb/include/db_server_int.h
BitKeeper/deleted/.del-db_shash.h~5fbf2d696fac90f3:
Delete: bdb/include/db_shash.h
BitKeeper/deleted/.del-db_swap.h~1e60887550864a59:
Delete: bdb/include/db_swap.h
BitKeeper/deleted/.del-db_upgrade.h~c644eee73701fc8d:
Delete: bdb/include/db_upgrade.h
BitKeeper/deleted/.del-db_verify.h~b8d6c297c61f342e:
Delete: bdb/include/db_verify.h
BitKeeper/deleted/.del-debug.h~dc2b4f2cf27ccebc:
Delete: bdb/include/debug.h
BitKeeper/deleted/.del-hash.h~2aaa548b28882dfb:
Delete: bdb/include/hash.h
BitKeeper/deleted/.del-lock.h~a761c1b7de57b77f:
Delete: bdb/include/lock.h
BitKeeper/deleted/.del-log.h~ff20184238e35e4d:
Delete: bdb/include/log.h
BitKeeper/deleted/.del-mp.h~7e317597622f3411:
Delete: bdb/include/mp.h
BitKeeper/deleted/.del-mutex.h~d3ae7a2977a68137:
Delete: bdb/include/mutex.h
BitKeeper/deleted/.del-os.h~91867cc8757cd0e3:
Delete: bdb/include/os.h
BitKeeper/deleted/.del-os_jump.h~e1b939fa5151d4be:
Delete: bdb/include/os_jump.h
BitKeeper/deleted/.del-qam.h~6fad0c1b5723d597:
Delete: bdb/include/qam.h
BitKeeper/deleted/.del-queue.h~4c72c0826c123d5:
Delete: bdb/include/queue.h
BitKeeper/deleted/.del-region.h~513fe04d977ca0fc:
Delete: bdb/include/region.h
BitKeeper/deleted/.del-shqueue.h~525fc3e6c2025c36:
Delete: bdb/include/shqueue.h
BitKeeper/deleted/.del-tcl_db.h~c536fd61a844f23f:
Delete: bdb/include/tcl_db.h
BitKeeper/deleted/.del-txn.h~c8d94b221ec147e4:
Delete: bdb/include/txn.h
BitKeeper/deleted/.del-xa.h~ecc466493aae9d9a:
Delete: bdb/include/xa.h
BitKeeper/deleted/.del-DbRecoveryInit.java~756b52601a0b9023:
Delete: bdb/java/src/com/sleepycat/db/DbRecoveryInit.java
BitKeeper/deleted/.del-DbTxnRecover.java~74607cba7ab89d6d:
Delete: bdb/java/src/com/sleepycat/db/DbTxnRecover.java
BitKeeper/deleted/.del-lock_conflict.c~fc5e0f14cf597a2b:
Delete: bdb/lock/lock_conflict.c
BitKeeper/deleted/.del-log.src~53ac9e7b5cb023f2:
Delete: bdb/log/log.src
BitKeeper/deleted/.del-log_findckp.c~24287f008916e81f:
Delete: bdb/log/log_findckp.c
BitKeeper/deleted/.del-log_rec.c~d51711f2cac09297:
Delete: bdb/log/log_rec.c
BitKeeper/deleted/.del-log_register.c~b40bb4efac75ca15:
Delete: bdb/log/log_register.c
BitKeeper/deleted/.del-Design~b3d0f179f2767b:
Delete: bdb/mp/Design
BitKeeper/deleted/.del-os_finit.c~95dbefc6fe79b26c:
Delete: bdb/os/os_finit.c
BitKeeper/deleted/.del-os_abs.c~df95d1e7db81924:
Delete: bdb/os_vxworks/os_abs.c
BitKeeper/deleted/.del-os_finit.c~803b484bdb9d0122:
Delete: bdb/os_vxworks/os_finit.c
BitKeeper/deleted/.del-os_map.c~3a6d7926398b76d3:
Delete: bdb/os_vxworks/os_map.c
BitKeeper/deleted/.del-os_finit.c~19a227c6d3c78ad:
Delete: bdb/os_win32/os_finit.c
BitKeeper/deleted/.del-log-corruption.patch~1cf2ecc7c6408d5d:
Delete: bdb/patches/log-corruption.patch
BitKeeper/deleted/.del-Btree.pm~af6d0c5eaed4a98e:
Delete: bdb/perl.BerkeleyDB/BerkeleyDB/Btree.pm
BitKeeper/deleted/.del-BerkeleyDB.pm~7244036d4482643:
Delete: bdb/perl.BerkeleyDB/BerkeleyDB.pm
BitKeeper/deleted/.del-BerkeleyDB.pod~e7b18fd6132448e3:
Delete: bdb/perl.BerkeleyDB/BerkeleyDB.pod
BitKeeper/deleted/.del-Hash.pm~10292a26c06a5c95:
Delete: bdb/perl.BerkeleyDB/BerkeleyDB/Hash.pm
BitKeeper/deleted/.del-BerkeleyDB.pod.P~79f76a1495eda203:
Delete: bdb/perl.BerkeleyDB/BerkeleyDB.pod.P
BitKeeper/deleted/.del-BerkeleyDB.xs~80c99afbd98e392c:
Delete: bdb/perl.BerkeleyDB/BerkeleyDB.xs
BitKeeper/deleted/.del-Changes~729c1891efa60de9:
Delete: bdb/perl.BerkeleyDB/Changes
BitKeeper/deleted/.del-MANIFEST~63a1e34aecf157a0:
Delete: bdb/perl.BerkeleyDB/MANIFEST
BitKeeper/deleted/.del-Makefile.PL~c68797707d8df87a:
Delete: bdb/perl.BerkeleyDB/Makefile.PL
BitKeeper/deleted/.del-README~5f2f579b1a241407:
Delete: bdb/perl.BerkeleyDB/README
BitKeeper/deleted/.del-Todo~dca3c66c193adda9:
Delete: bdb/perl.BerkeleyDB/Todo
BitKeeper/deleted/.del-config.in~ae81681e450e0999:
Delete: bdb/perl.BerkeleyDB/config.in
BitKeeper/deleted/.del-dbinfo~28ad67d83be4f68e:
Delete: bdb/perl.BerkeleyDB/dbinfo
BitKeeper/deleted/.del-mkconsts~543ab60669c7a04e:
Delete: bdb/perl.BerkeleyDB/mkconsts
BitKeeper/deleted/.del-mkpod~182c0ca54e439afb:
Delete: bdb/perl.BerkeleyDB/mkpod
BitKeeper/deleted/.del-5.004~e008cb5a48805543:
Delete: bdb/perl.BerkeleyDB/patches/5.004
BitKeeper/deleted/.del-irix_6_5.pl~61662bb08afcdec8:
Delete: bdb/perl.BerkeleyDB/hints/irix_6_5.pl
BitKeeper/deleted/.del-solaris.pl~6771e7182394e152:
Delete: bdb/perl.BerkeleyDB/hints/solaris.pl
BitKeeper/deleted/.del-typemap~783b8f5295b05f3d:
Delete: bdb/perl.BerkeleyDB/typemap
BitKeeper/deleted/.del-5.004_01~6081ce2fff7b0bc:
Delete: bdb/perl.BerkeleyDB/patches/5.004_01
BitKeeper/deleted/.del-5.004_02~87214eac35ad9e6:
Delete: bdb/perl.BerkeleyDB/patches/5.004_02
BitKeeper/deleted/.del-5.004_03~9a672becec7cb40f:
Delete: bdb/perl.BerkeleyDB/patches/5.004_03
BitKeeper/deleted/.del-5.004_04~e326cb51af09d154:
Delete: bdb/perl.BerkeleyDB/patches/5.004_04
BitKeeper/deleted/.del-5.004_05~7ab457a1e41a92fe:
Delete: bdb/perl.BerkeleyDB/patches/5.004_05
BitKeeper/deleted/.del-5.005~f9e2d59b5964cd4b:
Delete: bdb/perl.BerkeleyDB/patches/5.005
BitKeeper/deleted/.del-5.005_01~3eb9fb7b5842ea8e:
Delete: bdb/perl.BerkeleyDB/patches/5.005_01
BitKeeper/deleted/.del-5.005_02~67477ce0bef717cb:
Delete: bdb/perl.BerkeleyDB/patches/5.005_02
BitKeeper/deleted/.del-5.005_03~c4c29a1fb21e290a:
Delete: bdb/perl.BerkeleyDB/patches/5.005_03
BitKeeper/deleted/.del-5.6.0~e1fb9897d124ee22:
Delete: bdb/perl.BerkeleyDB/patches/5.6.0
BitKeeper/deleted/.del-btree.t~e4a1a3c675ddc406:
Delete: bdb/perl.BerkeleyDB/t/btree.t
BitKeeper/deleted/.del-db-3.0.t~d2c60991d84558f2:
Delete: bdb/perl.BerkeleyDB/t/db-3.0.t
BitKeeper/deleted/.del-db-3.1.t~6ee88cd13f55e018:
Delete: bdb/perl.BerkeleyDB/t/db-3.1.t
BitKeeper/deleted/.del-db-3.2.t~f73b6461f98fd1cf:
Delete: bdb/perl.BerkeleyDB/t/db-3.2.t
BitKeeper/deleted/.del-destroy.t~cc6a2ae1980a2ecd:
Delete: bdb/perl.BerkeleyDB/t/destroy.t
BitKeeper/deleted/.del-env.t~a8604a4499c4bd07:
Delete: bdb/perl.BerkeleyDB/t/env.t
BitKeeper/deleted/.del-examples.t~2571b77c3cc75574:
Delete: bdb/perl.BerkeleyDB/t/examples.t
BitKeeper/deleted/.del-examples.t.T~8228bdd75ac78b88:
Delete: bdb/perl.BerkeleyDB/t/examples.t.T
BitKeeper/deleted/.del-examples3.t.T~66a186897a87026d:
Delete: bdb/perl.BerkeleyDB/t/examples3.t.T
BitKeeper/deleted/.del-examples3.t~fe3822ba2f2d7f83:
Delete: bdb/perl.BerkeleyDB/t/examples3.t
BitKeeper/deleted/.del-filter.t~f87b045c1b708637:
Delete: bdb/perl.BerkeleyDB/t/filter.t
BitKeeper/deleted/.del-hash.t~616bfb4d644de3a3:
Delete: bdb/perl.BerkeleyDB/t/hash.t
BitKeeper/deleted/.del-join.t~29fc39f74a83ca22:
Delete: bdb/perl.BerkeleyDB/t/join.t
BitKeeper/deleted/.del-mldbm.t~31f5015341eea040:
Delete: bdb/perl.BerkeleyDB/t/mldbm.t
BitKeeper/deleted/.del-queue.t~8f338034ce44a641:
Delete: bdb/perl.BerkeleyDB/t/queue.t
BitKeeper/deleted/.del-recno.t~d4ddbd3743add63e:
Delete: bdb/perl.BerkeleyDB/t/recno.t
BitKeeper/deleted/.del-strict.t~6885cdd2ea71ca2d:
Delete: bdb/perl.BerkeleyDB/t/strict.t
BitKeeper/deleted/.del-subdb.t~aab62a5d5864c603:
Delete: bdb/perl.BerkeleyDB/t/subdb.t
BitKeeper/deleted/.del-txn.t~65033b8558ae1216:
Delete: bdb/perl.BerkeleyDB/t/txn.t
BitKeeper/deleted/.del-unknown.t~f3710458682665e1:
Delete: bdb/perl.BerkeleyDB/t/unknown.t
BitKeeper/deleted/.del-Changes~436f74a5c414c65b:
Delete: bdb/perl.DB_File/Changes
BitKeeper/deleted/.del-DB_File.pm~ae0951c6c7665a82:
Delete: bdb/perl.DB_File/DB_File.pm
BitKeeper/deleted/.del-DB_File.xs~89e49a0b5556f1d8:
Delete: bdb/perl.DB_File/DB_File.xs
BitKeeper/deleted/.del-DB_File_BS~290fad5dbbb87069:
Delete: bdb/perl.DB_File/DB_File_BS
BitKeeper/deleted/.del-MANIFEST~90ee581572bdd4ac:
Delete: bdb/perl.DB_File/MANIFEST
BitKeeper/deleted/.del-Makefile.PL~ac0567bb5a377e38:
Delete: bdb/perl.DB_File/Makefile.PL
BitKeeper/deleted/.del-README~77e924a5a9bae6b3:
Delete: bdb/perl.DB_File/README
BitKeeper/deleted/.del-config.in~ab4c2792b86a810b:
Delete: bdb/perl.DB_File/config.in
BitKeeper/deleted/.del-dbinfo~461c43b30fab2cb:
Delete: bdb/perl.DB_File/dbinfo
BitKeeper/deleted/.del-dynixptx.pl~50dcddfae25d17e9:
Delete: bdb/perl.DB_File/hints/dynixptx.pl
BitKeeper/deleted/.del-typemap~55cffb3288a9e587:
Delete: bdb/perl.DB_File/typemap
BitKeeper/deleted/.del-version.c~a4df0e646f8b3975:
Delete: bdb/perl.DB_File/version.c
BitKeeper/deleted/.del-5.004_01~d6830d0082702af7:
Delete: bdb/perl.DB_File/patches/5.004_01
BitKeeper/deleted/.del-5.004_02~78b082dc80c91031:
Delete: bdb/perl.DB_File/patches/5.004_02
BitKeeper/deleted/.del-5.004~4411ec2e3c9e008b:
Delete: bdb/perl.DB_File/patches/5.004
BitKeeper/deleted/.del-sco.pl~1e795fe14fe4dcfe:
Delete: bdb/perl.DB_File/hints/sco.pl
BitKeeper/deleted/.del-5.004_03~33f274648b160d95:
Delete: bdb/perl.DB_File/patches/5.004_03
BitKeeper/deleted/.del-5.004_04~8f3d1b3cf18bb20a:
Delete: bdb/perl.DB_File/patches/5.004_04
BitKeeper/deleted/.del-5.004_05~9c0f02e7331e142:
Delete: bdb/perl.DB_File/patches/5.004_05
BitKeeper/deleted/.del-5.005~c2108cb2e3c8d951:
Delete: bdb/perl.DB_File/patches/5.005
BitKeeper/deleted/.del-5.005_01~3b45e9673afc4cfa:
Delete: bdb/perl.DB_File/patches/5.005_01
BitKeeper/deleted/.del-5.005_02~9fe5766bb02a4522:
Delete: bdb/perl.DB_File/patches/5.005_02
BitKeeper/deleted/.del-5.005_03~ffa1c38c19ae72ea:
Delete: bdb/perl.DB_File/patches/5.005_03
BitKeeper/deleted/.del-5.6.0~373be3a5ce47be85:
Delete: bdb/perl.DB_File/patches/5.6.0
BitKeeper/deleted/.del-db-btree.t~3231595a1c241eb3:
Delete: bdb/perl.DB_File/t/db-btree.t
BitKeeper/deleted/.del-db-hash.t~7c4ad0c795c7fad2:
Delete: bdb/perl.DB_File/t/db-hash.t
BitKeeper/deleted/.del-db-recno.t~6c2d3d80b9ba4a50:
Delete: bdb/perl.DB_File/t/db-recno.t
BitKeeper/deleted/.del-db_server.sed~cdb00ebcd48a64e2:
Delete: bdb/rpc_server/db_server.sed
BitKeeper/deleted/.del-db_server_proc.c~d46c8f409c3747f4:
Delete: bdb/rpc_server/db_server_proc.c
BitKeeper/deleted/.del-db_server_svc.sed~3f5e59f334fa4607:
Delete: bdb/rpc_server/db_server_svc.sed
BitKeeper/deleted/.del-db_server_util.c~a809f3a4629acda:
Delete: bdb/rpc_server/db_server_util.c
BitKeeper/deleted/.del-log.tcl~ff1b41f1355b97d7:
Delete: bdb/test/log.tcl
BitKeeper/deleted/.del-mpool.tcl~b0df4dc1b04db26c:
Delete: bdb/test/mpool.tcl
BitKeeper/deleted/.del-mutex.tcl~52fd5c73a150565:
Delete: bdb/test/mutex.tcl
BitKeeper/deleted/.del-txn.tcl~c4ff071550b5446e:
Delete: bdb/test/txn.tcl
BitKeeper/deleted/.del-README~e800a12a5392010a:
Delete: bdb/test/upgrade/README
BitKeeper/deleted/.del-pack-2.6.6.pl~89d5076d758d3e98:
Delete: bdb/test/upgrade/generate-2.X/pack-2.6.6.pl
BitKeeper/deleted/.del-test-2.6.patch~4a52dc83d447547b:
Delete: bdb/test/upgrade/generate-2.X/test-2.6.patch
Diffstat (limited to 'bdb/os_win32')
-rw-r--r-- | bdb/os_win32/os_abs.c | 4 | ||||
-rw-r--r-- | bdb/os_win32/os_clock.c | 37 | ||||
-rw-r--r-- | bdb/os_win32/os_config.c | 29 | ||||
-rw-r--r-- | bdb/os_win32/os_dir.c | 30 | ||||
-rw-r--r-- | bdb/os_win32/os_errno.c | 17 | ||||
-rw-r--r-- | bdb/os_win32/os_fid.c | 20 | ||||
-rw-r--r-- | bdb/os_win32/os_finit.c | 60 | ||||
-rw-r--r-- | bdb/os_win32/os_fsync.c | 59 | ||||
-rw-r--r-- | bdb/os_win32/os_handle.c | 126 | ||||
-rw-r--r-- | bdb/os_win32/os_map.c | 118 | ||||
-rw-r--r-- | bdb/os_win32/os_open.c | 98 | ||||
-rw-r--r-- | bdb/os_win32/os_rename.c | 73 | ||||
-rw-r--r-- | bdb/os_win32/os_rw.c | 182 | ||||
-rw-r--r-- | bdb/os_win32/os_seek.c | 71 | ||||
-rw-r--r-- | bdb/os_win32/os_sleep.c | 9 | ||||
-rw-r--r-- | bdb/os_win32/os_spin.c | 20 | ||||
-rw-r--r-- | bdb/os_win32/os_stat.c | 100 | ||||
-rw-r--r-- | bdb/os_win32/os_type.c | 7 |
18 files changed, 809 insertions, 251 deletions
diff --git a/bdb/os_win32/os_abs.c b/bdb/os_win32/os_abs.c index 7b1e3fd05d5..c8bead83ec3 100644 --- a/bdb/os_win32/os_abs.c +++ b/bdb/os_win32/os_abs.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1997, 1998, 1999, 2000 + * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_abs.c,v 11.3 2000/02/14 03:00:06 bostic Exp $"; +static const char revid[] = "$Id: os_abs.c,v 11.5 2002/01/11 15:53:05 bostic Exp $"; #endif /* not lint */ #include "db_int.h" diff --git a/bdb/os_win32/os_clock.c b/bdb/os_win32/os_clock.c new file mode 100644 index 00000000000..1bf154f9da9 --- /dev/null +++ b/bdb/os_win32/os_clock.c @@ -0,0 +1,37 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2001-2002 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: os_clock.c,v 1.7 2002/07/12 18:56:53 bostic Exp $"; +#endif /* not lint */ + +#include <sys/types.h> +#include <sys/timeb.h> +#include <string.h> + +#include "db_int.h" + +/* + * __os_clock -- + * Return the current time-of-day clock in seconds and microseconds. + */ +int +__os_clock(dbenv, secsp, usecsp) + DB_ENV *dbenv; + u_int32_t *secsp, *usecsp; /* Seconds and microseconds. */ +{ + struct _timeb now; + + _ftime(&now); + if (secsp != NULL) + *secsp = (u_int32_t)now.time; + if (usecsp != NULL) + *usecsp = now.millitm * 1000; + return (0); +} diff --git a/bdb/os_win32/os_config.c b/bdb/os_win32/os_config.c new file mode 100644 index 00000000000..a2c220daf1a --- /dev/null +++ b/bdb/os_win32/os_config.c @@ -0,0 +1,29 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1999-2002 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: os_config.c,v 11.13 2002/01/11 15:53:06 bostic Exp $"; +#endif /* not lint */ + +#include "db_int.h" + +/* + * __os_fs_notzero -- + * Return 1 if allocated filesystem blocks are not zeroed. + */ +int +__os_fs_notzero() +{ + /* + * Windows/NT zero-fills pages that were never explicitly written to + * the file. Windows 95/98 gives you random garbage, and that breaks + * Berkeley DB. + */ + return (__os_is_winnt() ? 0 : 1); +} diff --git a/bdb/os_win32/os_dir.c b/bdb/os_win32/os_dir.c index d37b7601051..3f47c4960b0 100644 --- a/bdb/os_win32/os_dir.c +++ b/bdb/os_win32/os_dir.c @@ -1,18 +1,17 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1997, 1998, 1999, 2000 + * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_dir.c,v 11.4 2000/03/28 21:50:17 ubell Exp $"; +static const char revid[] = "$Id: os_dir.c,v 11.12 2002/07/12 18:56:54 bostic Exp $"; #endif /* not lint */ #include "db_int.h" -#include "os_jump.h" /* * __os_dirlist -- @@ -26,12 +25,16 @@ __os_dirlist(dbenv, dir, namesp, cntp) int *cntp; { struct _finddata_t fdata; +#ifdef _WIN64 + intptr_t dirhandle; +#else long dirhandle; +#endif int arraysz, cnt, finished, ret; char **names, filespec[MAXPATHLEN]; - if (__db_jump.j_dirlist != NULL) - return (__db_jump.j_dirlist(dir, namesp, cntp)); + if (DB_GLOBAL(j_dirlist) != NULL) + return (DB_GLOBAL(j_dirlist)(dir, namesp, cntp)); (void)snprintf(filespec, sizeof(filespec), "%s/*", dir); if ((dirhandle = _findfirst(filespec, &fdata)) == -1) @@ -43,12 +46,12 @@ __os_dirlist(dbenv, dir, namesp, cntp) if (cnt >= arraysz) { arraysz += 100; if ((ret = __os_realloc(dbenv, - arraysz * sizeof(names[0]), NULL, &names)) != 0) + arraysz * sizeof(names[0]), &names)) != 0) goto nomem; } if ((ret = __os_strdup(dbenv, fdata.name, &names[cnt])) != 0) goto nomem; - if (_findnext(dirhandle,&fdata) != 0) + if (_findnext(dirhandle, &fdata) != 0) finished = 1; } _findclose(dirhandle); @@ -58,7 +61,7 @@ __os_dirlist(dbenv, dir, namesp, cntp) return (0); nomem: if (names != NULL) - __os_dirfree(names, cnt); + __os_dirfree(dbenv, names, cnt); return (ret); } @@ -67,16 +70,17 @@ nomem: if (names != NULL) * Free the list of files. */ void -__os_dirfree(names, cnt) +__os_dirfree(dbenv, names, cnt) + DB_ENV *dbenv; char **names; int cnt; { - if (__db_jump.j_dirfree != NULL) { - __db_jump.j_dirfree(names, cnt); + if (DB_GLOBAL(j_dirfree) != NULL) { + DB_GLOBAL(j_dirfree)(names, cnt); return; } while (cnt > 0) - __os_free(names[--cnt], 0); - __os_free(names, 0); + __os_free(dbenv, names[--cnt]); + __os_free(dbenv, names); } diff --git a/bdb/os_win32/os_errno.c b/bdb/os_win32/os_errno.c index 8324826b6f9..d6fac82e6f3 100644 --- a/bdb/os_win32/os_errno.c +++ b/bdb/os_win32/os_errno.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1999, 2000 + * Copyright (c) 1999-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_errno.c,v 11.5 2000/11/30 00:58:43 ubell Exp $"; +static const char revid[] = "$Id: os_errno.c,v 11.10 2002/07/12 04:05:00 mjc Exp $"; #endif /* not lint */ #include "db_int.h" @@ -58,13 +58,7 @@ __os_win32_errno(void) DWORD last_error; int ret; - /* - * It's possible that errno was set after the error. - * The caller must take care to set it to 0 before - * any system operation. - */ - if (__os_get_errno() != 0) - return (__os_get_errno()); + /* Ignore errno - we used to check it here. */ last_error = GetLastError(); @@ -113,6 +107,7 @@ __os_win32_errno(void) break; case ERROR_FILE_EXISTS: + case ERROR_ALREADY_EXISTS: ret = EEXIST; break; @@ -133,6 +128,10 @@ __os_win32_errno(void) ret = EBUSY; break; + case ERROR_RETRY: + ret = EINTR; + break; + case 0: ret = EFAULT; break; diff --git a/bdb/os_win32/os_fid.c b/bdb/os_win32/os_fid.c index c66ac52102b..1190ad26e81 100644 --- a/bdb/os_win32/os_fid.c +++ b/bdb/os_win32/os_fid.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997, 1998, 1999, 2000 + * Copyright (c) 1996-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_fid.c,v 11.7 2000/10/26 14:18:08 bostic Exp $"; +static const char revid[] = "$Id: os_fid.c,v 11.15 2002/08/26 14:37:39 margo Exp $"; #endif /* not lint */ #include "db_int.h" @@ -40,10 +40,11 @@ __os_fileid(dbenv, fname, unique_okay, fidp) * Can't think of a better solution right now. */ DB_FH fh; - HANDLE handle; BY_HANDLE_FILE_INFORMATION fi; BOOL retval = FALSE; + DB_ASSERT(fname != NULL); + /* Clear the buffer. */ memset(fidp, 0, DB_FILE_ID_LEN); @@ -62,7 +63,7 @@ __os_fileid(dbenv, fname, unique_okay, fidp) * interesting properties in base 2. */ if (fid_serial == SERIAL_INIT) - fid_serial = (u_int32_t)getpid(); + __os_id(&fid_serial); else fid_serial += 100000; @@ -74,15 +75,11 @@ __os_fileid(dbenv, fname, unique_okay, fidp) return (ret); /* File open, get its info */ - handle = (HANDLE)_get_osfhandle(fh.fd); - if (handle == INVALID_HANDLE_VALUE) + if ((retval = GetFileInformationByHandle(fh.handle, &fi)) == FALSE) ret = __os_win32_errno(); - else - if ((retval = GetFileInformationByHandle(handle, &fi)) == FALSE) - ret = __os_win32_errno(); - __os_closehandle(&fh); + __os_closehandle(dbenv, &fh); - if (handle == INVALID_HANDLE_VALUE || retval == FALSE) + if (retval == FALSE) return (ret); /* @@ -113,6 +110,7 @@ __os_fileid(dbenv, fname, unique_okay, fidp) tmp = (u_int32_t)fi.nFileIndexHigh; for (p = (u_int8_t *)&tmp, i = sizeof(u_int32_t); i > 0; --i) *fidp++ = *p++; + if (unique_okay) { /* * Use the system time to try to get a unique value diff --git a/bdb/os_win32/os_finit.c b/bdb/os_win32/os_finit.c deleted file mode 100644 index 61d2a33c7b4..00000000000 --- a/bdb/os_win32/os_finit.c +++ /dev/null @@ -1,60 +0,0 @@ -/*- - * See the file LICENSE for redistribution information. - * - * Copyright (c) 1999, 2000 - * Sleepycat Software. All rights reserved. - */ - -#include "db_config.h" - -#ifndef lint -static const char revid[] = "$Id: os_finit.c,v 11.9 2000/03/29 20:50:52 ubell Exp $"; -#endif /* not lint */ - -#include "db_int.h" - -/* - * __os_fpinit -- - * Initialize a page in a regular file. - * - * PUBLIC: int __os_fpinit __P((DB_ENV *, DB_FH *, db_pgno_t, int, int)); - */ -int -__os_fpinit(dbenv, fhp, pgno, pagecount, pagesize) - DB_ENV *dbenv; - DB_FH *fhp; - db_pgno_t pgno; - int pagecount, pagesize; -{ - size_t nw, totalbytes, curbytes; - int ret; - char buf[1024]; - - /* - * Windows/NT zero-fills pages that were never explicitly written to - * the file. Windows 95/98 gives you random garbage, and that breaks - * DB. - */ - if (__os_is_winnt()) - return (0); - - if ((ret = __os_seek(dbenv, - fhp, pagesize, pgno, 0, 0, DB_OS_SEEK_SET)) != 0) - return (ret); - - memset(buf, 0, sizeof(buf)); - totalbytes = pagecount * pagesize; - - while (totalbytes > 0) { - if (totalbytes > sizeof(buf)) - curbytes = sizeof(buf); - else - curbytes = totalbytes; - if ((ret = __os_write(dbenv, fhp, buf, curbytes, &nw)) != 0) - return (ret); - if (nw != curbytes) - return (EIO); - totalbytes -= curbytes; - } - return (0); -} diff --git a/bdb/os_win32/os_fsync.c b/bdb/os_win32/os_fsync.c new file mode 100644 index 00000000000..6fd3e1dcdf4 --- /dev/null +++ b/bdb/os_win32/os_fsync.c @@ -0,0 +1,59 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1997-2002 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: os_fsync.c,v 11.15 2002/07/12 18:56:54 bostic Exp $"; +#endif /* not lint */ + +#ifndef NO_SYSTEM_INCLUDES +#include <sys/types.h> + +#include <fcntl.h> /* XXX: Required by __hp3000s900 */ +#include <unistd.h> +#include <string.h> +#endif + +#include "db_int.h" + +/* + * __os_fsync -- + * Flush a file descriptor. + * + * PUBLIC: int __os_fsync __P((DB_ENV *, DB_FH *)); + */ +int +__os_fsync(dbenv, fhp) + DB_ENV *dbenv; + DB_FH *fhp; +{ + BOOL success; + int ret; + + /* + * Do nothing if the file descriptor has been marked as not requiring + * any sync to disk. + */ + if (F_ISSET(fhp, DB_FH_NOSYNC)) + return (0); + + ret = 0; + do { + if (DB_GLOBAL(j_fsync) != NULL) + success = (DB_GLOBAL(j_fsync)(fhp->fd) == 0); + else { + success = FlushFileBuffers(fhp->handle); + if (!success) + __os_set_errno(__os_win32_errno()); + } + } while (!success && (ret = __os_get_errno()) == EINTR); + + if (ret != 0) + __db_err(dbenv, "fsync %s", strerror(ret)); + return (ret); +} diff --git a/bdb/os_win32/os_handle.c b/bdb/os_win32/os_handle.c new file mode 100644 index 00000000000..7db9c3da977 --- /dev/null +++ b/bdb/os_win32/os_handle.c @@ -0,0 +1,126 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1998-2002 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: os_handle.c,v 11.30 2002/07/12 18:56:54 bostic Exp $"; +#endif /* not lint */ + +#ifndef NO_SYSTEM_INCLUDES +#include <sys/types.h> + +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#endif + +#include "db_int.h" + +/* + * __os_openhandle -- + * Open a file, using POSIX 1003.1 open flags. + * + * PUBLIC: int __os_openhandle __P((DB_ENV *, const char *, int, int, DB_FH *)); + */ +int +__os_openhandle(dbenv, name, flags, mode, fhp) + DB_ENV *dbenv; + const char *name; + int flags, mode; + DB_FH *fhp; +{ + int ret, nrepeat; + + memset(fhp, 0, sizeof(*fhp)); + fhp->handle = INVALID_HANDLE_VALUE; + + /* If the application specified an interface, use it. */ + if (DB_GLOBAL(j_open) != NULL) { + if ((fhp->fd = DB_GLOBAL(j_open)(name, flags, mode)) == -1) + return (__os_get_errno()); + F_SET(fhp, DB_FH_VALID); + return (0); + } + + for (nrepeat = 1; nrepeat < 4; ++nrepeat) { + ret = 0; + fhp->fd = open(name, flags, mode); + + if (fhp->fd == -1) { + /* + * If it's a "temporary" error, we retry up to 3 times, + * waiting up to 12 seconds. While it's not a problem + * if we can't open a database, an inability to open a + * log file is cause for serious dismay. + */ + ret = __os_get_errno(); + if (ret == ENFILE || ret == EMFILE || ret == ENOSPC) { + (void)__os_sleep(dbenv, nrepeat * 2, 0); + continue; + } + + /* + * If it was an EINTR it's reasonable to retry + * immediately, and arbitrarily often. + */ + if (ret == EINTR) { + --nrepeat; + continue; + } + } else { + F_SET(fhp, DB_FH_VALID); + } + break; + } + + return (ret); +} + +/* + * __os_closehandle -- + * Close a file. + * + * PUBLIC: int __os_closehandle __P((DB_ENV *, DB_FH *)); + */ +int +__os_closehandle(dbenv, fhp) + DB_ENV *dbenv; + DB_FH *fhp; +{ + BOOL success; + int ret; + + COMPQUIET(dbenv, NULL); + /* Don't close file descriptors that were never opened. */ + DB_ASSERT(F_ISSET(fhp, DB_FH_VALID) && + ((fhp->fd != -1) || (fhp->handle != INVALID_HANDLE_VALUE))); + + ret = 0; + + do { + if (DB_GLOBAL(j_close) != NULL) + success = (DB_GLOBAL(j_close)(fhp->fd) == 0); + else if (fhp->handle != INVALID_HANDLE_VALUE) { + success = CloseHandle(fhp->handle); + if (!success) + __os_set_errno(__os_win32_errno()); + } + else + success = (close(fhp->fd) == 0); + } while (!success && (ret = __os_get_errno()) == EINTR); + + /* + * Smash the POSIX file descriptor -- it's never tested, but we want + * to catch any mistakes. + */ + fhp->fd = -1; + fhp->handle = INVALID_HANDLE_VALUE; + F_CLR(fhp, DB_FH_VALID); + + return (ret); +} diff --git a/bdb/os_win32/os_map.c b/bdb/os_win32/os_map.c index d7b2839ed29..1f16c9fead4 100644 --- a/bdb/os_win32/os_map.c +++ b/bdb/os_win32/os_map.c @@ -1,22 +1,21 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997, 1998, 1999, 2000 + * Copyright (c) 1996-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_map.c,v 11.22 2000/10/26 14:18:08 bostic Exp $"; +static const char revid[] = "$Id: os_map.c,v 11.38 2002/09/10 02:35:48 bostic Exp $"; #endif /* not lint */ #include "db_int.h" -#include "os_jump.h" static int __os_map __P((DB_ENV *, char *, REGINFO *, DB_FH *, size_t, int, int, int, void **)); -static int __os_unique_name __P((char *, int, char *)); +static int __os_unique_name __P((char *, HANDLE, char *, size_t)); /* * __os_r_sysattach -- @@ -37,6 +36,7 @@ __os_r_sysattach(dbenv, infop, rp) * properly ordered, our caller has already taken care of that. */ if ((ret = __os_open(dbenv, infop->name, + DB_OSO_DIRECT | F_ISSET(infop, REGION_CREATE_OK) ? DB_OSO_CREATE: 0, infop->mode, &fh)) != 0) { __db_err(dbenv, "%s: %s", infop->name, db_strerror(ret)); @@ -63,7 +63,7 @@ __os_r_sysattach(dbenv, infop, rp) if (ret == 0 && is_system == 1) rp->segid = 1; - (void)__os_closehandle(&fh); + (void)__os_closehandle(dbenv, &fh); return (ret); } @@ -82,17 +82,19 @@ __os_r_sysdetach(dbenv, infop, destroy) if (infop->wnt_handle != NULL) { (void)CloseHandle(*((HANDLE*)(infop->wnt_handle))); - __os_free(infop->wnt_handle, sizeof(HANDLE)); + __os_free(dbenv, infop->wnt_handle); } - __os_set_errno(0); ret = !UnmapViewOfFile(infop->addr) ? __os_win32_errno() : 0; if (ret != 0) __db_err(dbenv, "UnmapViewOfFile: %s", strerror(ret)); - if (F_ISSET(dbenv, DB_ENV_SYSTEM_MEM) && destroy && - (t_ret = __os_unlink(dbenv, infop->name)) != 0 && ret == 0) - ret = t_ret; + if (!F_ISSET(dbenv, DB_ENV_SYSTEM_MEM) && destroy) { + if (F_ISSET(dbenv, DB_ENV_OVERWRITE)) + (void)__db_overwrite(dbenv, infop->name); + if ((t_ret = __os_unlink(dbenv, infop->name)) != 0 && ret == 0) + ret = t_ret; + } return (ret); } @@ -111,8 +113,8 @@ __os_mapfile(dbenv, path, fhp, len, is_rdonly, addr) void **addr; { /* If the user replaced the map call, call through their interface. */ - if (__db_jump.j_map != NULL) - return (__db_jump.j_map(path, len, 0, is_rdonly, addr)); + if (DB_GLOBAL(j_map) != NULL) + return (DB_GLOBAL(j_map)(path, len, 0, is_rdonly, addr)); return (__os_map(dbenv, path, NULL, fhp, len, 0, 0, is_rdonly, addr)); } @@ -128,10 +130,9 @@ __os_unmapfile(dbenv, addr, len) size_t len; { /* If the user replaced the map call, call through their interface. */ - if (__db_jump.j_unmap != NULL) - return (__db_jump.j_unmap(addr, len)); + if (DB_GLOBAL(j_unmap) != NULL) + return (DB_GLOBAL(j_unmap)(addr, len)); - __os_set_errno(0); return (!UnmapViewOfFile(addr) ? __os_win32_errno() : 0); } @@ -151,23 +152,55 @@ __os_unmapfile(dbenv, addr, len) * foo.bar == Foo.Bar (FAT file system) * foo.bar != Foo.Bar (NTFS) * - * The best solution is to use the identifying number in the file + * The best solution is to use the file index, found in the file * information structure (similar to UNIX inode #). + * + * When a file is deleted, its file index may be reused, + * but if the unique name has not gone from its namespace, + * we may get a conflict. So to ensure some tie in to the + * original pathname, we also use the creation time and the + * file basename. This is not a perfect system, but it + * should work for all but anamolous test cases. + * */ static int -__os_unique_name(orig_path, fd, result_path) +__os_unique_name(orig_path, hfile, result_path, result_path_len) char *orig_path, *result_path; - int fd; + HANDLE hfile; + size_t result_path_len; { BY_HANDLE_FILE_INFORMATION fileinfo; + char *basename, *p; - __os_set_errno(0); - if (!GetFileInformationByHandle( - (HANDLE)_get_osfhandle(fd), &fileinfo)) + /* + * In Windows, pathname components are delimited by '/' or '\', and + * if neither is present, we need to strip off leading drive letter + * (e.g. c:foo.txt). + */ + basename = strrchr(orig_path, '/'); + p = strrchr(orig_path, '\\'); + if (basename == NULL || (p != NULL && p > basename)) + basename = p; + if (basename == NULL) + basename = strrchr(orig_path, ':'); + + if (basename == NULL) + basename = orig_path; + else + basename++; + + if (!GetFileInformationByHandle(hfile, &fileinfo)) return (__os_win32_errno()); - (void)sprintf(result_path, "%ld.%ld.%ld", + + (void)snprintf(result_path, result_path_len, + "__db_shmem.%8.8lx.%8.8lx.%8.8lx.%8.8lx.%8.8lx.%s", fileinfo.dwVolumeSerialNumber, - fileinfo.nFileIndexHigh, fileinfo.nFileIndexLow); + fileinfo.nFileIndexHigh, + fileinfo.nFileIndexLow, + fileinfo.ftCreationTime.dwHighDateTime, + fileinfo.ftCreationTime.dwHighDateTime, + basename); + return (0); } @@ -187,10 +220,9 @@ __os_map(dbenv, path, infop, fhp, len, is_region, is_system, is_rdonly, addr) { HANDLE hMemory; REGENV *renv; - int ret; - void *pMemory; + int ret, use_pagefile; char shmem_name[MAXPATHLEN]; - int use_pagefile; + void *pMemory; ret = 0; if (infop != NULL) @@ -202,12 +234,9 @@ __os_map(dbenv, path, infop, fhp, len, is_region, is_system, is_rdonly, addr) * If creating a region in system space, get a matching name in the * paging file namespace. */ - if (use_pagefile) { - (void)strcpy(shmem_name, "__db_shmem."); - if ((ret = __os_unique_name(path, fhp->fd, - &shmem_name[strlen(shmem_name)])) != 0) - return (ret); - } + if (use_pagefile && (ret = __os_unique_name( + path, fhp->handle, shmem_name, sizeof(shmem_name))) != 0) + return (ret); /* * XXX @@ -235,7 +264,6 @@ __os_map(dbenv, path, infop, fhp, len, is_region, is_system, is_rdonly, addr) * the section. */ hMemory = NULL; - __os_set_errno(0); if (use_pagefile) hMemory = OpenFileMapping( is_rdonly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS, @@ -244,24 +272,23 @@ __os_map(dbenv, path, infop, fhp, len, is_region, is_system, is_rdonly, addr) if (hMemory == NULL) hMemory = CreateFileMapping( - use_pagefile ? - (HANDLE)0xFFFFFFFF : (HANDLE)_get_osfhandle(fhp->fd), + use_pagefile ? (HANDLE)-1 : fhp->handle, 0, is_rdonly ? PAGE_READONLY : PAGE_READWRITE, - 0, len, + 0, (DWORD)len, use_pagefile ? shmem_name : NULL); if (hMemory == NULL) { - __db_err(dbenv, - "OpenFileMapping: %s", strerror(__os_win32_errno())); - return (__os_win32_errno()); + ret = __os_win32_errno(); + __db_err(dbenv, "OpenFileMapping: %s", strerror(ret)); + return (ret); } pMemory = MapViewOfFile(hMemory, (is_rdonly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS), 0, 0, len); if (pMemory == NULL) { - __db_err(dbenv, - "MapViewOfFile: %s", strerror(__os_win32_errno())); - return (__os_win32_errno()); + ret = __os_win32_errno(); + __db_err(dbenv, "MapViewOfFile: %s", strerror(ret)); + return (ret); } /* @@ -279,8 +306,8 @@ __os_map(dbenv, path, infop, fhp, len, is_region, is_system, is_rdonly, addr) * errors, it just means we leak the memory. */ if (use_pagefile && infop != NULL) { - if (__os_malloc(NULL, - sizeof(HANDLE), NULL, &infop->wnt_handle) == 0) + if (__os_malloc(dbenv, + sizeof(HANDLE), &infop->wnt_handle) == 0) memcpy(infop->wnt_handle, &hMemory, sizeof(HANDLE)); } else CloseHandle(hMemory); @@ -295,7 +322,7 @@ __os_map(dbenv, path, infop, fhp, len, is_region, is_system, is_rdonly, addr) * the REGINFO structure so that they do so. */ renv = (REGENV *)pMemory; - if (renv->magic == 0) + if (renv->magic == 0) { if (F_ISSET(infop, REGION_CREATE_OK)) F_SET(infop, REGION_CREATE); else { @@ -303,6 +330,7 @@ __os_map(dbenv, path, infop, fhp, len, is_region, is_system, is_rdonly, addr) pMemory = NULL; ret = EAGAIN; } + } } *addr = pMemory; diff --git a/bdb/os_win32/os_open.c b/bdb/os_win32/os_open.c index 7ecd96126df..c8bae54d585 100644 --- a/bdb/os_win32/os_open.c +++ b/bdb/os_win32/os_open.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1997, 1998, 1999, 2000 + * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_open.c,v 11.9 2000/11/30 00:58:43 ubell Exp $"; +static const char revid[] = "$Id: os_open.c,v 11.21 2002/07/12 18:56:55 bostic Exp $"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -21,9 +21,6 @@ static const char revid[] = "$Id: os_open.c,v 11.9 2000/11/30 00:58:43 ubell Exp #endif #include "db_int.h" -#include "os_jump.h" - -int __os_win32_errno __P((void)); /* * __os_open -- @@ -38,17 +35,26 @@ __os_open(dbenv, name, flags, mode, fhp) DB_FH *fhp; { DWORD bytesWritten; - HANDLE wh; - u_int32_t log_size; + u_int32_t log_size, pagesize, sectorsize; int access, attr, oflags, share, createflag; int ret, nrepeat; + char *drive, dbuf[4]; /* <letter><colon><slosh><nul> */ + +#ifdef DIAGNOSTIC +#define OKFLAGS \ + (DB_OSO_CREATE | DB_OSO_DIRECT | DB_OSO_EXCL | DB_OSO_LOG | \ + DB_OSO_RDONLY | DB_OSO_REGION | DB_OSO_SEQ | DB_OSO_TEMP | \ + DB_OSO_TRUNC) + if ((ret = __db_fchk(dbenv, "__os_open", flags, OKFLAGS)) != 0) + return (ret); +#endif /* * The "public" interface to the __os_open routine passes around POSIX * 1003.1 flags, not DB flags. If the user has defined their own open * interface, use the POSIX flags. */ - if (__db_jump.j_open != NULL) { + if (DB_GLOBAL(j_open) != NULL) { oflags = O_BINARY | O_NOINHERIT; if (LF_ISSET(DB_OSO_CREATE)) @@ -76,10 +82,15 @@ __os_open(dbenv, name, flags, mode, fhp) return (__os_openhandle(dbenv, name, oflags, mode, fhp)); } + ret = 0; + if (LF_ISSET(DB_OSO_LOG)) log_size = fhp->log_size; /* XXX: Gag. */ + pagesize = fhp->pagesize; + memset(fhp, 0, sizeof(*fhp)); + fhp->fd = -1; /* * Otherwise, use the Windows/32 CreateFile interface so that we can @@ -97,8 +108,6 @@ __os_open(dbenv, name, flags, mode, fhp) * largely meaningless on FAT, the most common file system, which * only has a "readable" and "writeable" flag, applying to all users. */ - wh = INVALID_HANDLE_VALUE; - access = GENERIC_READ; if (!LF_ISSET(DB_OSO_RDONLY)) access |= GENERIC_WRITE; @@ -134,11 +143,28 @@ __os_open(dbenv, name, flags, mode, fhp) if (LF_ISSET(DB_OSO_TEMP)) attr |= FILE_FLAG_DELETE_ON_CLOSE; - for (nrepeat = 1; nrepeat < 4; ++nrepeat) { - ret = 0; - __os_set_errno(0); - wh = CreateFile(name, access, share, NULL, createflag, attr, 0); - if (wh == INVALID_HANDLE_VALUE) { + /* + * We can turn filesystem buffering off if the page size is a + * multiple of the disk's sector size. To find the sector size, + * we call GetDiskFreeSpace, which expects a drive name like "d:\\" + * or NULL for the current disk (i.e., a relative path) + */ + if (LF_ISSET(DB_OSO_DIRECT) && pagesize != 0 && name[0] != '\0') { + if (name[1] == ':') { + drive = dbuf; + snprintf(dbuf, sizeof(dbuf), "%c:\\", name[0]); + } else + drive = NULL; + + if (GetDiskFreeSpace(drive, NULL, §orsize, NULL, NULL) && + pagesize % sectorsize == 0) + attr |= FILE_FLAG_NO_BUFFERING; + } + + for (nrepeat = 1;; ++nrepeat) { + fhp->handle = + CreateFile(name, access, share, NULL, createflag, attr, 0); + if (fhp->handle == INVALID_HANDLE_VALUE) { /* * If it's a "temporary" error, we retry up to 3 times, * waiting up to 12 seconds. While it's not a problem @@ -146,13 +172,13 @@ __os_open(dbenv, name, flags, mode, fhp) * log file is cause for serious dismay. */ ret = __os_win32_errno(); - if (ret == ENFILE || ret == EMFILE || ret == ENOSPC) { - (void)__os_sleep(dbenv, nrepeat * 2, 0); - continue; - } - goto err; - } - break; + if ((ret != ENFILE && ret != EMFILE && ret != ENOSPC) || + nrepeat > 3) + goto err; + + (void)__os_sleep(dbenv, nrepeat * 2, 0); + } else + break; } /* @@ -163,39 +189,29 @@ __os_open(dbenv, name, flags, mode, fhp) * This strategy only works for Win/NT; Win/9X does not * guarantee that the logs will be zero filled. */ - if (LF_ISSET(DB_OSO_LOG) && log_size != 0 && - __os_is_winnt()) { - if (SetFilePointer(wh, + if (LF_ISSET(DB_OSO_LOG) && log_size != 0 && __os_is_winnt()) { + if (SetFilePointer(fhp->handle, log_size - 1, NULL, FILE_BEGIN) == (DWORD)-1) goto err; - if (WriteFile(wh, "\x00", 1, &bytesWritten, NULL) == 0) + if (WriteFile(fhp->handle, "\x00", 1, &bytesWritten, NULL) == 0) goto err; if (bytesWritten != 1) goto err; - if (SetEndOfFile(wh) == 0) + if (SetEndOfFile(fhp->handle) == 0) goto err; - if (SetFilePointer(wh, 0, NULL, FILE_BEGIN) == (DWORD)-1) + if (SetFilePointer( + fhp->handle, 0, NULL, FILE_BEGIN) == (DWORD)-1) goto err; - if (FlushFileBuffers(wh) == 0) + if (FlushFileBuffers(fhp->handle) == 0) goto err; } - /* - * We acquire a POSIX file descriptor as this allows us to use the - * general UNIX I/O routines instead of writing Windows specific - * ones. Closing that file descriptor is sufficient to close the - * Windows HANDLE. - */ - fhp->fd = - _open_osfhandle((long)wh, LF_ISSET(DB_OSO_RDONLY) ? O_RDONLY : 0); - fhp->handle = wh; F_SET(fhp, DB_FH_VALID); - return (0); err: if (ret == 0) ret = __os_win32_errno(); - if (wh != INVALID_HANDLE_VALUE) - (void)CloseHandle(wh); + if (fhp->handle != INVALID_HANDLE_VALUE) + (void)CloseHandle(fhp->handle); return (ret); } diff --git a/bdb/os_win32/os_rename.c b/bdb/os_win32/os_rename.c index cd53ec02022..ba14cb73bb0 100644 --- a/bdb/os_win32/os_rename.c +++ b/bdb/os_win32/os_rename.c @@ -1,57 +1,74 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1997, 1998, 1999, 2000 + * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_rename.c,v 1.2 2000/06/13 19:52:19 dda Exp $"; +static const char revid[] = "$Id: os_rename.c,v 1.12 2002/07/12 18:56:55 bostic Exp $"; #endif /* not lint */ #include "db_int.h" -#include "os_jump.h" /* * __os_rename -- * Rename a file. */ int -__os_rename(dbenv, old, new) +__os_rename(dbenv, oldname, newname, flags) DB_ENV *dbenv; - const char *old, *new; + const char *oldname, *newname; + u_int32_t flags; { int ret; + char oldbuf[MAX_PATH], newbuf[MAX_PATH]; ret = 0; - if (__db_jump.j_rename != NULL) { - if (__db_jump.j_rename(old, new) == -1) + if (DB_GLOBAL(j_rename) != NULL) { + if (DB_GLOBAL(j_rename)(oldname, newname) == -1) ret = __os_get_errno(); + goto done; } - else { - /* Normally we would use a single MoveFileEx call with - * MOVEFILE_REPLACE_EXISTING flag to simulate Unix rename(). - * But if the target file exists, and the two files' 8.3 - * names are identical, a Windows bug causes the target file - * to be deleted, but the original file will not be renamed, - * and an ENOENT error will be returned. (See MSDN for a - * description of the bug). - * - * After the failed call, a MoveFile seems to perform - * the rename correctly (even another call to MoveFileEx - * does not)! The expense of this extra call only occurs - * on systems with the bug: Windows/98, for one, but - * apparently not Windows/NT and Windows/2000. - */ - if (MoveFileEx(old, new, MOVEFILE_REPLACE_EXISTING) != TRUE) - ret = __os_win32_errno(); - if ((ret == ENOENT || ret == EIO) && MoveFile(old, new) == TRUE) - ret = 0; + + if (!MoveFile(oldname, newname)) + ret = __os_win32_errno(); + + if (ret == EEXIST) { + ret = 0; + if (__os_is_winnt()) { + if (!MoveFileEx( + oldname, newname, MOVEFILE_REPLACE_EXISTING)) + ret = __os_win32_errno(); + } else { + /* + * There is no MoveFileEx for Win9x/Me, so we have to + * do the best we can. + */ + if (!GetLongPathName(oldname, oldbuf, sizeof oldbuf) || + !GetLongPathName(newname, newbuf, sizeof newbuf)) { + ret = __os_win32_errno(); + goto done; + } + + /* + * If the old and new names differ only in case, we're + * done. + */ + if (strcasecmp(oldbuf, newbuf) == 0) + goto done; + + (void)DeleteFile(newname); + if (!MoveFile(oldname, newname)) + ret = __os_win32_errno(); + } } - if (ret != 0) - __db_err(dbenv, "Rename %s %s: %s", old, new, strerror(ret)); + +done: if (ret != 0 && flags == 0) + __db_err(dbenv, + "Rename %s %s: %s", oldname, newname, strerror(ret)); return (ret); } diff --git a/bdb/os_win32/os_rw.c b/bdb/os_win32/os_rw.c new file mode 100644 index 00000000000..63d1f715c53 --- /dev/null +++ b/bdb/os_win32/os_rw.c @@ -0,0 +1,182 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1997-2002 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: os_rw.c,v 11.28 2002/08/06 04:56:19 bostic Exp $"; +#endif /* not lint */ + +#ifndef NO_SYSTEM_INCLUDES +#include <sys/types.h> + +#include <string.h> +#include <unistd.h> +#endif + +#include "db_int.h" + +/* + * __os_io -- + * Do an I/O. + * + * PUBLIC: int __os_io __P((DB_ENV *, DB_IO *, int, size_t *)); + */ +int +__os_io(dbenv, db_iop, op, niop) + DB_ENV *dbenv; + DB_IO *db_iop; + int op; + size_t *niop; +{ + int ret; + + if (__os_is_winnt()) { + ULONG64 off = (ULONG64)db_iop->pagesize * db_iop->pgno; + OVERLAPPED over; + DWORD nbytes; + over.Offset = (DWORD)(off & 0xffffffff); + over.OffsetHigh = (DWORD)(off >> 32); + over.hEvent = 0; /* we don't want asynchronous notifications */ + + switch (op) { + case DB_IO_READ: + if (DB_GLOBAL(j_read) != NULL) + goto slow; + if (!ReadFile(db_iop->fhp->handle, + db_iop->buf, (DWORD)db_iop->bytes, &nbytes, &over)) + goto slow; + break; + case DB_IO_WRITE: + if (DB_GLOBAL(j_write) != NULL) + goto slow; + if (!WriteFile(db_iop->fhp->handle, + db_iop->buf, (DWORD)db_iop->bytes, &nbytes, &over)) + goto slow; + break; + } + if (nbytes == db_iop->bytes) { + *niop = (size_t)nbytes; + return (0); + } + } + +slow: MUTEX_THREAD_LOCK(dbenv, db_iop->mutexp); + + if ((ret = __os_seek(dbenv, db_iop->fhp, + db_iop->pagesize, db_iop->pgno, 0, 0, DB_OS_SEEK_SET)) != 0) + goto err; + + switch (op) { + case DB_IO_READ: + ret = __os_read(dbenv, + db_iop->fhp, db_iop->buf, db_iop->bytes, niop); + break; + case DB_IO_WRITE: + ret = __os_write(dbenv, + db_iop->fhp, db_iop->buf, db_iop->bytes, niop); + break; + } + +err: MUTEX_THREAD_UNLOCK(dbenv, db_iop->mutexp); + + return (ret); +} + +/* + * __os_read -- + * Read from a file handle. + * + * PUBLIC: int __os_read __P((DB_ENV *, DB_FH *, void *, size_t, size_t *)); + */ +int +__os_read(dbenv, fhp, addr, len, nrp) + DB_ENV *dbenv; + DB_FH *fhp; + void *addr; + size_t len; + size_t *nrp; +{ + size_t offset; + DWORD nr; + int ret; + BOOL success; + u_int8_t *taddr; + + for (taddr = addr, + offset = 0; offset < len; taddr += nr, offset += nr) { +retry: if (DB_GLOBAL(j_read) != NULL) { + nr = (DWORD)DB_GLOBAL(j_read)(fhp->fd, + taddr, len - offset); + success = (nr >= 0); + } else { + success = ReadFile(fhp->handle, + taddr, (DWORD)(len - offset), &nr, NULL); + if (!success) + __os_set_errno(__os_win32_errno()); + } + + if (!success) { + if ((ret = __os_get_errno()) == EINTR) + goto retry; + __db_err(dbenv, "read: 0x%lx, %lu: %s", + P_TO_ULONG(taddr), + (u_long)len - offset, strerror(ret)); + return (ret); + } + if (nr == 0) + break; + } + *nrp = taddr - (u_int8_t *)addr; + return (0); +} + +/* + * __os_write -- + * Write to a file handle. + * + * PUBLIC: int __os_write __P((DB_ENV *, DB_FH *, void *, size_t, size_t *)); + */ +int +__os_write(dbenv, fhp, addr, len, nwp) + DB_ENV *dbenv; + DB_FH *fhp; + void *addr; + size_t len; + size_t *nwp; +{ + size_t offset; + DWORD nw; + int ret; + BOOL success; + u_int8_t *taddr; + + for (taddr = addr, + offset = 0; offset < len; taddr += nw, offset += nw) { +retry: if (DB_GLOBAL(j_write) != NULL) { + nw = (DWORD)DB_GLOBAL(j_write)(fhp->fd, + taddr, len - offset); + success = (nw >= 0); + } else { + success = WriteFile(fhp->handle, + taddr, (DWORD)(len - offset), &nw, NULL); + if (!success) + __os_set_errno(__os_win32_errno()); + } + + if (!success) { + if ((ret = __os_get_errno()) == EINTR) + goto retry; + __db_err(dbenv, "write: 0x%x, %lu: %s", taddr, + (u_long)len-offset, strerror(ret)); + return (ret); + } + } + + *nwp = len; + return (0); +} diff --git a/bdb/os_win32/os_seek.c b/bdb/os_win32/os_seek.c index 8cf3c98aa91..40140f51534 100644 --- a/bdb/os_win32/os_seek.c +++ b/bdb/os_win32/os_seek.c @@ -1,18 +1,17 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1997, 1998, 1999, 2000 + * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_seek.c,v 11.8 2000/05/17 19:30:19 bostic Exp $"; +static const char revid[] = "$Id: os_seek.c,v 11.17 2002/08/06 04:56:20 bostic Exp $"; #endif /* not lint */ #include "db_int.h" -#include "os_jump.h" /* * __os_seek -- @@ -28,32 +27,56 @@ __os_seek(dbenv, fhp, pgsize, pageno, relative, isrewind, db_whence) int isrewind; DB_OS_SEEK db_whence; { - __int64 offset; + /* Yes, this really is how Microsoft have designed their API */ + union { + __int64 bigint; + struct { + unsigned long low; + long high; + }; + } offset; int ret, whence; + DWORD from; - switch (db_whence) { - case DB_OS_SEEK_CUR: - whence = SEEK_CUR; - break; - case DB_OS_SEEK_END: - whence = SEEK_END; - break; - case DB_OS_SEEK_SET: - whence = SEEK_SET; - break; - default: - return (EINVAL); - } + if (DB_GLOBAL(j_seek) != NULL) { + switch (db_whence) { + case DB_OS_SEEK_CUR: + whence = SEEK_CUR; + break; + case DB_OS_SEEK_END: + whence = SEEK_END; + break; + case DB_OS_SEEK_SET: + whence = SEEK_SET; + break; + default: + return (EINVAL); + } - if (__db_jump.j_seek != NULL) - ret = __db_jump.j_seek(fhp->fd, pgsize, pageno, + ret = DB_GLOBAL(j_seek)(fhp->fd, pgsize, pageno, relative, isrewind, whence); - else { - offset = (__int64)pgsize * pageno + relative; + } else { + switch (db_whence) { + case DB_OS_SEEK_CUR: + from = FILE_CURRENT; + break; + case DB_OS_SEEK_END: + from = FILE_END; + break; + case DB_OS_SEEK_SET: + from = FILE_BEGIN; + break; + default: + return (EINVAL); + } + + offset.bigint = (__int64)pgsize * pageno + relative; if (isrewind) - offset = -offset; - ret = _lseeki64( - fhp->fd, offset, whence) == -1 ? __os_get_errno() : 0; + offset.bigint = -offset.bigint; + + ret = (SetFilePointer(fhp->handle, + offset.low, &offset.high, from) == (DWORD) - 1) ? + __os_win32_errno() : 0; } if (ret != 0) diff --git a/bdb/os_win32/os_sleep.c b/bdb/os_win32/os_sleep.c index f0248a583de..12b4a7dbc2d 100644 --- a/bdb/os_win32/os_sleep.c +++ b/bdb/os_win32/os_sleep.c @@ -1,18 +1,17 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1997, 1998, 1999, 2000 + * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_sleep.c,v 11.4 2000/03/30 01:46:43 ubell Exp $"; +static const char revid[] = "$Id: os_sleep.c,v 11.8 2002/07/12 18:56:56 bostic Exp $"; #endif /* not lint */ #include "db_int.h" -#include "os_jump.h" /* * __os_sleep -- @@ -29,8 +28,8 @@ __os_sleep(dbenv, secs, usecs) for (; usecs >= 1000000; ++secs, usecs -= 1000000) ; - if (__db_jump.j_sleep != NULL) - return (__db_jump.j_sleep(secs, usecs)); + if (DB_GLOBAL(j_sleep) != NULL) + return (DB_GLOBAL(j_sleep)(secs, usecs)); /* * It's important that we yield the processor here so that other diff --git a/bdb/os_win32/os_spin.c b/bdb/os_win32/os_spin.c index f250c523d14..eb50b3b53ff 100644 --- a/bdb/os_win32/os_spin.c +++ b/bdb/os_win32/os_spin.c @@ -1,25 +1,25 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1997, 1998, 1999, 2000 + * Copyright (c) 1997-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_spin.c,v 11.6 2000/05/17 19:30:19 bostic Exp $"; +static const char revid[] = "$Id: os_spin.c,v 11.11 2002/07/12 18:56:56 bostic Exp $"; #endif /* not lint */ #include "db_int.h" -#include "os_jump.h" /* * __os_spin -- * Return the number of default spins before blocking. */ int -__os_spin() +__os_spin(dbenv) + DB_ENV *dbenv; { SYSTEM_INFO SystemInfo; @@ -27,8 +27,8 @@ __os_spin() * If the application specified a value or we've already figured it * out, return it. */ - if (DB_GLOBAL(db_tas_spins) != 0) - return (DB_GLOBAL(db_tas_spins)); + if (dbenv->tas_spins != 0) + return (dbenv->tas_spins); /* Get the number of processors */ GetSystemInfo(&SystemInfo); @@ -38,10 +38,10 @@ __os_spin() * is a reasonable value. */ if (SystemInfo.dwNumberOfProcessors > 1) - DB_GLOBAL(db_tas_spins) = 50 * SystemInfo.dwNumberOfProcessors; + dbenv->tas_spins = 50 * SystemInfo.dwNumberOfProcessors; else - DB_GLOBAL(db_tas_spins) = 1; - return (DB_GLOBAL(db_tas_spins)); + dbenv->tas_spins = 1; + return (dbenv->tas_spins); } /* @@ -53,7 +53,7 @@ __os_yield(dbenv, usecs) DB_ENV *dbenv; u_long usecs; { - if (__db_jump.j_yield != NULL && __db_jump.j_yield() == 0) + if (DB_GLOBAL(j_yield) != NULL && DB_GLOBAL(j_yield)() == 0) return; __os_sleep(dbenv, 0, usecs); } diff --git a/bdb/os_win32/os_stat.c b/bdb/os_win32/os_stat.c new file mode 100644 index 00000000000..c1cba698bea --- /dev/null +++ b/bdb/os_win32/os_stat.c @@ -0,0 +1,100 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1997-2002 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: os_stat.c,v 11.22 2002/07/12 18:56:56 bostic Exp $"; +#endif /* not lint */ + +#ifndef NO_SYSTEM_INCLUDES +#include <sys/types.h> +#include <sys/stat.h> + +#include <string.h> +#endif + +#include "db_int.h" + +/* + * __os_exists -- + * Return if the file exists. + * + * PUBLIC: int __os_exists __P((const char *, int *)); + */ +int +__os_exists(path, isdirp) + const char *path; + int *isdirp; +{ + int ret; + DWORD attrs; + + if (DB_GLOBAL(j_exists) != NULL) + return (DB_GLOBAL(j_exists)(path, isdirp)); + + ret = 0; + do { + attrs = GetFileAttributes(path); + if (attrs == (DWORD)-1) + ret = __os_win32_errno(); + } while (ret == EINTR); + + if (ret != 0) + return (ret); + + if (isdirp != NULL) + *isdirp = (attrs & FILE_ATTRIBUTE_DIRECTORY); + + return (0); +} + +/* + * __os_ioinfo -- + * Return file size and I/O size; abstracted to make it easier + * to replace. + * + * PUBLIC: int __os_ioinfo __P((DB_ENV *, const char *, + * PUBLIC: DB_FH *, u_int32_t *, u_int32_t *, u_int32_t *)); + */ +int +__os_ioinfo(dbenv, path, fhp, mbytesp, bytesp, iosizep) + DB_ENV *dbenv; + const char *path; + DB_FH *fhp; + u_int32_t *mbytesp, *bytesp, *iosizep; +{ + int ret; + BY_HANDLE_FILE_INFORMATION bhfi; + unsigned __int64 filesize; + + if (DB_GLOBAL(j_ioinfo) != NULL) + return (DB_GLOBAL(j_ioinfo)(path, + fhp->fd, mbytesp, bytesp, iosizep)); + +retry: if (!GetFileInformationByHandle(fhp->handle, &bhfi)) { + if ((ret = __os_win32_errno()) == EINTR) + goto retry; + __db_err(dbenv, + "GetFileInformationByHandle: %s", strerror(ret)); + return (ret); + } + + filesize = ((unsigned __int64)bhfi.nFileSizeHigh << 32) + + bhfi.nFileSizeLow; + + /* Return the size of the file. */ + if (mbytesp != NULL) + *mbytesp = (u_int32_t)(filesize / MEGABYTE); + if (bytesp != NULL) + *bytesp = (u_int32_t)(filesize % MEGABYTE); + + /* The filesystem blocksize is not easily available. */ + if (iosizep != NULL) + *iosizep = DB_DEF_IOSIZE; + return (0); +} diff --git a/bdb/os_win32/os_type.c b/bdb/os_win32/os_type.c index a82fc4b1d4e..583da0aaf1e 100644 --- a/bdb/os_win32/os_type.c +++ b/bdb/os_win32/os_type.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1998, 1999, 2000 + * Copyright (c) 1998-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: os_type.c,v 11.3 2000/02/14 03:00:07 bostic Exp $"; +static const char revid[] = "$Id: os_type.c,v 11.6 2002/01/11 15:53:08 bostic Exp $"; #endif /* not lint */ /* @@ -26,10 +26,11 @@ __os_is_winnt() * The value of __os_type is computed only once, and cached to * avoid the overhead of repeated calls to GetVersion(). */ - if (__os_type == -1) + if (__os_type == -1) { if ((GetVersion() & 0x80000000) == 0) __os_type = 1; else __os_type = 0; + } return (__os_type); } |