00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "db_config.h"
00011
00012 #ifndef NO_SYSTEM_INCLUDES
00013 #include <sys/types.h>
00014
00015 #include <stdlib.h>
00016 #endif
00017
00018 #include "db_int.h"
00019 #include "dbinc/mutex_int.h"
00020
00021
00022
00023
00024
00025
00026
00027
00028 void
00029 __os_id(dbenv, pidp, tidp)
00030 DB_ENV *dbenv;
00031 pid_t *pidp;
00032 db_threadid_t *tidp;
00033 {
00034
00035
00036
00037
00038
00039
00040
00041
00042 if (pidp != NULL) {
00043 if (dbenv == NULL) {
00044 #if defined(HAVE_VXWORKS)
00045 *pidp = taskIdSelf();
00046 #else
00047 *pidp = getpid();
00048 #endif
00049 } else
00050 *pidp = dbenv->pid_cache;
00051 }
00052
00053 if (tidp != NULL) {
00054 #if defined(DB_WIN32)
00055 *tidp = GetCurrentThreadId();
00056 #elif defined(HAVE_MUTEX_UI_THREADS)
00057 *tidp = thr_self();
00058 #elif defined(HAVE_MUTEX_SOLARIS_LWP) || \
00059 defined(HAVE_MUTEX_PTHREADS) || defined(HAVE_PTHREAD_SELF)
00060 *tidp = pthread_self();
00061 #else
00062
00063
00064
00065 *tidp = 0;
00066 #endif
00067 }
00068 }
00069
00070
00071
00072
00073
00074
00075
00076 void
00077 __os_unique_id(dbenv, idp)
00078 DB_ENV *dbenv;
00079 u_int32_t *idp;
00080 {
00081 static int first = 1;
00082 pid_t pid;
00083 db_threadid_t tid;
00084 u_int32_t id, sec, usec;
00085
00086 *idp = 0;
00087
00088
00089
00090
00091
00092 __os_id(dbenv, &pid, &tid);
00093 __os_clock(dbenv, &sec, &usec);
00094
00095 id = (u_int32_t)pid ^ sec ^ usec ^ P_TO_UINT32(&pid);
00096
00097
00098
00099
00100
00101
00102 #if HAVE_SRAND
00103 if (first == 1)
00104 srand((u_int)id);
00105 #endif
00106 first = 0;
00107
00108 #if HAVE_RAND
00109 id ^= (u_int)rand();
00110 #endif
00111
00112 *idp = id;
00113 }