00001
00002
00003
00004
00005
00006
00007
00008 #include "config.h"
00009
00010 #ifndef lint
00011 static const char revid[] = "$Id: os__spin_8c-source.html,v 1.1 2008/06/08 10:21:31 sebdiaz Exp $";
00012 #endif
00013
00014 #ifndef NO_SYSTEM_INCLUDES
00015 #include <sys/types.h>
00016 #if defined(HAVE_PSTAT_GETDYNAMIC)
00017 #include <sys/pstat.h>
00018 #endif
00019
00020 #include <limits.h>
00021 #include <unistd.h>
00022 #endif
00023
00024 #include "db_int.h"
00025 #include "os_jump.h"
00026
00027 #if defined(HAVE_PSTAT_GETDYNAMIC)
00028
00029
00030
00031
00032 static int
00033 __os_pstat_getdynamic()
00034 {
00035 struct pst_dynamic psd;
00036
00037 return (pstat_getdynamic(&psd,
00038 sizeof(psd), (size_t)1, 0) == -1 ? 1 : psd.psd_proc_cnt);
00039 }
00040 #endif
00041
00042 #if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
00043
00044
00045
00046
00047 static int
00048 __os_sysconf()
00049 {
00050 int nproc;
00051
00052 return ((nproc = sysconf(_SC_NPROCESSORS_ONLN)) > 1 ? nproc : 1);
00053 }
00054 #endif
00055
00056
00057
00058
00059
00060
00061
00062 int
00063 CDB___os_spin()
00064 {
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 if (DB_GLOBAL(db_tas_spins) != 0)
00075 return (DB_GLOBAL(db_tas_spins));
00076
00077 DB_GLOBAL(db_tas_spins) = 1;
00078 #if defined(HAVE_PSTAT_GETDYNAMIC)
00079 DB_GLOBAL(db_tas_spins) = __os_pstat_getdynamic();
00080 #endif
00081 #if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
00082 DB_GLOBAL(db_tas_spins) = __os_sysconf();
00083 #endif
00084
00085
00086
00087
00088
00089 if (DB_GLOBAL(db_tas_spins) != 1)
00090 DB_GLOBAL(db_tas_spins) *= 50;
00091
00092 return (DB_GLOBAL(db_tas_spins));
00093 }
00094
00095
00096
00097
00098
00099
00100
00101 void
00102 CDB___os_yield(dbenv, usecs)
00103 DB_ENV *dbenv;
00104 u_long usecs;
00105 {
00106 if (CDB___db_jump.j_yield != NULL && CDB___db_jump.j_yield() == 0)
00107 return;
00108 CDB___os_sleep(dbenv, 0, usecs);
00109 }