Changeset 101903 in vbox
- Timestamp:
- Nov 6, 2023 8:57:45 PM (15 months ago)
- Location:
- trunk/src/libs/xpcom18a4
- Files:
-
- 1 deleted
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/libs/xpcom18a4/Makefile.kmk
r101891 r101903 180 180 nsprpub/pr/include/prinrval.h \ 181 181 nsprpub/pr/include/prio.h \ 182 nsprpub/pr/include/pripcsem.h \183 182 nsprpub/pr/include/prlink.h \ 184 183 nsprpub/pr/include/prlock.h \ -
trunk/src/libs/xpcom18a4/nsprpub/pr/include/nspr.h
r101875 r101903 51 51 #include "prinrval.h" 52 52 #include "prio.h" 53 #include "pripcsem.h"54 53 #include "prlink.h" 55 54 #include "prlock.h" -
trunk/src/libs/xpcom18a4/nsprpub/pr/src/pthreads/ptsynch.c
r101805 r101903 58 58 #if defined(DEBUG) 59 59 extern PTDebug pt_debug; /* this is shared between several modules */ 60 61 #if defined(_PR_DCETHREADS)62 static pthread_t pt_zero_tid; /* a null pthread_t (pthread_t is a struct63 * in DCE threads) to compare with */64 #endif /* defined(_PR_DCETHREADS) */65 60 #endif /* defined(DEBUG) */ 66 61 … … 270 265 271 266 /* NSPR doesn't report timeouts */ 272 #ifdef _PR_DCETHREADS273 if (rv == -1) return (errno == EAGAIN) ? 0 : errno;274 else return rv;275 #else276 267 return (rv == ETIMEDOUT) ? 0 : rv; 277 #endif278 268 } /* pt_TimedWait */ 279 269 … … 678 668 } 679 669 680 /*681 * Define the interprocess named semaphore functions.682 * There are three implementations:683 * 1. POSIX semaphore based;684 * 2. System V semaphore based;685 * 3. unsupported (fails with PR_NOT_IMPLEMENTED_ERROR).686 */687 688 #ifdef _PR_HAVE_POSIX_SEMAPHORES689 #include <fcntl.h>690 691 PR_IMPLEMENT(PRSem *) PR_OpenSemaphore(692 const char *name,693 PRIntn flags,694 PRIntn mode,695 PRUintn value)696 {697 PRSem *sem;698 char osname[PR_IPC_NAME_SIZE];699 700 if (_PR_MakeNativeIPCName(name, osname, sizeof(osname), _PRIPCSem)701 == PR_FAILURE)702 {703 return NULL;704 }705 706 sem = PR_NEW(PRSem);707 if (NULL == sem)708 {709 PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);710 return NULL;711 }712 713 if (flags & PR_SEM_CREATE)714 {715 int oflag = O_CREAT;716 717 if (flags & PR_SEM_EXCL) oflag |= O_EXCL;718 sem->sem = sem_open(osname, oflag, mode, value);719 }720 else721 {722 #ifdef HPUX723 /* Pass 0 as the mode and value arguments to work around a bug. */724 sem->sem = sem_open(osname, 0, 0, 0);725 #else726 sem->sem = sem_open(osname, 0);727 #endif728 }729 if ((sem_t *) -1 == sem->sem)730 {731 _PR_MD_MAP_DEFAULT_ERROR(errno);732 PR_DELETE(sem);733 return NULL;734 }735 return sem;736 }737 738 PR_IMPLEMENT(PRStatus) PR_WaitSemaphore(PRSem *sem)739 {740 int rv;741 rv = sem_wait(sem->sem);742 if (0 != rv)743 {744 _PR_MD_MAP_DEFAULT_ERROR(errno);745 return PR_FAILURE;746 }747 return PR_SUCCESS;748 }749 750 PR_IMPLEMENT(PRStatus) PR_PostSemaphore(PRSem *sem)751 {752 int rv;753 rv = sem_post(sem->sem);754 if (0 != rv)755 {756 _PR_MD_MAP_DEFAULT_ERROR(errno);757 return PR_FAILURE;758 }759 return PR_SUCCESS;760 }761 762 PR_IMPLEMENT(PRStatus) PR_CloseSemaphore(PRSem *sem)763 {764 int rv;765 rv = sem_close(sem->sem);766 if (0 != rv)767 {768 _PR_MD_MAP_DEFAULT_ERROR(errno);769 return PR_FAILURE;770 }771 PR_DELETE(sem);772 return PR_SUCCESS;773 }774 775 PR_IMPLEMENT(PRStatus) PR_DeleteSemaphore(const char *name)776 {777 int rv;778 char osname[PR_IPC_NAME_SIZE];779 780 if (_PR_MakeNativeIPCName(name, osname, sizeof(osname), _PRIPCSem)781 == PR_FAILURE)782 {783 return PR_FAILURE;784 }785 rv = sem_unlink(osname);786 if (0 != rv)787 {788 _PR_MD_MAP_DEFAULT_ERROR(errno);789 return PR_FAILURE;790 }791 return PR_SUCCESS;792 }793 794 #elif defined(_PR_HAVE_SYSV_SEMAPHORES)795 796 #include <fcntl.h>797 #include <sys/sem.h>798 799 /*800 * From the semctl(2) man page in glibc 2.0801 */802 #if (defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)) \803 || defined(OPENBSD) || defined(BSDI)804 /* union semun is defined by including <sys/sem.h> */805 #else806 /* according to X/OPEN we have to define it ourselves */807 union semun {808 int val;809 struct semid_ds *buf;810 unsigned short *array;811 };812 #endif813 814 /*815 * 'a' (97) is the final closing price of NSCP stock.816 */817 #define NSPR_IPC_KEY_ID 'a' /* the id argument for ftok() */818 819 #define NSPR_SEM_MODE 0666820 821 PR_IMPLEMENT(PRSem *) PR_OpenSemaphore(822 const char *name,823 PRIntn flags,824 PRIntn mode,825 PRUintn value)826 {827 PRSem *sem;828 key_t key;829 union semun arg;830 struct sembuf sop;831 struct semid_ds seminfo;832 #define MAX_TRIES 60833 PRIntn i;834 char osname[PR_IPC_NAME_SIZE];835 836 if (_PR_MakeNativeIPCName(name, osname, sizeof(osname), _PRIPCSem)837 == PR_FAILURE)838 {839 return NULL;840 }841 842 /* Make sure the file exists before calling ftok. */843 if (flags & PR_SEM_CREATE)844 {845 int osfd = open(osname, O_RDWR|O_CREAT, mode);846 if (-1 == osfd)847 {848 _PR_MD_MAP_OPEN_ERROR(errno);849 return NULL;850 }851 if (close(osfd) == -1)852 {853 _PR_MD_MAP_CLOSE_ERROR(errno);854 return NULL;855 }856 }857 key = ftok(osname, NSPR_IPC_KEY_ID);858 if ((key_t)-1 == key)859 {860 _PR_MD_MAP_DEFAULT_ERROR(errno);861 return NULL;862 }863 864 sem = PR_NEW(PRSem);865 if (NULL == sem)866 {867 PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);868 return NULL;869 }870 871 if (flags & PR_SEM_CREATE)872 {873 sem->semid = semget(key, 1, mode|IPC_CREAT|IPC_EXCL);874 if (sem->semid >= 0)875 {876 /* creator of a semaphore is responsible for initializing it */877 arg.val = 0;878 if (semctl(sem->semid, 0, SETVAL, arg) == -1)879 {880 _PR_MD_MAP_DEFAULT_ERROR(errno);881 PR_DELETE(sem);882 return NULL;883 }884 /* call semop to set sem_otime to nonzero */885 sop.sem_num = 0;886 sop.sem_op = value;887 sop.sem_flg = 0;888 if (semop(sem->semid, &sop, 1) == -1)889 {890 _PR_MD_MAP_DEFAULT_ERROR(errno);891 PR_DELETE(sem);892 return NULL;893 }894 return sem;895 }896 897 if (errno != EEXIST || flags & PR_SEM_EXCL)898 {899 _PR_MD_MAP_DEFAULT_ERROR(errno);900 PR_DELETE(sem);901 return NULL;902 }903 }904 905 sem->semid = semget(key, 1, NSPR_SEM_MODE);906 if (sem->semid == -1)907 {908 _PR_MD_MAP_DEFAULT_ERROR(errno);909 PR_DELETE(sem);910 return NULL;911 }912 for (i = 0; i < MAX_TRIES; i++)913 {914 arg.buf = &seminfo;915 semctl(sem->semid, 0, IPC_STAT, arg);916 if (seminfo.sem_otime != 0) break;917 sleep(1);918 }919 if (i == MAX_TRIES)920 {921 PR_SetError(PR_IO_TIMEOUT_ERROR, 0);922 PR_DELETE(sem);923 return NULL;924 }925 return sem;926 }927 928 PR_IMPLEMENT(PRStatus) PR_WaitSemaphore(PRSem *sem)929 {930 struct sembuf sop;931 932 sop.sem_num = 0;933 sop.sem_op = -1;934 sop.sem_flg = 0;935 if (semop(sem->semid, &sop, 1) == -1)936 {937 _PR_MD_MAP_DEFAULT_ERROR(errno);938 return PR_FAILURE;939 }940 return PR_SUCCESS;941 }942 943 PR_IMPLEMENT(PRStatus) PR_PostSemaphore(PRSem *sem)944 {945 struct sembuf sop;946 947 sop.sem_num = 0;948 sop.sem_op = 1;949 sop.sem_flg = 0;950 if (semop(sem->semid, &sop, 1) == -1)951 {952 _PR_MD_MAP_DEFAULT_ERROR(errno);953 return PR_FAILURE;954 }955 return PR_SUCCESS;956 }957 958 PR_IMPLEMENT(PRStatus) PR_CloseSemaphore(PRSem *sem)959 {960 PR_DELETE(sem);961 return PR_SUCCESS;962 }963 964 PR_IMPLEMENT(PRStatus) PR_DeleteSemaphore(const char *name)965 {966 key_t key;967 int semid;968 /* On some systems (e.g., glibc 2.0) semctl requires a fourth argument */969 union semun unused;970 char osname[PR_IPC_NAME_SIZE];971 972 if (_PR_MakeNativeIPCName(name, osname, sizeof(osname), _PRIPCSem)973 == PR_FAILURE)974 {975 return PR_FAILURE;976 }977 key = ftok(osname, NSPR_IPC_KEY_ID);978 if ((key_t) -1 == key)979 {980 _PR_MD_MAP_DEFAULT_ERROR(errno);981 return PR_FAILURE;982 }983 if (unlink(osname) == -1)984 {985 _PR_MD_MAP_UNLINK_ERROR(errno);986 return PR_FAILURE;987 }988 semid = semget(key, 1, NSPR_SEM_MODE);989 if (-1 == semid)990 {991 _PR_MD_MAP_DEFAULT_ERROR(errno);992 return PR_FAILURE;993 }994 unused.val = 0;995 if (semctl(semid, 0, IPC_RMID, unused) == -1)996 {997 _PR_MD_MAP_DEFAULT_ERROR(errno);998 return PR_FAILURE;999 }1000 return PR_SUCCESS;1001 }1002 1003 #else /* neither POSIX nor System V semaphores are available */1004 1005 PR_IMPLEMENT(PRSem *) PR_OpenSemaphore(1006 const char *name,1007 PRIntn flags,1008 PRIntn mode,1009 PRUintn value)1010 {1011 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);1012 return NULL;1013 }1014 1015 PR_IMPLEMENT(PRStatus) PR_WaitSemaphore(PRSem *sem)1016 {1017 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);1018 return PR_FAILURE;1019 }1020 1021 PR_IMPLEMENT(PRStatus) PR_PostSemaphore(PRSem *sem)1022 {1023 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);1024 return PR_FAILURE;1025 }1026 1027 PR_IMPLEMENT(PRStatus) PR_CloseSemaphore(PRSem *sem)1028 {1029 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);1030 return PR_FAILURE;1031 }1032 1033 PR_IMPLEMENT(PRStatus) PR_DeleteSemaphore(const char *name)1034 {1035 PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);1036 return PR_FAILURE;1037 }1038 1039 #endif /* end of interprocess named semaphore functions */1040 1041 /**************************************************************/1042 /**************************************************************/1043 /******************ROUTINES FOR DCE EMULATION******************/1044 /**************************************************************/1045 /**************************************************************/1046 1047 #include "prpdce.h"1048 1049 PR_IMPLEMENT(PRStatus) PRP_TryLock(PRLock *lock)1050 {1051 PRIntn rv = pthread_mutex_trylock(&lock->mutex);1052 if (rv == PT_TRYLOCK_SUCCESS)1053 {1054 PR_ASSERT(PR_FALSE == lock->locked);1055 lock->locked = PR_TRUE;1056 lock->owner = pthread_self();1057 }1058 /* XXX set error code? */1059 return (PT_TRYLOCK_SUCCESS == rv) ? PR_SUCCESS : PR_FAILURE;1060 } /* PRP_TryLock */1061 1062 PR_IMPLEMENT(PRCondVar*) PRP_NewNakedCondVar(void)1063 {1064 PRCondVar *cv;1065 1066 if (!_pr_initialized) _PR_ImplicitInitialization();1067 1068 cv = PR_NEW(PRCondVar);1069 if (cv != NULL)1070 {1071 int rv;1072 rv = _PT_PTHREAD_COND_INIT(cv->cv, _pt_cvar_attr);1073 PR_ASSERT(0 == rv);1074 cv->lock = _PR_NAKED_CV_LOCK;1075 }1076 return cv;1077 } /* PRP_NewNakedCondVar */1078 1079 PR_IMPLEMENT(void) PRP_DestroyNakedCondVar(PRCondVar *cvar)1080 {1081 int rv;1082 rv = pthread_cond_destroy(&cvar->cv); PR_ASSERT(0 == rv);1083 #if defined(DEBUG)1084 memset(cvar, 0xaf, sizeof(PRCondVar));1085 #endif1086 PR_DELETE(cvar);1087 } /* PRP_DestroyNakedCondVar */1088 1089 PR_IMPLEMENT(PRStatus) PRP_NakedWait(1090 PRCondVar *cvar, PRLock *ml, PRIntervalTime timeout)1091 {1092 PRIntn rv;1093 PR_ASSERT(cvar != NULL);1094 /* XXX do we really want to assert this in a naked wait? */1095 PR_ASSERT(_PT_PTHREAD_MUTEX_IS_LOCKED(ml->mutex));1096 if (timeout == PR_INTERVAL_NO_TIMEOUT)1097 rv = pthread_cond_wait(&cvar->cv, &ml->mutex);1098 else1099 rv = pt_TimedWait(&cvar->cv, &ml->mutex, timeout);1100 if (rv != 0)1101 {1102 _PR_MD_MAP_DEFAULT_ERROR(rv);1103 return PR_FAILURE;1104 }1105 return PR_SUCCESS;1106 } /* PRP_NakedWait */1107 1108 PR_IMPLEMENT(PRStatus) PRP_NakedNotify(PRCondVar *cvar)1109 {1110 int rv;1111 PR_ASSERT(cvar != NULL);1112 rv = pthread_cond_signal(&cvar->cv);1113 PR_ASSERT(0 == rv);1114 return PR_SUCCESS;1115 } /* PRP_NakedNotify */1116 1117 PR_IMPLEMENT(PRStatus) PRP_NakedBroadcast(PRCondVar *cvar)1118 {1119 int rv;1120 PR_ASSERT(cvar != NULL);1121 rv = pthread_cond_broadcast(&cvar->cv);1122 PR_ASSERT(0 == rv);1123 return PR_SUCCESS;1124 } /* PRP_NakedBroadcast */1125 1126 670 /* ptsynch.c */
Note:
See TracChangeset
for help on using the changeset viewer.