| OLD | NEW |
| (Empty) |
| 1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ | |
| 2 /* This Source Code Form is subject to the terms of the Mozilla Public | |
| 3 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 5 | |
| 6 #ifndef primpl_h___ | |
| 7 #define primpl_h___ | |
| 8 | |
| 9 /* | |
| 10 * HP-UX 10.10's pthread.h (DCE threads) includes dce/cma.h, which | |
| 11 * has: | |
| 12 * #define sigaction _sigaction_sys | |
| 13 * This macro causes chaos if signal.h gets included before pthread.h. | |
| 14 * To be safe, we include pthread.h first. | |
| 15 */ | |
| 16 | |
| 17 #if defined(_PR_PTHREADS) | |
| 18 #include <pthread.h> | |
| 19 #endif | |
| 20 | |
| 21 #if defined(_PR_BTHREADS) | |
| 22 #include <kernel/OS.h> | |
| 23 #endif | |
| 24 | |
| 25 #ifdef WIN32 | |
| 26 /* | |
| 27 * Allow use of functions and symbols first defined in Win2k. | |
| 28 */ | |
| 29 #if !defined(WINVER) || (WINVER < 0x0500) | |
| 30 #undef WINVER | |
| 31 #define WINVER 0x0500 | |
| 32 #endif | |
| 33 #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) | |
| 34 #undef _WIN32_WINNT | |
| 35 #define _WIN32_WINNT 0x0500 | |
| 36 #endif | |
| 37 #endif /* WIN32 */ | |
| 38 | |
| 39 #include "nspr.h" | |
| 40 #include "prpriv.h" | |
| 41 | |
| 42 typedef struct PRSegment PRSegment; | |
| 43 | |
| 44 #include "md/prosdep.h" | |
| 45 #include "obsolete/probslet.h" | |
| 46 | |
| 47 #ifdef _PR_HAVE_POSIX_SEMAPHORES | |
| 48 #include <semaphore.h> | |
| 49 #elif defined(_PR_HAVE_SYSV_SEMAPHORES) | |
| 50 #include <sys/sem.h> | |
| 51 #endif | |
| 52 | |
| 53 #ifdef HAVE_SYSCALL | |
| 54 #include <sys/syscall.h> | |
| 55 #endif | |
| 56 | |
| 57 /************************************************************************* | |
| 58 ***** A Word about Model Dependent Function Naming Convention *********** | |
| 59 *************************************************************************/ | |
| 60 | |
| 61 /* | |
| 62 NSPR 2.0 must implement its function across a range of platforms | |
| 63 including: MAC, Windows/16, Windows/95, Windows/NT, and several | |
| 64 variants of Unix. Each implementation shares common code as well | |
| 65 as having platform dependent portions. This standard describes how | |
| 66 the model dependent portions are to be implemented. | |
| 67 | |
| 68 In header file pr/include/primpl.h, each publicly declared | |
| 69 platform dependent function is declared as: | |
| 70 | |
| 71 NSPR_API void _PR_MD_FUNCTION( long arg1, long arg2 ); | |
| 72 #define _PR_MD_FUNCTION _MD_FUNCTION | |
| 73 | |
| 74 In header file pr/include/md/<platform>/_<platform>.h, | |
| 75 each #define'd macro is redefined as one of: | |
| 76 | |
| 77 #define _MD_FUNCTION <blanks> | |
| 78 #define _MD_FUNCTION <expanded macro> | |
| 79 #define _MD_FUNCTION <osFunction> | |
| 80 #define _MD_FUNCTION <_MD_Function> | |
| 81 | |
| 82 Where: | |
| 83 | |
| 84 <blanks> is no definition at all. In this case, the function is not implemented | |
| 85 and is never called for this platform. | |
| 86 For example: | |
| 87 #define _MD_INIT_CPUS() | |
| 88 | |
| 89 <expanded macro> is a C language macro expansion. | |
| 90 For example: | |
| 91 #define _MD_CLEAN_THREAD(_thread) \ | |
| 92 PR_BEGIN_MACRO \ | |
| 93 PR_DestroyCondVar(_thread->md.asyncIOCVar); \ | |
| 94 PR_DestroyLock(_thread->md.asyncIOLock); \ | |
| 95 PR_END_MACRO | |
| 96 | |
| 97 <osFunction> is some function implemented by the host operating system. | |
| 98 For example: | |
| 99 #define _MD_EXIT exit | |
| 100 | |
| 101 <_MD_function> is the name of a function implemented for this platform in | |
| 102 pr/src/md/<platform>/<soruce>.c file. | |
| 103 For example: | |
| 104 #define _MD_GETFILEINFO _MD_GetFileInfo | |
| 105 | |
| 106 In <source>.c, the implementation is: | |
| 107 PR_IMPLEMENT(PRInt32) _MD_GetFileInfo(const char *fn, PRFileInfo *info); | |
| 108 */ | |
| 109 | |
| 110 PR_BEGIN_EXTERN_C | |
| 111 | |
| 112 typedef struct _MDLock _MDLock; | |
| 113 typedef struct _MDCVar _MDCVar; | |
| 114 typedef struct _MDSegment _MDSegment; | |
| 115 typedef struct _MDThread _MDThread; | |
| 116 typedef struct _MDThreadStack _MDThreadStack; | |
| 117 typedef struct _MDSemaphore _MDSemaphore; | |
| 118 typedef struct _MDDir _MDDir; | |
| 119 #ifdef MOZ_UNICODE | |
| 120 typedef struct _MDDirUTF16 _MDDirUTF16; | |
| 121 #endif /* MOZ_UNICODE */ | |
| 122 typedef struct _MDFileDesc _MDFileDesc; | |
| 123 typedef struct _MDProcess _MDProcess; | |
| 124 typedef struct _MDFileMap _MDFileMap; | |
| 125 | |
| 126 #if defined(_PR_PTHREADS) | |
| 127 | |
| 128 /* | |
| 129 ** The following definitions are unique to implementing NSPR using pthreads. | |
| 130 ** Since pthreads defines most of the thread and thread synchronization | |
| 131 ** stuff, this is a pretty small set. | |
| 132 */ | |
| 133 | |
| 134 #define PT_CV_NOTIFIED_LENGTH 6 | |
| 135 typedef struct _PT_Notified _PT_Notified; | |
| 136 struct _PT_Notified | |
| 137 { | |
| 138 PRIntn length; /* # of used entries in this structure */ | |
| 139 struct | |
| 140 { | |
| 141 PRCondVar *cv; /* the condition variable notified */ | |
| 142 PRIntn times; /* and the number of times notified */ | |
| 143 } cv[PT_CV_NOTIFIED_LENGTH]; | |
| 144 _PT_Notified *link; /* link to another of these | NULL */ | |
| 145 }; | |
| 146 | |
| 147 /* | |
| 148 * bits defined for pthreads 'state' field | |
| 149 */ | |
| 150 #define PT_THREAD_DETACHED 0x01 /* thread can't be joined */ | |
| 151 #define PT_THREAD_GLOBAL 0x02 /* a global thread (unlikely) */ | |
| 152 #define PT_THREAD_SYSTEM 0x04 /* system (not user) thread */ | |
| 153 #define PT_THREAD_PRIMORD 0x08 /* this is the primordial thread */ | |
| 154 #define PT_THREAD_ABORTED 0x10 /* thread has been interrupted */ | |
| 155 #define PT_THREAD_GCABLE 0x20 /* thread is garbage collectible */ | |
| 156 #define PT_THREAD_SUSPENDED 0x40 /* thread has been suspended */ | |
| 157 #define PT_THREAD_FOREIGN 0x80 /* thread is not one of ours */ | |
| 158 #define PT_THREAD_BOUND 0x100 /* a bound-global thread */ | |
| 159 | |
| 160 #define _PT_THREAD_INTERRUPTED(thr) \ | |
| 161 (!(thr->interrupt_blocked) && (thr->state & PT_THREAD_ABORTED)) | |
| 162 #define _PT_THREAD_BLOCK_INTERRUPT(thr) \ | |
| 163 (thr->interrupt_blocked = 1) | |
| 164 #define _PT_THREAD_UNBLOCK_INTERRUPT(thr) \ | |
| 165 (thr->interrupt_blocked = 0) | |
| 166 | |
| 167 #define _PT_IS_GCABLE_THREAD(thr) ((thr)->state & PT_THREAD_GCABLE) | |
| 168 | |
| 169 /* | |
| 170 ** Possible values for thread's suspend field | |
| 171 ** Note that the first two can be the same as they are really mutually exclusive
, | |
| 172 ** i.e. both cannot be happening at the same time. We have two symbolic names | |
| 173 ** just as a mnemonic. | |
| 174 **/ | |
| 175 #define PT_THREAD_RESUMED 0x80 /* thread has been resumed */ | |
| 176 #define PT_THREAD_SETGCABLE 0x100 /* set the GCAble flag */ | |
| 177 | |
| 178 #if defined(DEBUG) | |
| 179 | |
| 180 typedef struct PTDebug | |
| 181 { | |
| 182 PRTime timeStarted; | |
| 183 PRUintn locks_created, locks_destroyed; | |
| 184 PRUintn locks_acquired, locks_released; | |
| 185 PRUintn cvars_created, cvars_destroyed; | |
| 186 PRUintn cvars_notified, delayed_cv_deletes; | |
| 187 } PTDebug; | |
| 188 | |
| 189 #endif /* defined(DEBUG) */ | |
| 190 | |
| 191 NSPR_API(void) PT_FPrintStats(PRFileDesc *fd, const char *msg); | |
| 192 | |
| 193 /* | |
| 194 * On Linux and its derivatives POSIX priority scheduling works only for | |
| 195 * real-time threads. On those platforms we set thread's nice values | |
| 196 * instead which requires us to track kernel thread IDs for each POSIX | |
| 197 * thread we create. | |
| 198 */ | |
| 199 #if defined(LINUX) && defined(HAVE_SETPRIORITY) && \ | |
| 200 ((defined(HAVE_SYSCALL) && defined(SYS_gettid)) || defined(HAVE_GETTID)) | |
| 201 #define _PR_NICE_PRIORITY_SCHEDULING | |
| 202 #endif | |
| 203 | |
| 204 #else /* defined(_PR_PTHREADS) */ | |
| 205 | |
| 206 NSPR_API(void) PT_FPrintStats(PRFileDesc *fd, const char *msg); | |
| 207 | |
| 208 /* | |
| 209 ** This section is contains those parts needed to implement NSPR on | |
| 210 ** platforms in general. One would assume that the pthreads implementation | |
| 211 ** included lots of the same types, at least conceptually. | |
| 212 */ | |
| 213 | |
| 214 /* | |
| 215 * Local threads only. No multiple CPU support and hence all the | |
| 216 * following routines are no-op. | |
| 217 */ | |
| 218 #ifdef _PR_LOCAL_THREADS_ONLY | |
| 219 | |
| 220 #define _PR_MD_SUSPEND_THREAD(thread) | |
| 221 #define _PR_MD_RESUME_THREAD(thread) | |
| 222 #define _PR_MD_SUSPEND_CPU(cpu) | |
| 223 #define _PR_MD_RESUME_CPU(cpu) | |
| 224 #define _PR_MD_BEGIN_SUSPEND_ALL() | |
| 225 #define _PR_MD_END_SUSPEND_ALL() | |
| 226 #define _PR_MD_BEGIN_RESUME_ALL() | |
| 227 #define _PR_MD_END_RESUME_ALL() | |
| 228 #define _PR_MD_INIT_ATTACHED_THREAD(thread) PR_FAILURE | |
| 229 | |
| 230 #endif | |
| 231 | |
| 232 typedef struct _PRCPUQueue _PRCPUQueue; | |
| 233 typedef struct _PRCPU _PRCPU; | |
| 234 typedef struct _MDCPU _MDCPU; | |
| 235 | |
| 236 struct _PRCPUQueue { | |
| 237 _MDLock runQLock; /* lock for the run + wait queues */ | |
| 238 _MDLock sleepQLock; /* lock for the run + wait queues */ | |
| 239 _MDLock miscQLock; /* lock for the run + wait queues */ | |
| 240 | |
| 241 PRCList runQ[PR_PRIORITY_LAST + 1]; /* run queue for this CPU */ | |
| 242 PRUint32 runQReadyMask; | |
| 243 PRCList sleepQ; | |
| 244 PRIntervalTime sleepQmax; | |
| 245 PRCList pauseQ; | |
| 246 PRCList suspendQ; | |
| 247 PRCList waitingToJoinQ; | |
| 248 | |
| 249 PRUintn numCPUs; /* number of CPUs using this Q */ | |
| 250 }; | |
| 251 | |
| 252 struct _PRCPU { | |
| 253 PRCList links; /* link list of CPUs */ | |
| 254 PRUint32 id; /* id for this CPU */ | |
| 255 | |
| 256 union { | |
| 257 PRInt32 bits; | |
| 258 PRUint8 missed[4]; | |
| 259 } u; | |
| 260 PRIntn where; /* index into u.missed */ | |
| 261 PRPackedBool paused; /* cpu is paused */ | |
| 262 PRPackedBool exit; /* cpu should exit */ | |
| 263 | |
| 264 PRThread *thread; /* native thread for this CPUThread */ | |
| 265 PRThread *idle_thread; /* user-level idle thread for this CPUThread */ | |
| 266 | |
| 267 PRIntervalTime last_clock; /* the last time we went into | |
| 268 * _PR_ClockInterrupt() on this CPU | |
| 269 */ | |
| 270 | |
| 271 _PRCPUQueue *queue; | |
| 272 | |
| 273 _MDCPU md; | |
| 274 }; | |
| 275 | |
| 276 typedef struct _PRInterruptTable { | |
| 277 const char *name; | |
| 278 PRUintn missed_bit; | |
| 279 void (*handler)(void); | |
| 280 } _PRInterruptTable; | |
| 281 | |
| 282 #define _PR_CPU_PTR(_qp) \ | |
| 283 ((_PRCPU*) ((char*) (_qp) - offsetof(_PRCPU,links))) | |
| 284 | |
| 285 #if !defined(IRIX) && !defined(WIN32) && !defined(XP_OS2) \ | |
| 286 && !(defined(SOLARIS) && defined(_PR_GLOBAL_THREADS_ONLY)) | |
| 287 #define _MD_GET_ATTACHED_THREAD() (_PR_MD_CURRENT_THREAD()) | |
| 288 #endif | |
| 289 | |
| 290 #ifdef _PR_LOCAL_THREADS_ONLY | |
| 291 | |
| 292 NSPR_API(struct _PRCPU *) _pr_currentCPU; | |
| 293 NSPR_API(PRThread *) _pr_currentThread; | |
| 294 NSPR_API(PRThread *) _pr_lastThread; | |
| 295 NSPR_API(PRInt32) _pr_intsOff; | |
| 296 | |
| 297 #define _MD_CURRENT_CPU() (_pr_currentCPU) | |
| 298 #define _MD_SET_CURRENT_CPU(_cpu) (_pr_currentCPU = (_cpu)) | |
| 299 #define _MD_CURRENT_THREAD() (_pr_currentThread) | |
| 300 #define _MD_SET_CURRENT_THREAD(_thread) (_pr_currentThread = (_thread)) | |
| 301 #define _MD_LAST_THREAD() (_pr_lastThread) | |
| 302 #define _MD_SET_LAST_THREAD(t) (_pr_lastThread = t) | |
| 303 | |
| 304 #define _MD_GET_INTSOFF() (_pr_intsOff) | |
| 305 #define _MD_SET_INTSOFF(_val) (_pr_intsOff = _val) | |
| 306 | |
| 307 | |
| 308 /* The unbalanced curly braces in these two macros are intentional */ | |
| 309 #define _PR_LOCK_HEAP() { PRIntn _is; if (_pr_currentCPU) _PR_INTSOFF(_is); | |
| 310 #define _PR_UNLOCK_HEAP() if (_pr_currentCPU) _PR_INTSON(_is); } | |
| 311 | |
| 312 #endif /* _PR_LOCAL_THREADS_ONLY */ | |
| 313 | |
| 314 extern PRInt32 _native_threads_only; | |
| 315 | |
| 316 #if defined(_PR_GLOBAL_THREADS_ONLY) | |
| 317 | |
| 318 #define _MD_GET_INTSOFF() 0 | |
| 319 #define _MD_SET_INTSOFF(_val) | |
| 320 #define _PR_INTSOFF(_is) | |
| 321 #define _PR_FAST_INTSON(_is) | |
| 322 #define _PR_INTSON(_is) | |
| 323 #define _PR_THREAD_LOCK(_thread) | |
| 324 #define _PR_THREAD_UNLOCK(_thread) | |
| 325 #define _PR_RUNQ_LOCK(cpu) | |
| 326 #define _PR_RUNQ_UNLOCK(cpu) | |
| 327 #define _PR_SLEEPQ_LOCK(thread) | |
| 328 #define _PR_SLEEPQ_UNLOCK(thread) | |
| 329 #define _PR_MISCQ_LOCK(thread) | |
| 330 #define _PR_MISCQ_UNLOCK(thread) | |
| 331 #define _PR_CPU_LIST_LOCK() | |
| 332 #define _PR_CPU_LIST_UNLOCK() | |
| 333 | |
| 334 #define _PR_ADD_RUNQ(_thread, _cpu, _pri) | |
| 335 #define _PR_DEL_RUNQ(_thread) | |
| 336 #define _PR_ADD_SLEEPQ(_thread, _timeout) | |
| 337 #define _PR_DEL_SLEEPQ(_thread, _propogate) | |
| 338 #define _PR_ADD_JOINQ(_thread, _cpu) | |
| 339 #define _PR_DEL_JOINQ(_thread) | |
| 340 #define _PR_ADD_SUSPENDQ(_thread, _cpu) | |
| 341 #define _PR_DEL_SUSPENDQ(_thread) | |
| 342 | |
| 343 #define _PR_THREAD_SWITCH_CPU(_thread, _newCPU) | |
| 344 | |
| 345 #define _PR_IS_NATIVE_THREAD(thread) 1 | |
| 346 #define _PR_IS_NATIVE_THREAD_SUPPORTED() 1 | |
| 347 | |
| 348 #else | |
| 349 | |
| 350 #define _PR_INTSOFF(_is) \ | |
| 351 PR_BEGIN_MACRO \ | |
| 352 (_is) = _PR_MD_GET_INTSOFF(); \ | |
| 353 _PR_MD_SET_INTSOFF(1); \ | |
| 354 PR_END_MACRO | |
| 355 | |
| 356 #define _PR_FAST_INTSON(_is) \ | |
| 357 PR_BEGIN_MACRO \ | |
| 358 _PR_MD_SET_INTSOFF(_is); \ | |
| 359 PR_END_MACRO | |
| 360 | |
| 361 #define _PR_INTSON(_is) \ | |
| 362 PR_BEGIN_MACRO \ | |
| 363 if ((_is == 0) && (_PR_MD_CURRENT_CPU())->u.bits) \ | |
| 364 _PR_IntsOn((_PR_MD_CURRENT_CPU())); \ | |
| 365 _PR_MD_SET_INTSOFF(_is); \ | |
| 366 PR_END_MACRO | |
| 367 | |
| 368 #ifdef _PR_LOCAL_THREADS_ONLY | |
| 369 | |
| 370 #define _PR_IS_NATIVE_THREAD(thread) 0 | |
| 371 #define _PR_THREAD_LOCK(_thread) | |
| 372 #define _PR_THREAD_UNLOCK(_thread) | |
| 373 #define _PR_RUNQ_LOCK(cpu) | |
| 374 #define _PR_RUNQ_UNLOCK(cpu) | |
| 375 #define _PR_SLEEPQ_LOCK(thread) | |
| 376 #define _PR_SLEEPQ_UNLOCK(thread) | |
| 377 #define _PR_MISCQ_LOCK(thread) | |
| 378 #define _PR_MISCQ_UNLOCK(thread) | |
| 379 #define _PR_CPU_LIST_LOCK() | |
| 380 #define _PR_CPU_LIST_UNLOCK() | |
| 381 | |
| 382 #define _PR_ADD_RUNQ(_thread, _cpu, _pri) \ | |
| 383 PR_BEGIN_MACRO \ | |
| 384 PR_APPEND_LINK(&(_thread)->links, &_PR_RUNQ(_cpu)[_pri]); \ | |
| 385 _PR_RUNQREADYMASK(_cpu) |= (1L << _pri); \ | |
| 386 PR_END_MACRO | |
| 387 | |
| 388 #define _PR_DEL_RUNQ(_thread) \ | |
| 389 PR_BEGIN_MACRO \ | |
| 390 _PRCPU *_cpu = _thread->cpu; \ | |
| 391 PRInt32 _pri = _thread->priority; \ | |
| 392 PR_REMOVE_LINK(&(_thread)->links); \ | |
| 393 if (PR_CLIST_IS_EMPTY(&_PR_RUNQ(_cpu)[_pri])) \ | |
| 394 _PR_RUNQREADYMASK(_cpu) &= ~(1L << _pri); \ | |
| 395 PR_END_MACRO | |
| 396 | |
| 397 #define _PR_ADD_SLEEPQ(_thread, _timeout) \ | |
| 398 _PR_AddSleepQ(_thread, _timeout); | |
| 399 | |
| 400 #define _PR_DEL_SLEEPQ(_thread, _propogate) \ | |
| 401 _PR_DelSleepQ(_thread, _propogate); | |
| 402 | |
| 403 #define _PR_ADD_JOINQ(_thread, _cpu) \ | |
| 404 PR_APPEND_LINK(&(_thread)->links, &_PR_WAITINGTOJOINQ(_cpu)); | |
| 405 | |
| 406 #define _PR_DEL_JOINQ(_thread) \ | |
| 407 PR_REMOVE_LINK(&(_thread)->links); | |
| 408 | |
| 409 #define _PR_ADD_SUSPENDQ(_thread, _cpu) \ | |
| 410 PR_APPEND_LINK(&(_thread)->links, &_PR_SUSPENDQ(_cpu)); | |
| 411 | |
| 412 #define _PR_DEL_SUSPENDQ(_thread) \ | |
| 413 PR_REMOVE_LINK(&(_thread)->links); | |
| 414 | |
| 415 #define _PR_THREAD_SWITCH_CPU(_thread, _newCPU) | |
| 416 | |
| 417 #define _PR_IS_NATIVE_THREAD_SUPPORTED() 0 | |
| 418 | |
| 419 #else /* _PR_LOCAL_THREADS_ONLY */ | |
| 420 | |
| 421 /* These are for the "combined" thread model */ | |
| 422 | |
| 423 #define _PR_THREAD_LOCK(_thread) \ | |
| 424 _PR_MD_LOCK(&(_thread)->threadLock); | |
| 425 | |
| 426 #define _PR_THREAD_UNLOCK(_thread) \ | |
| 427 _PR_MD_UNLOCK(&(_thread)->threadLock); | |
| 428 | |
| 429 #define _PR_RUNQ_LOCK(_cpu) \ | |
| 430 PR_BEGIN_MACRO \ | |
| 431 _PR_MD_LOCK(&(_cpu)->queue->runQLock );\ | |
| 432 PR_END_MACRO | |
| 433 | |
| 434 #define _PR_RUNQ_UNLOCK(_cpu) \ | |
| 435 PR_BEGIN_MACRO \ | |
| 436 _PR_MD_UNLOCK(&(_cpu)->queue->runQLock );\ | |
| 437 PR_END_MACRO | |
| 438 | |
| 439 #define _PR_SLEEPQ_LOCK(_cpu) \ | |
| 440 _PR_MD_LOCK(&(_cpu)->queue->sleepQLock ); | |
| 441 | |
| 442 #define _PR_SLEEPQ_UNLOCK(_cpu) \ | |
| 443 _PR_MD_UNLOCK(&(_cpu)->queue->sleepQLock ); | |
| 444 | |
| 445 #define _PR_MISCQ_LOCK(_cpu) \ | |
| 446 _PR_MD_LOCK(&(_cpu)->queue->miscQLock ); | |
| 447 | |
| 448 #define _PR_MISCQ_UNLOCK(_cpu) \ | |
| 449 _PR_MD_UNLOCK(&(_cpu)->queue->miscQLock ); | |
| 450 | |
| 451 #define _PR_CPU_LIST_LOCK() _PR_MD_LOCK(&_pr_cpuLock) | |
| 452 #define _PR_CPU_LIST_UNLOCK() _PR_MD_UNLOCK(&_pr_cpuLock) | |
| 453 | |
| 454 #define QUEUE_RUN 0x1 | |
| 455 #define QUEUE_SLEEP 0x2 | |
| 456 #define QUEUE_JOIN 0x4 | |
| 457 #define QUEUE_SUSPEND 0x8 | |
| 458 #define QUEUE_LOCK 0x10 | |
| 459 | |
| 460 #define _PR_ADD_RUNQ(_thread, _cpu, _pri) \ | |
| 461 PR_BEGIN_MACRO \ | |
| 462 PR_APPEND_LINK(&(_thread)->links, &_PR_RUNQ(_cpu)[_pri]); \ | |
| 463 _PR_RUNQREADYMASK(_cpu) |= (1L << _pri); \ | |
| 464 PR_ASSERT((_thread)->queueCount == 0); \ | |
| 465 (_thread)->queueCount = QUEUE_RUN; \ | |
| 466 PR_END_MACRO | |
| 467 | |
| 468 #define _PR_DEL_RUNQ(_thread) \ | |
| 469 PR_BEGIN_MACRO \ | |
| 470 _PRCPU *_cpu = _thread->cpu; \ | |
| 471 PRInt32 _pri = _thread->priority; \ | |
| 472 PR_REMOVE_LINK(&(_thread)->links); \ | |
| 473 if (PR_CLIST_IS_EMPTY(&_PR_RUNQ(_cpu)[_pri])) \ | |
| 474 _PR_RUNQREADYMASK(_cpu) &= ~(1L << _pri); \ | |
| 475 PR_ASSERT((_thread)->queueCount == QUEUE_RUN);\ | |
| 476 (_thread)->queueCount = 0; \ | |
| 477 PR_END_MACRO | |
| 478 | |
| 479 #define _PR_ADD_SLEEPQ(_thread, _timeout) \ | |
| 480 PR_ASSERT((_thread)->queueCount == 0); \ | |
| 481 (_thread)->queueCount = QUEUE_SLEEP; \ | |
| 482 _PR_AddSleepQ(_thread, _timeout); | |
| 483 | |
| 484 #define _PR_DEL_SLEEPQ(_thread, _propogate) \ | |
| 485 PR_ASSERT((_thread)->queueCount == QUEUE_SLEEP);\ | |
| 486 (_thread)->queueCount = 0; \ | |
| 487 _PR_DelSleepQ(_thread, _propogate); | |
| 488 | |
| 489 #define _PR_ADD_JOINQ(_thread, _cpu) \ | |
| 490 PR_ASSERT((_thread)->queueCount == 0); \ | |
| 491 (_thread)->queueCount = QUEUE_JOIN; \ | |
| 492 PR_APPEND_LINK(&(_thread)->links, &_PR_WAITINGTOJOINQ(_cpu)); | |
| 493 | |
| 494 #define _PR_DEL_JOINQ(_thread) \ | |
| 495 PR_ASSERT((_thread)->queueCount == QUEUE_JOIN);\ | |
| 496 (_thread)->queueCount = 0; \ | |
| 497 PR_REMOVE_LINK(&(_thread)->links); | |
| 498 | |
| 499 #define _PR_ADD_SUSPENDQ(_thread, _cpu) \ | |
| 500 PR_ASSERT((_thread)->queueCount == 0); \ | |
| 501 (_thread)->queueCount = QUEUE_SUSPEND; \ | |
| 502 PR_APPEND_LINK(&(_thread)->links, &_PR_SUSPENDQ(_cpu)); | |
| 503 | |
| 504 #define _PR_DEL_SUSPENDQ(_thread) \ | |
| 505 PR_ASSERT((_thread)->queueCount == QUEUE_SUSPEND);\ | |
| 506 (_thread)->queueCount = 0; \ | |
| 507 PR_REMOVE_LINK(&(_thread)->links); | |
| 508 | |
| 509 #define _PR_THREAD_SWITCH_CPU(_thread, _newCPU) \ | |
| 510 (_thread)->cpu = (_newCPU); | |
| 511 | |
| 512 #define _PR_IS_NATIVE_THREAD(thread) (thread->flags & _PR_GLOBAL_SCOPE) | |
| 513 #define _PR_IS_NATIVE_THREAD_SUPPORTED() 1 | |
| 514 | |
| 515 #endif /* _PR_LOCAL_THREADS_ONLY */ | |
| 516 | |
| 517 #endif /* _PR_GLOBAL_THREADS_ONLY */ | |
| 518 | |
| 519 #define _PR_SET_RESCHED_FLAG() _PR_MD_CURRENT_CPU()->u.missed[3] = 1 | |
| 520 #define _PR_CLEAR_RESCHED_FLAG() _PR_MD_CURRENT_CPU()->u.missed[3] = 0 | |
| 521 | |
| 522 extern _PRInterruptTable _pr_interruptTable[]; | |
| 523 | |
| 524 /* Bits for _pr_interruptState.u.missed[0,1] */ | |
| 525 #define _PR_MISSED_CLOCK 0x1 | |
| 526 #define _PR_MISSED_IO 0x2 | |
| 527 #define _PR_MISSED_CHILD 0x4 | |
| 528 | |
| 529 extern void _PR_IntsOn(_PRCPU *cpu); | |
| 530 | |
| 531 NSPR_API(void) _PR_WakeupCPU(void); | |
| 532 NSPR_API(void) _PR_PauseCPU(void); | |
| 533 | |
| 534 /************************************************************************/ | |
| 535 | |
| 536 #define _PR_LOCK_LOCK(_lock) \ | |
| 537 _PR_MD_LOCK(&(_lock)->ilock); | |
| 538 #define _PR_LOCK_UNLOCK(_lock) \ | |
| 539 _PR_MD_UNLOCK(&(_lock)->ilock); | |
| 540 | |
| 541 extern void _PR_UnblockLockWaiter(PRLock *lock); | |
| 542 extern PRStatus _PR_InitLock(PRLock *lock); | |
| 543 extern void _PR_FreeLock(PRLock *lock); | |
| 544 | |
| 545 #define _PR_LOCK_PTR(_qp) \ | |
| 546 ((PRLock*) ((char*) (_qp) - offsetof(PRLock,links))) | |
| 547 | |
| 548 /************************************************************************/ | |
| 549 | |
| 550 #define _PR_CVAR_LOCK(_cvar) \ | |
| 551 _PR_MD_LOCK(&(_cvar)->ilock); | |
| 552 #define _PR_CVAR_UNLOCK(_cvar) \ | |
| 553 _PR_MD_UNLOCK(&(_cvar)->ilock); | |
| 554 | |
| 555 extern PRStatus _PR_InitCondVar(PRCondVar *cvar, PRLock *lock); | |
| 556 extern void _PR_FreeCondVar(PRCondVar *cvar); | |
| 557 extern PRStatus _PR_WaitCondVar( | |
| 558 PRThread *thread, PRCondVar *cvar, PRLock *lock, PRIntervalTime timeout); | |
| 559 extern void _PR_NotifyCondVar(PRCondVar *cvar, PRThread *me); | |
| 560 extern PRUint32 _PR_CondVarToString(PRCondVar *cvar, char *buf, PRUint32 buflen)
; | |
| 561 | |
| 562 NSPR_API(void) _PR_Notify(PRMonitor *mon, PRBool all, PRBool sticky); | |
| 563 | |
| 564 /* PRThread.flags */ | |
| 565 #define _PR_SYSTEM 0x01 | |
| 566 #define _PR_INTERRUPT 0x02 | |
| 567 #define _PR_ATTACHED 0x04 /* created via PR_AttachThread */ | |
| 568 #define _PR_PRIMORDIAL 0x08 /* the thread that called PR_Init */ | |
| 569 #define _PR_ON_SLEEPQ 0x10 /* thread is on the sleepQ */ | |
| 570 #define _PR_ON_PAUSEQ 0x20 /* thread is on the pauseQ */ | |
| 571 #define _PR_SUSPENDING 0x40 /* thread wants to suspend */ | |
| 572 #define _PR_GLOBAL_SCOPE 0x80 /* thread is global scope */ | |
| 573 #define _PR_IDLE_THREAD 0x200 /* this is an idle thread */ | |
| 574 #define _PR_GCABLE_THREAD 0x400 /* this is a collectable thread */ | |
| 575 #define _PR_BOUND_THREAD 0x800 /* a bound thread */ | |
| 576 #define _PR_INTERRUPT_BLOCKED 0x1000 /* interrupts blocked */ | |
| 577 | |
| 578 /* PRThread.state */ | |
| 579 #define _PR_UNBORN 0 | |
| 580 #define _PR_RUNNABLE 1 | |
| 581 #define _PR_RUNNING 2 | |
| 582 #define _PR_LOCK_WAIT 3 | |
| 583 #define _PR_COND_WAIT 4 | |
| 584 #define _PR_JOIN_WAIT 5 | |
| 585 #define _PR_IO_WAIT 6 | |
| 586 #define _PR_SUSPENDED 7 | |
| 587 #define _PR_DEAD_STATE 8 /* for debugging */ | |
| 588 | |
| 589 /* PRThreadStack.flags */ | |
| 590 #define _PR_STACK_VM 0x1 /* using vm instead of malloc */ | |
| 591 #define _PR_STACK_MAPPED 0x2 /* vm is mapped */ | |
| 592 #define _PR_STACK_PRIMORDIAL 0x4 /* stack for primordial thread */ | |
| 593 | |
| 594 /* | |
| 595 ** If the default stcksize from the client is zero, we need to pick a machine | |
| 596 ** dependent value. This is only for standard user threads. For custom threads
, | |
| 597 ** 0 has a special meaning. | |
| 598 ** Adjust stackSize. Round up to a page boundary. | |
| 599 */ | |
| 600 | |
| 601 #ifndef _MD_MINIMUM_STACK_SIZE | |
| 602 #define _MD_MINIMUM_STACK_SIZE 0 | |
| 603 #endif | |
| 604 | |
| 605 #if (!defined(HAVE_CUSTOM_USER_THREADS)) | |
| 606 #define _PR_ADJUST_STACKSIZE(stackSize) \ | |
| 607 PR_BEGIN_MACRO \ | |
| 608 if (stackSize == 0) \ | |
| 609 stackSize = _MD_DEFAULT_STACK_SIZE; \ | |
| 610 if (stackSize < _MD_MINIMUM_STACK_SIZE) \ | |
| 611 stackSize = _MD_MINIMUM_STACK_SIZE; \ | |
| 612 stackSize = (stackSize + (1 << _pr_pageShift) - 1) >> _pr_pageShift; \ | |
| 613 stackSize <<= _pr_pageShift; \ | |
| 614 PR_END_MACRO | |
| 615 #else | |
| 616 #define _PR_ADJUST_STACKSIZE(stackSize) | |
| 617 #endif | |
| 618 | |
| 619 #define _PR_IS_GCABLE_THREAD(thr) ((thr)->flags & _PR_GCABLE_THREAD) | |
| 620 | |
| 621 #define _PR_PENDING_INTERRUPT(thr) \ | |
| 622 (!((thr)->flags & _PR_INTERRUPT_BLOCKED) && ((thr)->flags & _PR_
INTERRUPT)) | |
| 623 #define _PR_THREAD_BLOCK_INTERRUPT(thr) \ | |
| 624 (thr->flags |= _PR_INTERRUPT_BLOCKED) | |
| 625 #define _PR_THREAD_UNBLOCK_INTERRUPT(thr) \ | |
| 626 (thr->flags &= ~_PR_INTERRUPT_BLOCKED) | |
| 627 | |
| 628 #define _PR_THREAD_PTR(_qp) \ | |
| 629 ((PRThread*) ((char*) (_qp) - offsetof(PRThread,links))) | |
| 630 | |
| 631 #define _PR_ACTIVE_THREAD_PTR(_qp) \ | |
| 632 ((PRThread*) ((char*) (_qp) - offsetof(PRThread,active))) | |
| 633 | |
| 634 #define _PR_THREAD_CONDQ_PTR(_qp) \ | |
| 635 ((PRThread*) ((char*) (_qp) - offsetof(PRThread,waitQLinks))) | |
| 636 | |
| 637 #define _PR_THREAD_MD_TO_PTR(_md) \ | |
| 638 ((PRThread*) ((char*) (_md) - offsetof(PRThread,md))) | |
| 639 | |
| 640 #define _PR_THREAD_STACK_TO_PTR(_stack) \ | |
| 641 ((PRThread*) (_stack->thr)) | |
| 642 | |
| 643 extern PRCList _pr_active_local_threadQ; | |
| 644 extern PRCList _pr_active_global_threadQ; | |
| 645 extern PRCList _pr_cpuQ; | |
| 646 extern _MDLock _pr_cpuLock; | |
| 647 extern PRInt32 _pr_md_idle_cpus; | |
| 648 | |
| 649 #define _PR_ACTIVE_LOCAL_THREADQ() _pr_active_local_threadQ | |
| 650 #define _PR_ACTIVE_GLOBAL_THREADQ() _pr_active_global_threadQ | |
| 651 #define _PR_CPUQ() _pr_cpuQ | |
| 652 #define _PR_RUNQ(_cpu) ((_cpu)->queue->runQ) | |
| 653 #define _PR_RUNQREADYMASK(_cpu) ((_cpu)->queue->runQReadyMask) | |
| 654 #define _PR_SLEEPQ(_cpu) ((_cpu)->queue->sleepQ) | |
| 655 #define _PR_SLEEPQMAX(_cpu) ((_cpu)->queue->sleepQmax) | |
| 656 #define _PR_PAUSEQ(_cpu) ((_cpu)->queue->pauseQ) | |
| 657 #define _PR_SUSPENDQ(_cpu) ((_cpu)->queue->suspendQ) | |
| 658 #define _PR_WAITINGTOJOINQ(_cpu) ((_cpu)->queue->waitingToJoinQ) | |
| 659 | |
| 660 extern PRUint32 _pr_recycleThreads; /* Flag for behavior on thread cleanup */ | |
| 661 extern PRLock *_pr_deadQLock; | |
| 662 extern PRUint32 _pr_numNativeDead; | |
| 663 extern PRUint32 _pr_numUserDead; | |
| 664 extern PRCList _pr_deadNativeQ; | |
| 665 extern PRCList _pr_deadUserQ; | |
| 666 #define _PR_DEADNATIVEQ _pr_deadNativeQ | |
| 667 #define _PR_DEADUSERQ _pr_deadUserQ | |
| 668 #define _PR_DEADQ_LOCK PR_Lock(_pr_deadQLock); | |
| 669 #define _PR_DEADQ_UNLOCK PR_Unlock(_pr_deadQLock); | |
| 670 #define _PR_INC_DEADNATIVE (_pr_numNativeDead++) | |
| 671 #define _PR_DEC_DEADNATIVE (_pr_numNativeDead--) | |
| 672 #define _PR_NUM_DEADNATIVE (_pr_numNativeDead) | |
| 673 #define _PR_INC_DEADUSER (_pr_numUserDead++) | |
| 674 #define _PR_DEC_DEADUSER (_pr_numUserDead--) | |
| 675 #define _PR_NUM_DEADUSER (_pr_numUserDead) | |
| 676 | |
| 677 extern PRUint32 _pr_utid; | |
| 678 | |
| 679 extern struct _PRCPU *_pr_primordialCPU; | |
| 680 | |
| 681 extern PRLock *_pr_activeLock; /* lock for userActive and systemActive
*/ | |
| 682 extern PRInt32 _pr_userActive; /* number of active user threads */ | |
| 683 extern PRInt32 _pr_systemActive; /* number of active system threads */ | |
| 684 extern PRInt32 _pr_primordialExitCount; /* number of user threads left | |
| 685 * before the primordial thread | |
| 686 * can exit. */ | |
| 687 extern PRCondVar *_pr_primordialExitCVar; /* the condition variable for | |
| 688 * notifying the primordial thread | |
| 689 * when all other user threads | |
| 690 * have terminated. */ | |
| 691 | |
| 692 extern PRUintn _pr_maxPTDs; | |
| 693 | |
| 694 extern PRLock *_pr_terminationCVLock; | |
| 695 | |
| 696 /************************************************************************* | |
| 697 * Internal routines either called by PR itself or from machine-dependent * | |
| 698 * code. * | |
| 699 *************************************************************************/ | |
| 700 | |
| 701 extern void _PR_ClockInterrupt(void); | |
| 702 | |
| 703 extern void _PR_Schedule(void); | |
| 704 extern void _PR_SetThreadPriority( | |
| 705 PRThread* thread, PRThreadPriority priority); | |
| 706 | |
| 707 /*********************************************************************** | |
| 708 ** FUNCTION: _PR_NewSegment() | |
| 709 ** DESCRIPTION: | |
| 710 ** Allocate a memory segment. The "size" value is rounded up to the | |
| 711 ** native system page size and a page aligned portion of memory is | |
| 712 ** returned. This memory is not part of the malloc heap. If "vaddr" is | |
| 713 ** not NULL then PR tries to allocate the segment at the desired virtual | |
| 714 ** address. | |
| 715 ** INPUTS: size: size of the desired memory segment | |
| 716 ** vaddr: address at which the newly aquired segment is to be | |
| 717 ** mapped into memory. | |
| 718 ** OUTPUTS: a memory segment is allocated, a PRSegment is allocated | |
| 719 ** RETURN: pointer to PRSegment | |
| 720 ***********************************************************************/ | |
| 721 extern PRSegment* _PR_NewSegment(PRUint32 size, void *vaddr); | |
| 722 | |
| 723 /*********************************************************************** | |
| 724 ** FUNCTION: _PR_DestroySegment() | |
| 725 ** DESCRIPTION: | |
| 726 ** The memory segment and the PRSegment are freed | |
| 727 ** INPUTS: seg: pointer to PRSegment to be freed | |
| 728 ** OUTPUTS: the the PRSegment and its associated memory segment are freed | |
| 729 ** RETURN: void | |
| 730 ***********************************************************************/ | |
| 731 extern void _PR_DestroySegment(PRSegment *seg); | |
| 732 | |
| 733 extern PRThreadStack * _PR_NewStack(PRUint32 stackSize); | |
| 734 extern void _PR_FreeStack(PRThreadStack *stack); | |
| 735 extern PRBool _PR_NotifyThread (PRThread *thread, PRThread *me); | |
| 736 extern void _PR_NotifyLockedThread (PRThread *thread); | |
| 737 | |
| 738 NSPR_API(void) _PR_AddSleepQ(PRThread *thread, PRIntervalTime timeout); | |
| 739 NSPR_API(void) _PR_DelSleepQ(PRThread *thread, PRBool propogate_time); | |
| 740 | |
| 741 extern void _PR_AddThreadToRunQ(PRThread *me, PRThread *thread); | |
| 742 | |
| 743 NSPR_API(PRThread*) _PR_CreateThread(PRThreadType type, | |
| 744 void (*start)(void *arg), | |
| 745 void *arg, | |
| 746 PRThreadPriority priority, | |
| 747 PRThreadScope scope, | |
| 748 PRThreadState state, | |
| 749 PRUint32 stackSize, | |
| 750 PRUint32 flags); | |
| 751 | |
| 752 extern void _PR_NativeDestroyThread(PRThread *thread); | |
| 753 extern void _PR_UserDestroyThread(PRThread *thread); | |
| 754 | |
| 755 extern PRThread* _PRI_AttachThread( | |
| 756 PRThreadType type, PRThreadPriority priority, | |
| 757 PRThreadStack *stack, PRUint32 flags); | |
| 758 | |
| 759 extern void _PRI_DetachThread(void); | |
| 760 | |
| 761 | |
| 762 #define _PR_IO_PENDING(_thread) ((_thread)->io_pending) | |
| 763 | |
| 764 NSPR_API(void) _PR_MD_INIT_CPUS(); | |
| 765 #define _PR_MD_INIT_CPUS _MD_INIT_CPUS | |
| 766 | |
| 767 NSPR_API(void) _PR_MD_WAKEUP_CPUS(); | |
| 768 #define _PR_MD_WAKEUP_CPUS _MD_WAKEUP_CPUS | |
| 769 | |
| 770 /* Interrupts related */ | |
| 771 | |
| 772 NSPR_API(void) _PR_MD_START_INTERRUPTS(void); | |
| 773 #define _PR_MD_START_INTERRUPTS _MD_START_INTERRUPTS | |
| 774 | |
| 775 NSPR_API(void) _PR_MD_STOP_INTERRUPTS(void); | |
| 776 #define _PR_MD_STOP_INTERRUPTS _MD_STOP_INTERRUPTS | |
| 777 | |
| 778 NSPR_API(void) _PR_MD_ENABLE_CLOCK_INTERRUPTS(void); | |
| 779 #define _PR_MD_ENABLE_CLOCK_INTERRUPTS _MD_ENABLE_CLOCK_INTERRUPTS | |
| 780 | |
| 781 NSPR_API(void) _PR_MD_DISABLE_CLOCK_INTERRUPTS(void); | |
| 782 #define _PR_MD_DISABLE_CLOCK_INTERRUPTS _MD_DISABLE_CLOCK_INTERRUPTS | |
| 783 | |
| 784 NSPR_API(void) _PR_MD_BLOCK_CLOCK_INTERRUPTS(void); | |
| 785 #define _PR_MD_BLOCK_CLOCK_INTERRUPTS _MD_BLOCK_CLOCK_INTERRUPTS | |
| 786 | |
| 787 NSPR_API(void) _PR_MD_UNBLOCK_CLOCK_INTERRUPTS(void); | |
| 788 #define _PR_MD_UNBLOCK_CLOCK_INTERRUPTS _MD_UNBLOCK_CLOCK_INTERRUPTS | |
| 789 | |
| 790 /* The _PR_MD_WAIT_LOCK and _PR_MD_WAKEUP_WAITER functions put to sleep and | |
| 791 * awaken a thread which is waiting on a lock or cvar. | |
| 792 */ | |
| 793 extern PRStatus _PR_MD_WAIT(PRThread *, PRIntervalTime timeout); | |
| 794 #define _PR_MD_WAIT _MD_WAIT | |
| 795 | |
| 796 extern PRStatus _PR_MD_WAKEUP_WAITER(PRThread *); | |
| 797 #define _PR_MD_WAKEUP_WAITER _MD_WAKEUP_WAITER | |
| 798 | |
| 799 #ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ | |
| 800 NSPR_API(void) _PR_MD_CLOCK_INTERRUPT(void); | |
| 801 #define _PR_MD_CLOCK_INTERRUPT _MD_CLOCK_INTERRUPT | |
| 802 #endif | |
| 803 | |
| 804 /* Stack debugging */ | |
| 805 NSPR_API(void) _PR_MD_INIT_STACK(PRThreadStack *ts, PRIntn redzone); | |
| 806 #define _PR_MD_INIT_STACK _MD_INIT_STACK | |
| 807 | |
| 808 NSPR_API(void) _PR_MD_CLEAR_STACK(PRThreadStack* ts); | |
| 809 #define _PR_MD_CLEAR_STACK _MD_CLEAR_STACK | |
| 810 | |
| 811 /* CPU related */ | |
| 812 NSPR_API(PRInt32) _PR_MD_GET_INTSOFF(void); | |
| 813 #define _PR_MD_GET_INTSOFF _MD_GET_INTSOFF | |
| 814 | |
| 815 NSPR_API(void) _PR_MD_SET_INTSOFF(PRInt32 _val); | |
| 816 #define _PR_MD_SET_INTSOFF _MD_SET_INTSOFF | |
| 817 | |
| 818 NSPR_API(_PRCPU*) _PR_MD_CURRENT_CPU(void); | |
| 819 #define _PR_MD_CURRENT_CPU _MD_CURRENT_CPU | |
| 820 | |
| 821 NSPR_API(void) _PR_MD_SET_CURRENT_CPU(_PRCPU *cpu); | |
| 822 #define _PR_MD_SET_CURRENT_CPU _MD_SET_CURRENT_CPU | |
| 823 | |
| 824 NSPR_API(void) _PR_MD_INIT_RUNNING_CPU(_PRCPU *cpu); | |
| 825 #define _PR_MD_INIT_RUNNING_CPU _MD_INIT_RUNNING_CPU | |
| 826 | |
| 827 /* | |
| 828 * Returns the number of threads awoken or 0 if a timeout occurred; | |
| 829 */ | |
| 830 extern PRInt32 _PR_MD_PAUSE_CPU(PRIntervalTime timeout); | |
| 831 #define _PR_MD_PAUSE_CPU _MD_PAUSE_CPU | |
| 832 | |
| 833 extern void _PR_MD_CLEANUP_BEFORE_EXIT(void); | |
| 834 #define _PR_MD_CLEANUP_BEFORE_EXIT _MD_CLEANUP_BEFORE_EXIT | |
| 835 | |
| 836 extern void _PR_MD_EXIT(PRIntn status); | |
| 837 #define _PR_MD_EXIT _MD_EXIT | |
| 838 | |
| 839 /* Locks related */ | |
| 840 | |
| 841 NSPR_API(void) _PR_MD_INIT_LOCKS(void); | |
| 842 #define _PR_MD_INIT_LOCKS _MD_INIT_LOCKS | |
| 843 | |
| 844 NSPR_API(PRStatus) _PR_MD_NEW_LOCK(_MDLock *md); | |
| 845 #define _PR_MD_NEW_LOCK _MD_NEW_LOCK | |
| 846 | |
| 847 NSPR_API(void) _PR_MD_FREE_LOCK(_MDLock *md); | |
| 848 #define _PR_MD_FREE_LOCK _MD_FREE_LOCK | |
| 849 | |
| 850 NSPR_API(void) _PR_MD_LOCK(_MDLock *md); | |
| 851 #define _PR_MD_LOCK _MD_LOCK | |
| 852 | |
| 853 /* Return 0 on success, a nonzero value on failure. */ | |
| 854 NSPR_API(PRIntn) _PR_MD_TEST_AND_LOCK(_MDLock *md); | |
| 855 #define _PR_MD_TEST_AND_LOCK _MD_TEST_AND_LOCK | |
| 856 | |
| 857 NSPR_API(void) _PR_MD_UNLOCK(_MDLock *md); | |
| 858 #define _PR_MD_UNLOCK _MD_UNLOCK | |
| 859 | |
| 860 NSPR_API(void) _PR_MD_IOQ_LOCK(void); | |
| 861 #define _PR_MD_IOQ_LOCK _MD_IOQ_LOCK | |
| 862 | |
| 863 NSPR_API(void) _PR_MD_IOQ_UNLOCK(void); | |
| 864 #define _PR_MD_IOQ_UNLOCK _MD_IOQ_UNLOCK | |
| 865 | |
| 866 #ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ | |
| 867 /* Semaphore related -- only for native threads */ | |
| 868 #ifdef HAVE_CVAR_BUILT_ON_SEM | |
| 869 NSPR_API(void) _PR_MD_NEW_SEM(_MDSemaphore *md, PRUintn value); | |
| 870 #define _PR_MD_NEW_SEM _MD_NEW_SEM | |
| 871 | |
| 872 NSPR_API(void) _PR_MD_DESTROY_SEM(_MDSemaphore *md); | |
| 873 #define _PR_MD_DESTROY_SEM _MD_DESTROY_SEM | |
| 874 | |
| 875 NSPR_API(PRStatus) _PR_MD_TIMED_WAIT_SEM( | |
| 876 _MDSemaphore *md, PRIntervalTime timeout); | |
| 877 #define _PR_MD_TIMED_WAIT_SEM _MD_TIMED_WAIT_SEM | |
| 878 | |
| 879 NSPR_API(PRStatus) _PR_MD_WAIT_SEM(_MDSemaphore *md); | |
| 880 #define _PR_MD_WAIT_SEM _MD_WAIT_SEM | |
| 881 | |
| 882 NSPR_API(void) _PR_MD_POST_SEM(_MDSemaphore *md); | |
| 883 #define _PR_MD_POST_SEM _MD_POST_SEM | |
| 884 #endif /* HAVE_CVAR_BUILT_ON_SEM */ | |
| 885 | |
| 886 #endif | |
| 887 | |
| 888 /* Condition Variables related -- only for native threads */ | |
| 889 | |
| 890 #ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ | |
| 891 NSPR_API(PRInt32) _PR_MD_NEW_CV(_MDCVar *md); | |
| 892 #define _PR_MD_NEW_CV _MD_NEW_CV | |
| 893 | |
| 894 NSPR_API(void) _PR_MD_FREE_CV(_MDCVar *md); | |
| 895 #define _PR_MD_FREE_CV _MD_FREE_CV | |
| 896 | |
| 897 NSPR_API(void) _PR_MD_WAIT_CV( | |
| 898 _MDCVar *mdCVar,_MDLock *mdLock,PRIntervalTime timeout); | |
| 899 #define _PR_MD_WAIT_CV _MD_WAIT_CV | |
| 900 | |
| 901 NSPR_API(void) _PR_MD_NOTIFY_CV(_MDCVar *md, _MDLock *lock); | |
| 902 #define _PR_MD_NOTIFY_CV _MD_NOTIFY_CV | |
| 903 | |
| 904 NSPR_API(void) _PR_MD_NOTIFYALL_CV(_MDCVar *md, _MDLock *lock); | |
| 905 #define _PR_MD_NOTIFYALL_CV _MD_NOTIFYALL_CV | |
| 906 #endif /* _PR_LOCAL_THREADS_ONLY */ | |
| 907 | |
| 908 /* Threads related */ | |
| 909 NSPR_API(PRThread*) _PR_MD_CURRENT_THREAD(void); | |
| 910 #define _PR_MD_CURRENT_THREAD _MD_CURRENT_THREAD | |
| 911 | |
| 912 NSPR_API(PRThread*) _PR_MD_GET_ATTACHED_THREAD(void); | |
| 913 #define _PR_MD_GET_ATTACHED_THREAD _MD_GET_ATTACHED_THREAD | |
| 914 | |
| 915 NSPR_API(PRThread*) _PR_MD_LAST_THREAD(void); | |
| 916 #define _PR_MD_LAST_THREAD _MD_LAST_THREAD | |
| 917 | |
| 918 NSPR_API(void) _PR_MD_SET_CURRENT_THREAD(PRThread *thread); | |
| 919 #define _PR_MD_SET_CURRENT_THREAD _MD_SET_CURRENT_THREAD | |
| 920 | |
| 921 NSPR_API(void) _PR_MD_SET_LAST_THREAD(PRThread *thread); | |
| 922 #define _PR_MD_SET_LAST_THREAD _MD_SET_LAST_THREAD | |
| 923 | |
| 924 extern PRStatus _PR_MD_INIT_THREAD(PRThread *thread); | |
| 925 #define _PR_MD_INIT_THREAD _MD_INIT_THREAD | |
| 926 | |
| 927 extern void _PR_MD_EXIT_THREAD(PRThread *thread); | |
| 928 #define _PR_MD_EXIT_THREAD _MD_EXIT_THREAD | |
| 929 | |
| 930 #ifndef _PR_LOCAL_THREADS_ONLY /* not if only local threads supported */ | |
| 931 | |
| 932 NSPR_API(PRStatus) _PR_MD_INIT_ATTACHED_THREAD(PRThread *thread); | |
| 933 #define _PR_MD_INIT_ATTACHED_THREAD _MD_INIT_ATTACHED_THREAD | |
| 934 | |
| 935 extern void _PR_MD_SUSPEND_THREAD(PRThread *thread); | |
| 936 #define _PR_MD_SUSPEND_THREAD _MD_SUSPEND_THREAD | |
| 937 | |
| 938 extern void _PR_MD_RESUME_THREAD(PRThread *thread); | |
| 939 #define _PR_MD_RESUME_THREAD _MD_RESUME_THREAD | |
| 940 | |
| 941 extern void _PR_MD_SUSPEND_CPU(_PRCPU *cpu); | |
| 942 #define _PR_MD_SUSPEND_CPU _MD_SUSPEND_CPU | |
| 943 | |
| 944 extern void _PR_MD_RESUME_CPU(_PRCPU *cpu); | |
| 945 #define _PR_MD_RESUME_CPU _MD_RESUME_CPU | |
| 946 | |
| 947 extern void _PR_MD_BEGIN_SUSPEND_ALL(void); | |
| 948 #define _PR_MD_BEGIN_SUSPEND_ALL _MD_BEGIN_SUSPEND_ALL | |
| 949 | |
| 950 extern void _PR_MD_END_SUSPEND_ALL(void); | |
| 951 #define _PR_MD_END_SUSPEND_ALL _MD_END_SUSPEND_ALL | |
| 952 | |
| 953 extern void _PR_MD_BEGIN_RESUME_ALL(void); | |
| 954 #define _PR_MD_BEGIN_RESUME_ALL _MD_BEGIN_RESUME_ALL | |
| 955 | |
| 956 extern void _PR_MD_END_RESUME_ALL(void); | |
| 957 #define _PR_MD_END_RESUME_ALL _MD_END_RESUME_ALL | |
| 958 | |
| 959 #if defined(IRIX) | |
| 960 NSPR_API(void) _PR_IRIX_CHILD_PROCESS(void); | |
| 961 #endif /* IRIX */ | |
| 962 | |
| 963 #endif /* !_PR_LOCAL_THREADS_ONLY */ | |
| 964 | |
| 965 extern void _PR_MD_CLEAN_THREAD(PRThread *thread); | |
| 966 #define _PR_MD_CLEAN_THREAD _MD_CLEAN_THREAD | |
| 967 | |
| 968 #ifdef HAVE_CUSTOM_USER_THREADS | |
| 969 extern void _PR_MD_CREATE_PRIMORDIAL_USER_THREAD(PRThread *); | |
| 970 #define _PR_MD_CREATE_PRIMORDIAL_USER_THREAD _MD_CREATE_PRIMORDIAL_USER_THREA
D | |
| 971 | |
| 972 extern PRThread* _PR_MD_CREATE_USER_THREAD( | |
| 973 PRUint32 stacksize, | |
| 974 void (*start)(void *), | |
| 975 void *arg); | |
| 976 #define _PR_MD_CREATE_USER_THREAD _MD_CREATE_USER_THREAD | |
| 977 #endif | |
| 978 | |
| 979 extern PRStatus _PR_MD_CREATE_THREAD( | |
| 980 PRThread *thread, | |
| 981 void (*start) (void *), | |
| 982 PRThreadPriority priority, | |
| 983 PRThreadScope scope, | |
| 984 PRThreadState state, | |
| 985 PRUint32 stackSize); | |
| 986 #define _PR_MD_CREATE_THREAD _MD_CREATE_THREAD | |
| 987 | |
| 988 extern void _PR_MD_JOIN_THREAD(_MDThread *md); | |
| 989 #define _PR_MD_JOIN_THREAD _MD_JOIN_THREAD | |
| 990 | |
| 991 extern void _PR_MD_END_THREAD(void); | |
| 992 #define _PR_MD_END_THREAD _MD_END_THREAD | |
| 993 | |
| 994 extern void _PR_MD_YIELD(void); | |
| 995 #define _PR_MD_YIELD _MD_YIELD | |
| 996 | |
| 997 extern void _PR_MD_SET_PRIORITY(_MDThread *md, PRThreadPriority newPri); | |
| 998 #define _PR_MD_SET_PRIORITY _MD_SET_PRIORITY | |
| 999 | |
| 1000 extern void _PR_MD_SET_CURRENT_THREAD_NAME(const char *name); | |
| 1001 #define _PR_MD_SET_CURRENT_THREAD_NAME _MD_SET_CURRENT_THREAD_NAME | |
| 1002 | |
| 1003 NSPR_API(void) _PR_MD_SUSPENDALL(void); | |
| 1004 #define _PR_MD_SUSPENDALL _MD_SUSPENDALL | |
| 1005 | |
| 1006 NSPR_API(void) _PR_MD_RESUMEALL(void); | |
| 1007 #define _PR_MD_RESUMEALL _MD_RESUMEALL | |
| 1008 | |
| 1009 extern void _PR_MD_INIT_CONTEXT( | |
| 1010 PRThread *thread, char *top, void (*start) (void), PRBool *status); | |
| 1011 #define _PR_MD_INIT_CONTEXT _MD_INIT_CONTEXT | |
| 1012 | |
| 1013 extern void _PR_MD_SWITCH_CONTEXT(PRThread *thread); | |
| 1014 #define _PR_MD_SWITCH_CONTEXT _MD_SWITCH_CONTEXT | |
| 1015 | |
| 1016 extern void _PR_MD_RESTORE_CONTEXT(PRThread *thread); | |
| 1017 #define _PR_MD_RESTORE_CONTEXT _MD_RESTORE_CONTEXT | |
| 1018 | |
| 1019 /* Segment related */ | |
| 1020 extern void _PR_MD_INIT_SEGS(void); | |
| 1021 #define _PR_MD_INIT_SEGS _MD_INIT_SEGS | |
| 1022 | |
| 1023 extern PRStatus _PR_MD_ALLOC_SEGMENT(PRSegment *seg, PRUint32 size, void *vaddr)
; | |
| 1024 #define _PR_MD_ALLOC_SEGMENT _MD_ALLOC_SEGMENT | |
| 1025 | |
| 1026 extern void _PR_MD_FREE_SEGMENT(PRSegment *seg); | |
| 1027 #define _PR_MD_FREE_SEGMENT _MD_FREE_SEGMENT | |
| 1028 | |
| 1029 /* Directory enumeration related */ | |
| 1030 extern PRStatus _PR_MD_OPEN_DIR(_MDDir *md,const char *name); | |
| 1031 #define _PR_MD_OPEN_DIR _MD_OPEN_DIR | |
| 1032 | |
| 1033 extern char * _PR_MD_READ_DIR(_MDDir *md, PRIntn flags); | |
| 1034 #define _PR_MD_READ_DIR _MD_READ_DIR | |
| 1035 | |
| 1036 extern PRInt32 _PR_MD_CLOSE_DIR(_MDDir *md); | |
| 1037 #define _PR_MD_CLOSE_DIR _MD_CLOSE_DIR | |
| 1038 | |
| 1039 /* Named semaphores related */ | |
| 1040 extern PRSem * _PR_MD_OPEN_SEMAPHORE( | |
| 1041 const char *osname, PRIntn flags, PRIntn mode, PRUintn value); | |
| 1042 #define _PR_MD_OPEN_SEMAPHORE _MD_OPEN_SEMAPHORE | |
| 1043 | |
| 1044 extern PRStatus _PR_MD_WAIT_SEMAPHORE(PRSem *sem); | |
| 1045 #define _PR_MD_WAIT_SEMAPHORE _MD_WAIT_SEMAPHORE | |
| 1046 | |
| 1047 extern PRStatus _PR_MD_POST_SEMAPHORE(PRSem *sem); | |
| 1048 #define _PR_MD_POST_SEMAPHORE _MD_POST_SEMAPHORE | |
| 1049 | |
| 1050 extern PRStatus _PR_MD_CLOSE_SEMAPHORE(PRSem *sem); | |
| 1051 #define _PR_MD_CLOSE_SEMAPHORE _MD_CLOSE_SEMAPHORE | |
| 1052 | |
| 1053 extern PRStatus _PR_MD_DELETE_SEMAPHORE(const char *osname); | |
| 1054 #define _PR_MD_DELETE_SEMAPHORE _MD_DELETE_SEMAPHORE | |
| 1055 | |
| 1056 /* I/O related */ | |
| 1057 extern void _PR_MD_INIT_FILEDESC(PRFileDesc *fd); | |
| 1058 #define _PR_MD_INIT_FILEDESC _MD_INIT_FILEDESC | |
| 1059 | |
| 1060 extern void _PR_MD_MAKE_NONBLOCK(PRFileDesc *fd); | |
| 1061 #define _PR_MD_MAKE_NONBLOCK _MD_MAKE_NONBLOCK | |
| 1062 | |
| 1063 /* File I/O related */ | |
| 1064 extern PROsfd _PR_MD_OPEN(const char *name, PRIntn osflags, PRIntn mode); | |
| 1065 #define _PR_MD_OPEN _MD_OPEN | |
| 1066 | |
| 1067 extern PROsfd _PR_MD_OPEN_FILE(const char *name, PRIntn osflags, PRIntn mode); | |
| 1068 #define _PR_MD_OPEN_FILE _MD_OPEN_FILE | |
| 1069 | |
| 1070 extern PRInt32 _PR_MD_CLOSE_FILE(PROsfd osfd); | |
| 1071 #define _PR_MD_CLOSE_FILE _MD_CLOSE_FILE | |
| 1072 | |
| 1073 extern PRInt32 _PR_MD_READ(PRFileDesc *fd, void *buf, PRInt32 amount); | |
| 1074 #define _PR_MD_READ _MD_READ | |
| 1075 | |
| 1076 extern PRInt32 _PR_MD_WRITE(PRFileDesc *fd, const void *buf, PRInt32 amount); | |
| 1077 #define _PR_MD_WRITE _MD_WRITE | |
| 1078 | |
| 1079 extern PRInt32 _PR_MD_WRITEV( | |
| 1080 PRFileDesc *fd, const struct PRIOVec *iov, | |
| 1081 PRInt32 iov_size, PRIntervalTime timeout); | |
| 1082 #define _PR_MD_WRITEV _MD_WRITEV | |
| 1083 | |
| 1084 extern PRInt32 _PR_MD_FSYNC(PRFileDesc *fd); | |
| 1085 #define _PR_MD_FSYNC _MD_FSYNC | |
| 1086 | |
| 1087 extern PRInt32 _PR_MD_DELETE(const char *name); | |
| 1088 #define _PR_MD_DELETE _MD_DELETE | |
| 1089 | |
| 1090 extern PRInt32 _PR_MD_RENAME(const char *from, const char *to); | |
| 1091 #define _PR_MD_RENAME _MD_RENAME | |
| 1092 | |
| 1093 extern PRInt32 _PR_MD_ACCESS(const char *name, PRAccessHow how); | |
| 1094 #define _PR_MD_ACCESS _MD_ACCESS | |
| 1095 | |
| 1096 extern PRInt32 _PR_MD_STAT(const char *name, struct stat *buf); | |
| 1097 #define _PR_MD_STAT _MD_STAT | |
| 1098 | |
| 1099 extern PRInt32 _PR_MD_MKDIR(const char *name, PRIntn mode); | |
| 1100 #define _PR_MD_MKDIR _MD_MKDIR | |
| 1101 | |
| 1102 extern PRInt32 _PR_MD_MAKE_DIR(const char *name, PRIntn mode); | |
| 1103 #define _PR_MD_MAKE_DIR _MD_MAKE_DIR | |
| 1104 | |
| 1105 extern PRInt32 _PR_MD_RMDIR(const char *name); | |
| 1106 #define _PR_MD_RMDIR _MD_RMDIR | |
| 1107 | |
| 1108 #ifdef MOZ_UNICODE | |
| 1109 /* UTF16 File I/O related */ | |
| 1110 extern PRStatus _PR_MD_OPEN_DIR_UTF16(_MDDirUTF16 *md, const PRUnichar *name); | |
| 1111 #define _PR_MD_OPEN_DIR_UTF16 _MD_OPEN_DIR_UTF16 | |
| 1112 | |
| 1113 extern PROsfd _PR_MD_OPEN_FILE_UTF16(const PRUnichar *name, PRIntn osflags, PRIn
tn mode); | |
| 1114 #define _PR_MD_OPEN_FILE_UTF16 _MD_OPEN_FILE_UTF16 | |
| 1115 | |
| 1116 extern PRUnichar * _PR_MD_READ_DIR_UTF16(_MDDirUTF16 *md, PRIntn flags); | |
| 1117 #define _PR_MD_READ_DIR_UTF16 _MD_READ_DIR_UTF16 | |
| 1118 | |
| 1119 extern PRInt32 _PR_MD_CLOSE_DIR_UTF16(_MDDirUTF16 *md); | |
| 1120 #define _PR_MD_CLOSE_DIR_UTF16 _MD_CLOSE_DIR_UTF16 | |
| 1121 | |
| 1122 extern PRInt32 _PR_MD_GETFILEINFO64_UTF16(const PRUnichar *fn, PRFileInfo64 *inf
o); | |
| 1123 #define _PR_MD_GETFILEINFO64_UTF16 _MD_GETFILEINFO64_UTF16 | |
| 1124 #endif /* MOZ_UNICODE */ | |
| 1125 | |
| 1126 /* Socket I/O related */ | |
| 1127 extern void _PR_MD_INIT_IO(void); | |
| 1128 #define _PR_MD_INIT_IO _MD_INIT_IO | |
| 1129 | |
| 1130 extern PRInt32 _PR_MD_CLOSE_SOCKET(PROsfd osfd); | |
| 1131 #define _PR_MD_CLOSE_SOCKET _MD_CLOSE_SOCKET | |
| 1132 | |
| 1133 extern PRInt32 _PR_MD_CONNECT( | |
| 1134 PRFileDesc *fd, const PRNetAddr *addr, | |
| 1135 PRUint32 addrlen, PRIntervalTime timeout); | |
| 1136 #define _PR_MD_CONNECT _MD_CONNECT | |
| 1137 | |
| 1138 extern PROsfd _PR_MD_ACCEPT( | |
| 1139 PRFileDesc *fd, PRNetAddr *addr, | |
| 1140 PRUint32 *addrlen, PRIntervalTime timeout); | |
| 1141 #define _PR_MD_ACCEPT _MD_ACCEPT | |
| 1142 | |
| 1143 extern PRInt32 _PR_MD_BIND(PRFileDesc *fd, const PRNetAddr *addr, PRUint32 addrl
en); | |
| 1144 #define _PR_MD_BIND _MD_BIND | |
| 1145 | |
| 1146 extern PRInt32 _PR_MD_LISTEN(PRFileDesc *fd, PRIntn backlog); | |
| 1147 #define _PR_MD_LISTEN _MD_LISTEN | |
| 1148 | |
| 1149 extern PRInt32 _PR_MD_SHUTDOWN(PRFileDesc *fd, PRIntn how); | |
| 1150 #define _PR_MD_SHUTDOWN _MD_SHUTDOWN | |
| 1151 | |
| 1152 extern PRInt32 _PR_MD_RECV(PRFileDesc *fd, void *buf, PRInt32 amount, | |
| 1153 PRIntn flags, PRIntervalTime timeout); | |
| 1154 #define _PR_MD_RECV _MD_RECV | |
| 1155 | |
| 1156 extern PRInt32 _PR_MD_SEND( | |
| 1157 PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags, | |
| 1158 PRIntervalTime timeout); | |
| 1159 #define _PR_MD_SEND _MD_SEND | |
| 1160 | |
| 1161 extern PRInt32 _PR_MD_ACCEPT_READ(PRFileDesc *sd, PROsfd *newSock, | |
| 1162 PRNetAddr **raddr, void *buf, PRInt32 amount, | |
| 1163 PRIntervalTime timeout); | |
| 1164 #define _PR_MD_ACCEPT_READ _MD_ACCEPT_READ | |
| 1165 | |
| 1166 #ifdef WIN32 | |
| 1167 extern PROsfd _PR_MD_FAST_ACCEPT(PRFileDesc *fd, PRNetAddr *addr, | |
| 1168 PRUint32 *addrlen, PRIntervalTime timeout, | |
| 1169 PRBool fast, | |
| 1170 _PR_AcceptTimeoutCallback callback, | |
| 1171 void *callbackArg); | |
| 1172 | |
| 1173 extern PRInt32 _PR_MD_FAST_ACCEPT_READ(PRFileDesc *sd, PROsfd *newSock, | |
| 1174 PRNetAddr **raddr, void *buf, PRInt32 amount, | |
| 1175 PRIntervalTime timeout, PRBool fast, | |
| 1176 _PR_AcceptTimeoutCallback callback, | |
| 1177 void *callbackArg); | |
| 1178 | |
| 1179 extern void _PR_MD_UPDATE_ACCEPT_CONTEXT(PROsfd s, PROsfd ls); | |
| 1180 #define _PR_MD_UPDATE_ACCEPT_CONTEXT _MD_UPDATE_ACCEPT_CONTEXT | |
| 1181 /* | |
| 1182 * The NSPR epoch (00:00:00 1 Jan 1970 UTC) in FILETIME. | |
| 1183 * We store the value in a PRTime variable for convenience. | |
| 1184 * This constant is used by _PR_FileTimeToPRTime(). | |
| 1185 * This is defined in ntmisc.c | |
| 1186 */ | |
| 1187 extern const PRTime _pr_filetime_offset; | |
| 1188 #endif /* WIN32 */ | |
| 1189 | |
| 1190 extern PRInt32 _PR_MD_SENDFILE( | |
| 1191 PRFileDesc *sock, PRSendFileData *sfd, | |
| 1192 PRInt32 flags, PRIntervalTime timeout); | |
| 1193 #define _PR_MD_SENDFILE _MD_SENDFILE | |
| 1194 | |
| 1195 extern PRStatus _PR_MD_GETSOCKNAME( | |
| 1196 PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen); | |
| 1197 #define _PR_MD_GETSOCKNAME _MD_GETSOCKNAME | |
| 1198 | |
| 1199 extern PRStatus _PR_MD_GETPEERNAME( | |
| 1200 PRFileDesc *fd, PRNetAddr *addr, PRUint32 *addrlen); | |
| 1201 #define _PR_MD_GETPEERNAME _MD_GETPEERNAME | |
| 1202 | |
| 1203 extern PRStatus _PR_MD_GETSOCKOPT( | |
| 1204 PRFileDesc *fd, PRInt32 level, PRInt32 optname, char* optval, PRInt32* optle
n); | |
| 1205 #define _PR_MD_GETSOCKOPT _MD_GETSOCKOPT | |
| 1206 | |
| 1207 extern PRStatus _PR_MD_SETSOCKOPT( | |
| 1208 PRFileDesc *fd, PRInt32 level, PRInt32 optname, | |
| 1209 const char* optval, PRInt32 optlen); | |
| 1210 #define _PR_MD_SETSOCKOPT _MD_SETSOCKOPT | |
| 1211 | |
| 1212 extern PRStatus PR_CALLBACK _PR_SocketGetSocketOption( | |
| 1213 PRFileDesc *fd, PRSocketOptionData *data); | |
| 1214 | |
| 1215 extern PRStatus PR_CALLBACK _PR_SocketSetSocketOption( | |
| 1216 PRFileDesc *fd, const PRSocketOptionData *data); | |
| 1217 | |
| 1218 extern PRInt32 _PR_MD_RECVFROM( | |
| 1219 PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags, | |
| 1220 PRNetAddr *addr, PRUint32 *addrlen, PRIntervalTime timeout); | |
| 1221 #define _PR_MD_RECVFROM _MD_RECVFROM | |
| 1222 | |
| 1223 extern PRInt32 _PR_MD_SENDTO( | |
| 1224 PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags, | |
| 1225 const PRNetAddr *addr, PRUint32 addrlen, PRIntervalTime timeout); | |
| 1226 #define _PR_MD_SENDTO _MD_SENDTO | |
| 1227 | |
| 1228 extern PRInt32 _PR_MD_SOCKETPAIR(int af, int type, int flags, PROsfd *osfd); | |
| 1229 #define _PR_MD_SOCKETPAIR _MD_SOCKETPAIR | |
| 1230 | |
| 1231 extern PROsfd _PR_MD_SOCKET(int af, int type, int flags); | |
| 1232 #define _PR_MD_SOCKET _MD_SOCKET | |
| 1233 | |
| 1234 extern PRInt32 _PR_MD_SOCKETAVAILABLE(PRFileDesc *fd); | |
| 1235 #define _PR_MD_SOCKETAVAILABLE _MD_SOCKETAVAILABLE | |
| 1236 | |
| 1237 extern PRInt32 _PR_MD_PIPEAVAILABLE(PRFileDesc *fd); | |
| 1238 #define _PR_MD_PIPEAVAILABLE _MD_PIPEAVAILABLE | |
| 1239 | |
| 1240 extern PRInt32 _PR_MD_PR_POLL(PRPollDesc *pds, PRIntn npds, | |
| 1241
PRIntervalTime timeout); | |
| 1242 #define _PR_MD_PR_POLL _MD_PR_POLL | |
| 1243 | |
| 1244 /* | |
| 1245 * Initialize fd->secret->inheritable for a newly created fd. | |
| 1246 * If 'imported' is false, the osfd (i.e., fd->secret->md.osfd) | |
| 1247 * was created by NSPR and hence has the OS-dependent default | |
| 1248 * inheritable attribute. If 'imported' is true, the osfd was | |
| 1249 * not created by NSPR and hence a system call is required to | |
| 1250 * query its inheritable attribute. Since we may never need to | |
| 1251 * know the inheritable attribute of a fd, a platform may choose | |
| 1252 * to initialize fd->secret->inheritable of an imported fd to | |
| 1253 * _PR_TRI_UNKNOWN and only pay the cost of the system call | |
| 1254 * (in _PR_MD_QUERY_FD_INHERITABLE) when necessary. | |
| 1255 */ | |
| 1256 extern void _PR_MD_INIT_FD_INHERITABLE(PRFileDesc *fd, PRBool imported); | |
| 1257 #define _PR_MD_INIT_FD_INHERITABLE _MD_INIT_FD_INHERITABLE | |
| 1258 | |
| 1259 extern PRStatus _PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable); | |
| 1260 #define _PR_MD_SET_FD_INHERITABLE _MD_SET_FD_INHERITABLE | |
| 1261 | |
| 1262 | |
| 1263 #define _PR_PROCESS_TIMEOUT_INTERRUPT_ERRORS(me) \ | |
| 1264 if (_PR_PENDING_INTERRUPT(me)) { \ | |
| 1265 me->flags &= ~_PR_INTERRUPT; \ | |
| 1266 PR_SetError( PR_PENDING_INTERRUPT_ERROR, 0); \ | |
| 1267 } else { \ | |
| 1268 PR_SetError(PR_IO_TIMEOUT_ERROR, 0); \ | |
| 1269 } | |
| 1270 | |
| 1271 extern void *_PR_MD_GET_SP(PRThread *thread); | |
| 1272 #define _PR_MD_GET_SP _MD_GET_SP | |
| 1273 | |
| 1274 #endif /* defined(_PR_PTHREADS) */ | |
| 1275 | |
| 1276 /************************************************************************/ | |
| 1277 /************************************************************************* | |
| 1278 ** The remainder of the definitions are shared by pthreads and the classic | |
| 1279 ** NSPR code. These too may be conditionalized. | |
| 1280 *************************************************************************/ | |
| 1281 /************************************************************************/ | |
| 1282 | |
| 1283 extern PROffset32 _PR_MD_LSEEK(PRFileDesc *fd, PROffset32 offset, PRSeekWhence w
hence); | |
| 1284 #define _PR_MD_LSEEK _MD_LSEEK | |
| 1285 | |
| 1286 extern PROffset64 _PR_MD_LSEEK64(PRFileDesc *fd, PROffset64 offset, PRSeekWhence
whence); | |
| 1287 #define _PR_MD_LSEEK64 _MD_LSEEK64 | |
| 1288 | |
| 1289 extern PRInt32 _PR_MD_GETFILEINFO(const char *fn, PRFileInfo *info); | |
| 1290 #define _PR_MD_GETFILEINFO _MD_GETFILEINFO | |
| 1291 | |
| 1292 extern PRInt32 _PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info); | |
| 1293 #define _PR_MD_GETFILEINFO64 _MD_GETFILEINFO64 | |
| 1294 | |
| 1295 extern PRInt32 _PR_MD_GETOPENFILEINFO(const PRFileDesc *fd, PRFileInfo *info); | |
| 1296 #define _PR_MD_GETOPENFILEINFO _MD_GETOPENFILEINFO | |
| 1297 | |
| 1298 extern PRInt32 _PR_MD_GETOPENFILEINFO64(const PRFileDesc *fd, PRFileInfo64 *info
); | |
| 1299 #define _PR_MD_GETOPENFILEINFO64 _MD_GETOPENFILEINFO64 | |
| 1300 | |
| 1301 | |
| 1302 /*****************************************************************************/ | |
| 1303 /************************** File descriptor caching **************************/ | |
| 1304 /*****************************************************************************/ | |
| 1305 extern void _PR_InitFdCache(void); | |
| 1306 extern void _PR_CleanupFdCache(void); | |
| 1307 extern PRFileDesc *_PR_Getfd(void); | |
| 1308 extern void _PR_Putfd(PRFileDesc *fd); | |
| 1309 | |
| 1310 /* | |
| 1311 * These flags are used by NSPR temporarily in the poll | |
| 1312 * descriptor's out_flags field to record the mapping of | |
| 1313 * NSPR's poll flags to the system poll flags. | |
| 1314 * | |
| 1315 * If _PR_POLL_READ_SYS_WRITE bit is set, it means the | |
| 1316 * PR_POLL_READ flag specified by the topmost layer is | |
| 1317 * mapped to the WRITE flag at the system layer. Similarly | |
| 1318 * for the other three _PR_POLL_XXX_SYS_YYY flags. It is | |
| 1319 * assumed that the PR_POLL_EXCEPT flag doesn't get mapped | |
| 1320 * to other flags. | |
| 1321 */ | |
| 1322 #define _PR_POLL_READ_SYS_READ 0x1 | |
| 1323 #define _PR_POLL_READ_SYS_WRITE 0x2 | |
| 1324 #define _PR_POLL_WRITE_SYS_READ 0x4 | |
| 1325 #define _PR_POLL_WRITE_SYS_WRITE 0x8 | |
| 1326 | |
| 1327 /* | |
| 1328 ** These methods are coerced into file descriptor methods table | |
| 1329 ** when the intended service is inappropriate for the particular | |
| 1330 ** type of file descriptor. | |
| 1331 */ | |
| 1332 extern PRIntn _PR_InvalidInt(void); | |
| 1333 extern PRInt16 _PR_InvalidInt16(void); | |
| 1334 extern PRInt64 _PR_InvalidInt64(void); | |
| 1335 extern PRStatus _PR_InvalidStatus(void); | |
| 1336 extern PRFileDesc *_PR_InvalidDesc(void); | |
| 1337 | |
| 1338 extern PRIOMethods _pr_faulty_methods; | |
| 1339 | |
| 1340 /* | |
| 1341 ** The PR_NETADDR_SIZE macro can only be called on a PRNetAddr union | |
| 1342 ** whose 'family' field is set. It returns the size of the union | |
| 1343 ** member corresponding to the specified address family. | |
| 1344 */ | |
| 1345 | |
| 1346 extern PRUintn _PR_NetAddrSize(const PRNetAddr* addr); | |
| 1347 | |
| 1348 #if defined(_PR_INET6) | |
| 1349 | |
| 1350 #define PR_NETADDR_SIZE(_addr) _PR_NetAddrSize(_addr) | |
| 1351 | |
| 1352 #elif defined(_PR_HAVE_MD_SOCKADDR_IN6) | |
| 1353 | |
| 1354 /* | |
| 1355 ** Under the following conditions: | |
| 1356 ** 1. _PR_INET6 is not defined; | |
| 1357 ** 2. _PR_INET6_PROBE is defined; | |
| 1358 ** 3. struct sockaddr_in6 has nonstandard fields at the end | |
| 1359 ** (e.g., on Solaris 8), | |
| 1360 ** (_addr)->ipv6 is smaller than struct sockaddr_in6, and | |
| 1361 ** hence we can't pass sizeof((_addr)->ipv6) to socket | |
| 1362 ** functions such as connect because they would fail with | |
| 1363 ** EINVAL. | |
| 1364 ** | |
| 1365 ** To pass the correct socket address length to socket | |
| 1366 ** functions, define the macro _PR_HAVE_MD_SOCKADDR_IN6 and | |
| 1367 ** define struct _md_sockaddr_in6 to be isomorphic to | |
| 1368 ** struct sockaddr_in6. | |
| 1369 */ | |
| 1370 | |
| 1371 #if defined(XP_UNIX) || defined(XP_OS2) | |
| 1372 #define PR_NETADDR_SIZE(_addr) \ | |
| 1373 ((_addr)->raw.family == PR_AF_INET \ | |
| 1374 ? sizeof((_addr)->inet) \ | |
| 1375 : ((_addr)->raw.family == PR_AF_INET6 \ | |
| 1376 ? sizeof(struct _md_sockaddr_in6) \ | |
| 1377 : sizeof((_addr)->local))) | |
| 1378 #else | |
| 1379 #define PR_NETADDR_SIZE(_addr) \ | |
| 1380 ((_addr)->raw.family == PR_AF_INET \ | |
| 1381 ? sizeof((_addr)->inet) \ | |
| 1382 : sizeof(struct _md_sockaddr_in6)) | |
| 1383 #endif /* defined(XP_UNIX) */ | |
| 1384 | |
| 1385 #else | |
| 1386 | |
| 1387 #if defined(XP_UNIX) || defined(XP_OS2) | |
| 1388 #define PR_NETADDR_SIZE(_addr) \ | |
| 1389 ((_addr)->raw.family == PR_AF_INET \ | |
| 1390 ? sizeof((_addr)->inet) \ | |
| 1391 : ((_addr)->raw.family == PR_AF_INET6 \ | |
| 1392 ? sizeof((_addr)->ipv6) \ | |
| 1393 : sizeof((_addr)->local))) | |
| 1394 #else | |
| 1395 #define PR_NETADDR_SIZE(_addr) \ | |
| 1396 ((_addr)->raw.family == PR_AF_INET \ | |
| 1397 ? sizeof((_addr)->inet) \ | |
| 1398 : sizeof((_addr)->ipv6)) | |
| 1399 #endif /* defined(XP_UNIX) */ | |
| 1400 | |
| 1401 #endif /* defined(_PR_INET6) */ | |
| 1402 | |
| 1403 extern PRStatus _PR_MapOptionName( | |
| 1404 PRSockOption optname, PRInt32 *level, PRInt32 *name); | |
| 1405 extern void _PR_InitThreads( | |
| 1406 PRThreadType type, PRThreadPriority priority, PRUintn maxPTDs); | |
| 1407 | |
| 1408 struct PRLock { | |
| 1409 #if defined(_PR_PTHREADS) | |
| 1410 pthread_mutex_t mutex; /* the underlying lock */ | |
| 1411 _PT_Notified notified; /* array of conditions notified */ | |
| 1412 PRBool locked; /* whether the mutex is locked */ | |
| 1413 pthread_t owner; /* if locked, current lock owner */ | |
| 1414 #elif defined(_PR_BTHREADS) | |
| 1415 sem_id semaphoreID; /* the underlying lock */ | |
| 1416 int32 benaphoreCount; /* number of people in lock */ | |
| 1417 thread_id owner; /* current lock owner */ | |
| 1418 #else /* not pthreads or Be threads */ | |
| 1419 PRCList links; /* linkage for PRThread.lockList */ | |
| 1420 struct PRThread *owner; /* current lock owner */ | |
| 1421 PRCList waitQ; /* list of threads waiting for lock */ | |
| 1422 PRThreadPriority priority; /* priority of lock */ | |
| 1423 PRThreadPriority boostPriority; /* boosted priority of lock owner */ | |
| 1424 _MDLock ilock; /* Internal Lock to protect user-level field
s */ | |
| 1425 #endif | |
| 1426 }; | |
| 1427 | |
| 1428 struct PRCondVar { | |
| 1429 PRLock *lock; /* associated lock that protects the condition *
/ | |
| 1430 #if defined(_PR_PTHREADS) | |
| 1431 pthread_cond_t cv; /* underlying pthreads condition */ | |
| 1432 PRInt32 notify_pending; /* CV has destroy pending notification */ | |
| 1433 #elif defined(_PR_BTHREADS) | |
| 1434 sem_id sem; /* the underlying lock */ | |
| 1435 sem_id handshakeSem; /* the lock for 'notify'-threads waiting for con
firmation */ | |
| 1436 sem_id signalSem; /* the lock for threads waiting for someone to n
otify */ | |
| 1437 volatile int32 nw; /* the number waiting */ | |
| 1438 volatile int32 ns; /* the number signalling */ | |
| 1439 long signalBenCount; /* the number waiting on the underlying sem */ | |
| 1440 #else /* not pthreads or Be threads */ | |
| 1441 PRCList condQ; /* Condition variable wait Q */ | |
| 1442 _MDLock ilock; /* Internal Lock to protect condQ */ | |
| 1443 _MDCVar md; | |
| 1444 #endif | |
| 1445 }; | |
| 1446 | |
| 1447 /************************************************************************/ | |
| 1448 | |
| 1449 struct PRMonitor { | |
| 1450 const char* name; /* monitor name for debugging */ | |
| 1451 #if defined(_PR_PTHREADS) | |
| 1452 pthread_mutex_t lock; /* lock is only held when accessing fields | |
| 1453 * of the PRMonitor, instead of being held | |
| 1454 * while the monitor is entered. The only | |
| 1455 * exception is notifyTimes, which is | |
| 1456 * protected by the monitor. */ | |
| 1457 pthread_t owner; /* the owner of the monitor or invalid */ | |
| 1458 pthread_cond_t entryCV; /* for threads waiting to enter the monitor */ | |
| 1459 | |
| 1460 pthread_cond_t waitCV; /* for threads waiting on the monitor */ | |
| 1461 PRInt32 refCount; /* reference count, an atomic variable. | |
| 1462 * PR_NewMonitor adds a reference to the | |
| 1463 * newly created PRMonitor, and | |
| 1464 * PR_DestroyMonitor releases that reference. | |
| 1465 * PR_ExitMonitor adds a reference before | |
| 1466 * unlocking the internal lock if it needs to | |
| 1467 * signal entryCV, and releases the reference | |
| 1468 * after signaling entryCV. */ | |
| 1469 #else /* defined(_PR_PTHREADS) */ | |
| 1470 PRLock lock; /* lock is only held when accessing fields | |
| 1471 * of the PRMonitor, instead of being held | |
| 1472 * while the monitor is entered. The only | |
| 1473 * exception is notifyTimes, which is | |
| 1474 * protected by the monitor. */ | |
| 1475 PRThread *owner; /* the owner of the monitor or invalid */ | |
| 1476 PRCondVar entryCV; /* for threads waiting to enter the monitor */ | |
| 1477 | |
| 1478 PRCondVar waitCV; /* for threads waiting on the monitor */ | |
| 1479 #endif /* defined(_PR_PTHREADS) */ | |
| 1480 PRUint32 entryCount; /* # of times re-entered */ | |
| 1481 PRIntn notifyTimes; /* number of pending notifies for waitCV. | |
| 1482 * The special value -1 means a broadcast | |
| 1483 * (PR_NotifyAll). */ | |
| 1484 }; | |
| 1485 | |
| 1486 /************************************************************************/ | |
| 1487 | |
| 1488 struct PRSemaphore { | |
| 1489 #if defined(_PR_BTHREADS) | |
| 1490 sem_id sem; | |
| 1491 int32 benaphoreCount; | |
| 1492 #else | |
| 1493 PRCondVar *cvar; /* associated lock and condition variable queue */ | |
| 1494 PRUintn count; /* the value of the counting semaphore */ | |
| 1495 PRUint32 waiters; /* threads waiting on the semaphore */ | |
| 1496 #if defined(_PR_PTHREADS) | |
| 1497 #else /* defined(_PR_PTHREADS) */ | |
| 1498 _MDSemaphore md; | |
| 1499 #endif /* defined(_PR_PTHREADS) */ | |
| 1500 #endif /* defined(_PR_BTHREADS) */ | |
| 1501 }; | |
| 1502 | |
| 1503 /*************************************************************************/ | |
| 1504 | |
| 1505 struct PRSem { | |
| 1506 #ifdef _PR_HAVE_POSIX_SEMAPHORES | |
| 1507 sem_t *sem; | |
| 1508 #elif defined(_PR_HAVE_SYSV_SEMAPHORES) | |
| 1509 int semid; | |
| 1510 #elif defined(WIN32) | |
| 1511 HANDLE sem; | |
| 1512 #else | |
| 1513 PRInt8 notused; | |
| 1514 #endif | |
| 1515 }; | |
| 1516 | |
| 1517 /*************************************************************************/ | |
| 1518 | |
| 1519 struct PRStackStr { | |
| 1520 /* head MUST be at offset 0; assembly language code relies on this */ | |
| 1521 #if defined(AIX) | |
| 1522 volatile PRStackElem prstk_head; | |
| 1523 #else | |
| 1524 PRStackElem prstk_head; | |
| 1525 #endif | |
| 1526 | |
| 1527 PRLock *prstk_lock; | |
| 1528 char *prstk_name; | |
| 1529 }; | |
| 1530 | |
| 1531 /************************************************************************/ | |
| 1532 | |
| 1533 /* XXX this needs to be exported (sigh) */ | |
| 1534 struct PRThreadStack { | |
| 1535 PRCList links; | |
| 1536 PRUintn flags; | |
| 1537 | |
| 1538 char *allocBase; /* base of stack's allocated memory */ | |
| 1539 PRUint32 allocSize; /* size of stack's allocated memory */ | |
| 1540 char *stackBottom; /* bottom of stack from C's point of view */ | |
| 1541 char *stackTop; /* top of stack from C's point of view */ | |
| 1542 PRUint32 stackSize; /* size of usable portion of the stack */ | |
| 1543 | |
| 1544 PRSegment *seg; | |
| 1545 PRThread* thr; /* back pointer to thread owning this stack */ | |
| 1546 | |
| 1547 #if defined(_PR_PTHREADS) | |
| 1548 #else /* defined(_PR_PTHREADS) */ | |
| 1549 _MDThreadStack md; | |
| 1550 #endif /* defined(_PR_PTHREADS) */ | |
| 1551 }; | |
| 1552 | |
| 1553 extern void _PR_DestroyThreadPrivate(PRThread*); | |
| 1554 | |
| 1555 typedef void (PR_CALLBACK *_PRStartFn)(void *); | |
| 1556 | |
| 1557 struct PRThread { | |
| 1558 PRUint32 state; /* thread's creation state */ | |
| 1559 PRThreadPriority priority; /* apparent priority, loosly defined */ | |
| 1560 | |
| 1561 void *arg; /* argument to the client's entry point */ | |
| 1562 _PRStartFn startFunc; /* the root of the client's thread */ | |
| 1563 | |
| 1564 PRThreadStack *stack; /* info about thread's stack (for GC) */ | |
| 1565 void *environment; /* pointer to execution environment */ | |
| 1566 | |
| 1567 PRThreadDumpProc dump; /* dump thread info out */ | |
| 1568 void *dumpArg; /* argument for the dump function */ | |
| 1569 | |
| 1570 /* | |
| 1571 ** Per thread private data | |
| 1572 */ | |
| 1573 PRUint32 tpdLength; /* thread's current vector length */ | |
| 1574 void **privateData; /* private data vector or NULL */ | |
| 1575 PRErrorCode errorCode; /* current NSPR error code | zero */ | |
| 1576 PRInt32 osErrorCode; /* mapping of errorCode | zero */ | |
| 1577 PRIntn errorStringLength; /* textLength from last call to PR_SetErrorT
ext() */ | |
| 1578 PRInt32 errorStringSize; /* malloc()'d size of buffer | zero */ | |
| 1579 char *errorString; /* current error string | NULL */ | |
| 1580 char *name; /* thread's name */ | |
| 1581 | |
| 1582 #if defined(_PR_PTHREADS) | |
| 1583 pthread_t id; /* pthread identifier for the thread */ | |
| 1584 PRBool idSet; /* whether 'id' has been set. Protected by | |
| 1585 * pt_book.ml. */ | |
| 1586 #ifdef _PR_NICE_PRIORITY_SCHEDULING | |
| 1587 pid_t tid; /* Linux-specific kernel thread ID */ | |
| 1588 #endif | |
| 1589 PRBool okToDelete; /* ok to delete the PRThread struct? */ | |
| 1590 PRCondVar *waiting; /* where the thread is waiting | NULL */ | |
| 1591 void *sp; /* recorded sp for garbage collection */ | |
| 1592 PRThread *next, *prev; /* simple linked list of all threads */ | |
| 1593 PRUint32 suspend; /* used to store suspend and resume flags */ | |
| 1594 #ifdef PT_NO_SIGTIMEDWAIT | |
| 1595 pthread_mutex_t suspendResumeMutex; | |
| 1596 pthread_cond_t suspendResumeCV; | |
| 1597 #endif | |
| 1598 PRUint32 interrupt_blocked; /* interrupt blocked */ | |
| 1599 struct pollfd *syspoll_list; /* Unix polling list used by PR_Poll */ | |
| 1600 PRUint32 syspoll_count; /* number of elements in syspoll_list */ | |
| 1601 #if defined(_PR_POLL_WITH_SELECT) | |
| 1602 int *selectfd_list; /* Unix fd's that PR_Poll selects on */ | |
| 1603 PRUint32 selectfd_count; /* number of elements in selectfd_list */ | |
| 1604 #endif | |
| 1605 #elif defined(_PR_BTHREADS) | |
| 1606 PRUint32 flags; | |
| 1607 _MDThread md; | |
| 1608 PRBool io_pending; | |
| 1609 PRInt32 io_fd; | |
| 1610 PRBool io_suspended; | |
| 1611 #else /* not pthreads or Be threads */ | |
| 1612 _MDLock threadLock; /* Lock to protect thread state variables. | |
| 1613 * Protects the following fields: | |
| 1614 * state | |
| 1615 * priority | |
| 1616 * links | |
| 1617 * wait | |
| 1618 * cpu | |
| 1619 */ | |
| 1620 PRUint32 queueCount; | |
| 1621 PRUint32 waitCount; | |
| 1622 | |
| 1623 PRCList active; /* on list of all active threads */ | |
| 1624 PRCList links; | |
| 1625 PRCList waitQLinks; /* when thread is PR_Wait'ing */ | |
| 1626 PRCList lockList; /* list of locks currently holding */ | |
| 1627 PRIntervalTime sleep; /* sleep time when thread is sleeping */ | |
| 1628 struct _wait { | |
| 1629 struct PRLock *lock; | |
| 1630 struct PRCondVar *cvar; | |
| 1631 } wait; | |
| 1632 | |
| 1633 PRUint32 id; | |
| 1634 PRUint32 flags; | |
| 1635 PRUint32 no_sched; /* Don't schedule the thread to run. | |
| 1636 * This flag has relevance only when | |
| 1637 * multiple NSPR CPUs are created. | |
| 1638 * When a thread is de-scheduled, there | |
| 1639 * is a narrow window of time in which | |
| 1640 * the thread is put on the run queue | |
| 1641 * but the scheduler is actually using | |
| 1642 * the stack of this thread. It is safe | |
| 1643 * to run this thread on a different CPU | |
| 1644 * only when its stack is not in use on | |
| 1645 * any other CPU. The no_sched flag is | |
| 1646 * set during this interval to prevent | |
| 1647 * the thread from being scheduled on a | |
| 1648 * different CPU. | |
| 1649 */ | |
| 1650 | |
| 1651 /* thread termination condition variable for join */ | |
| 1652 PRCondVar *term; | |
| 1653 | |
| 1654 _PRCPU *cpu; /* cpu to which this thread is bound */ | |
| 1655 PRUint32 threadAllocatedOnStack;/* boolean */ | |
| 1656 | |
| 1657 /* When an async IO is in progress and a second async IO cannot be | |
| 1658 * initiated, the io_pending flag is set to true. Some platforms will | |
| 1659 * not use the io_pending flag. If the io_pending flag is true, then | |
| 1660 * io_fd is the OS-file descriptor on which IO is pending. | |
| 1661 */ | |
| 1662 PRBool io_pending; | |
| 1663 PRInt32 io_fd; | |
| 1664 | |
| 1665 /* If a timeout occurs or if an outstanding IO is interrupted and the | |
| 1666 * OS doesn't support a real cancellation (NT or MAC), then the | |
| 1667 * io_suspended flag will be set to true. The thread will be resumed | |
| 1668 * but may run into trouble issuing additional IOs until the io_pending | |
| 1669 * flag can be cleared | |
| 1670 */ | |
| 1671 PRBool io_suspended; | |
| 1672 | |
| 1673 _MDThread md; | |
| 1674 #endif | |
| 1675 }; | |
| 1676 | |
| 1677 struct PRProcessAttr { | |
| 1678 PRFileDesc *stdinFd; | |
| 1679 PRFileDesc *stdoutFd; | |
| 1680 PRFileDesc *stderrFd; | |
| 1681 char *currentDirectory; | |
| 1682 char *fdInheritBuffer; | |
| 1683 PRSize fdInheritBufferSize; | |
| 1684 PRSize fdInheritBufferUsed; | |
| 1685 }; | |
| 1686 | |
| 1687 struct PRProcess { | |
| 1688 _MDProcess md; | |
| 1689 }; | |
| 1690 | |
| 1691 struct PRFileMap { | |
| 1692 PRFileDesc *fd; | |
| 1693 PRFileMapProtect prot; | |
| 1694 _MDFileMap md; | |
| 1695 }; | |
| 1696 | |
| 1697 /************************************************************************/ | |
| 1698 | |
| 1699 /* | |
| 1700 ** File descriptors of the NSPR layer can be in one of the | |
| 1701 ** following states (stored in the 'state' field of struct | |
| 1702 ** PRFilePrivate): | |
| 1703 ** - _PR_FILEDESC_OPEN: The OS fd is open. | |
| 1704 ** - _PR_FILEDESC_CLOSED: The OS fd is closed. The PRFileDesc | |
| 1705 ** is still open but is unusable. The only operation allowed | |
| 1706 ** on the PRFileDesc is PR_Close(). | |
| 1707 ** - _PR_FILEDESC_FREED: The OS fd is closed and the PRFileDesc | |
| 1708 ** structure is freed. | |
| 1709 */ | |
| 1710 | |
| 1711 #define _PR_FILEDESC_OPEN 0xaaaaaaaa /* 1010101... */ | |
| 1712 #define _PR_FILEDESC_CLOSED 0x55555555 /* 0101010... */ | |
| 1713 #define _PR_FILEDESC_FREED 0x11111111 | |
| 1714 | |
| 1715 /* | |
| 1716 ** A boolean type with an additional "unknown" state | |
| 1717 */ | |
| 1718 | |
| 1719 typedef enum { | |
| 1720 _PR_TRI_TRUE = 1, | |
| 1721 _PR_TRI_FALSE = 0, | |
| 1722 _PR_TRI_UNKNOWN = -1 | |
| 1723 } _PRTriStateBool; | |
| 1724 | |
| 1725 struct PRFilePrivate { | |
| 1726 PRInt32 state; | |
| 1727 PRBool nonblocking; | |
| 1728 _PRTriStateBool inheritable; | |
| 1729 PRFileDesc *next; | |
| 1730 PRIntn lockCount; /* 0: not locked | |
| 1731 * -1: a native lockfile call is in progress | |
| 1732 * > 0: # times the file is locked */ | |
| 1733 #ifdef _PR_HAVE_PEEK_BUFFER | |
| 1734 char *peekBuffer; | |
| 1735 PRInt32 peekBufSize; | |
| 1736 PRInt32 peekBytes; | |
| 1737 #endif | |
| 1738 #if !defined(_PR_HAVE_O_APPEND) | |
| 1739 PRBool appendMode; /* Some platforms don't have O_APPEND or its | |
| 1740 * equivalent, so they have to seek to end of | |
| 1741 * file on write if the file was opened in | |
| 1742 * append mode. See Bugzilla 4090, 276330. */ | |
| 1743 #endif | |
| 1744 _MDFileDesc md; | |
| 1745 #ifdef _PR_NEED_SECRET_AF | |
| 1746 PRUint16 af; /* If the platform's implementation of accept() | |
| 1747 * requires knowing the address family of the | |
| 1748 * socket, we save the address family here. */ | |
| 1749 #endif | |
| 1750 }; | |
| 1751 | |
| 1752 #ifdef _WIN64 | |
| 1753 #define PR_PRIdOSFD "lld" /* for printing PROsfd */ | |
| 1754 #define PR_PRIxOSFD "llx" | |
| 1755 #define PR_SCNdOSFD "lld" /* for scanning PROsfd */ | |
| 1756 #define PR_SCNxOSFD "llx" | |
| 1757 #else | |
| 1758 #define PR_PRIdOSFD "ld" /* for printing PROsfd */ | |
| 1759 #define PR_PRIxOSFD "lx" | |
| 1760 #define PR_SCNdOSFD "ld" /* for scanning PROsfd */ | |
| 1761 #define PR_SCNxOSFD "lx" | |
| 1762 #endif | |
| 1763 | |
| 1764 struct PRDir { | |
| 1765 PRDirEntry d; | |
| 1766 _MDDir md; | |
| 1767 }; | |
| 1768 | |
| 1769 #ifdef MOZ_UNICODE | |
| 1770 struct PRDirUTF16 { | |
| 1771 PRDirEntry d; | |
| 1772 _MDDirUTF16 md; | |
| 1773 }; | |
| 1774 #endif /* MOZ_UNICODE */ | |
| 1775 | |
| 1776 extern void _PR_InitLocks(void); | |
| 1777 extern void _PR_InitSegs(void); | |
| 1778 extern void _PR_InitStacks(void); | |
| 1779 extern void _PR_InitTPD(void); | |
| 1780 extern void _PR_InitMem(void); | |
| 1781 extern void _PR_InitEnv(void); | |
| 1782 extern void _PR_InitCMon(void); | |
| 1783 extern void _PR_InitIO(void); | |
| 1784 extern void _PR_InitLog(void); | |
| 1785 extern void _PR_InitNet(void); | |
| 1786 extern void _PR_InitClock(void); | |
| 1787 extern void _PR_InitLinker(void); | |
| 1788 extern void _PR_InitAtomic(void); | |
| 1789 extern void _PR_InitCPUs(void); | |
| 1790 extern void _PR_InitDtoa(void); | |
| 1791 extern void _PR_InitTime(void); | |
| 1792 extern void _PR_InitMW(void); | |
| 1793 extern void _PR_InitRWLocks(void); | |
| 1794 extern void _PR_CleanupThread(PRThread *thread); | |
| 1795 extern void _PR_CleanupCallOnce(void); | |
| 1796 extern void _PR_CleanupMW(void); | |
| 1797 extern void _PR_CleanupTime(void); | |
| 1798 extern void _PR_CleanupDtoa(void); | |
| 1799 extern void _PR_ShutdownLinker(void); | |
| 1800 extern void _PR_CleanupEnv(void); | |
| 1801 extern void _PR_CleanupIO(void); | |
| 1802 extern void _PR_CleanupCMon(void); | |
| 1803 extern void _PR_CleanupNet(void); | |
| 1804 extern void _PR_CleanupLayerCache(void); | |
| 1805 extern void _PR_CleanupStacks(void); | |
| 1806 #ifdef WINNT | |
| 1807 extern void _PR_CleanupCPUs(void); | |
| 1808 #endif | |
| 1809 extern void _PR_CleanupThreads(void); | |
| 1810 extern void _PR_CleanupTPD(void); | |
| 1811 extern void _PR_Cleanup(void); | |
| 1812 extern void _PR_LogCleanup(void); | |
| 1813 extern void _PR_InitLayerCache(void); | |
| 1814 | |
| 1815 extern PRBool _pr_initialized; | |
| 1816 extern void _PR_ImplicitInitialization(void); | |
| 1817 extern PRBool _PR_Obsolete(const char *obsolete, const char *preferred); | |
| 1818 | |
| 1819 /************************************************************************/ | |
| 1820 | |
| 1821 struct PRSegment { | |
| 1822 void *vaddr; | |
| 1823 PRUint32 size; | |
| 1824 PRUintn flags; | |
| 1825 #if defined(_PR_PTHREADS) | |
| 1826 #else /* defined(_PR_PTHREADS) */ | |
| 1827 _MDSegment md; | |
| 1828 #endif /* defined(_PR_PTHREADS) */ | |
| 1829 }; | |
| 1830 | |
| 1831 /* PRSegment.flags */ | |
| 1832 #define _PR_SEG_VM 0x1 | |
| 1833 | |
| 1834 /************************************************************************/ | |
| 1835 | |
| 1836 extern PRInt32 _pr_pageSize; | |
| 1837 extern PRInt32 _pr_pageShift; | |
| 1838 | |
| 1839 extern PRLogModuleInfo *_pr_clock_lm; | |
| 1840 extern PRLogModuleInfo *_pr_cmon_lm; | |
| 1841 extern PRLogModuleInfo *_pr_io_lm; | |
| 1842 extern PRLogModuleInfo *_pr_cvar_lm; | |
| 1843 extern PRLogModuleInfo *_pr_mon_lm; | |
| 1844 extern PRLogModuleInfo *_pr_linker_lm; | |
| 1845 extern PRLogModuleInfo *_pr_sched_lm; | |
| 1846 extern PRLogModuleInfo *_pr_thread_lm; | |
| 1847 extern PRLogModuleInfo *_pr_gc_lm; | |
| 1848 | |
| 1849 extern PRFileDesc *_pr_stdin; | |
| 1850 extern PRFileDesc *_pr_stdout; | |
| 1851 extern PRFileDesc *_pr_stderr; | |
| 1852 | |
| 1853 /* Zone allocator */ | |
| 1854 /* | |
| 1855 ** The zone allocator code has hardcoded pthread types and | |
| 1856 ** functions, so it can only be used in the pthreads version. | |
| 1857 ** This can be fixed by replacing the hardcoded pthread types | |
| 1858 ** and functions with macros that expand to the native thread | |
| 1859 ** types and functions on each platform. | |
| 1860 */ | |
| 1861 #if defined(_PR_PTHREADS) && !defined(_PR_DCETHREADS) | |
| 1862 #define _PR_ZONE_ALLOCATOR | |
| 1863 #endif | |
| 1864 | |
| 1865 #ifdef _PR_ZONE_ALLOCATOR | |
| 1866 extern void _PR_InitZones(void); | |
| 1867 extern void _PR_DestroyZones(void); | |
| 1868 #endif | |
| 1869 | |
| 1870 /* Overriding malloc, free, etc. */ | |
| 1871 #if !defined(_PR_NO_PREEMPT) && defined(XP_UNIX) \ | |
| 1872 && !defined(_PR_PTHREADS) && !defined(_PR_GLOBAL_THREADS_ONLY) \ | |
| 1873 && !defined(PURIFY) \ | |
| 1874 && !defined(DARWIN) \ | |
| 1875 && !defined(QNX) \ | |
| 1876 && !(defined (UNIXWARE) && defined (USE_SVR4_THREADS)) | |
| 1877 #define _PR_OVERRIDE_MALLOC | |
| 1878 #endif | |
| 1879 | |
| 1880 /************************************************************************* | |
| 1881 * External machine-dependent code provided by each OS. *
* | |
| 1882 *************************************************************************/ | |
| 1883 | |
| 1884 /* Initialization related */ | |
| 1885 extern void _PR_MD_EARLY_INIT(void); | |
| 1886 #define _PR_MD_EARLY_INIT _MD_EARLY_INIT | |
| 1887 | |
| 1888 extern void _PR_MD_INTERVAL_INIT(void); | |
| 1889 #define _PR_MD_INTERVAL_INIT _MD_INTERVAL_INIT | |
| 1890 | |
| 1891 NSPR_API(void) _PR_MD_FINAL_INIT(void); | |
| 1892 #define _PR_MD_FINAL_INIT _MD_FINAL_INIT | |
| 1893 | |
| 1894 extern void _PR_MD_EARLY_CLEANUP(void); | |
| 1895 #define _PR_MD_EARLY_CLEANUP _MD_EARLY_CLEANUP | |
| 1896 | |
| 1897 /* Process control */ | |
| 1898 | |
| 1899 extern PRProcess * _PR_MD_CREATE_PROCESS( | |
| 1900 const char *path, | |
| 1901 char *const *argv, | |
| 1902 char *const *envp, | |
| 1903 const PRProcessAttr *attr); | |
| 1904 #define _PR_MD_CREATE_PROCESS _MD_CREATE_PROCESS | |
| 1905 | |
| 1906 extern PRStatus _PR_MD_DETACH_PROCESS(PRProcess *process); | |
| 1907 #define _PR_MD_DETACH_PROCESS _MD_DETACH_PROCESS | |
| 1908 | |
| 1909 extern PRStatus _PR_MD_WAIT_PROCESS(PRProcess *process, PRInt32 *exitCode); | |
| 1910 #define _PR_MD_WAIT_PROCESS _MD_WAIT_PROCESS | |
| 1911 | |
| 1912 extern PRStatus _PR_MD_KILL_PROCESS(PRProcess *process); | |
| 1913 #define _PR_MD_KILL_PROCESS _MD_KILL_PROCESS | |
| 1914 | |
| 1915 /* Current Time */ | |
| 1916 NSPR_API(PRTime) _PR_MD_NOW(void); | |
| 1917 #define _PR_MD_NOW _MD_NOW | |
| 1918 | |
| 1919 /* Environment related */ | |
| 1920 extern char* _PR_MD_GET_ENV(const char *name); | |
| 1921 #define _PR_MD_GET_ENV _MD_GET_ENV | |
| 1922 | |
| 1923 extern PRIntn _PR_MD_PUT_ENV(const char *name); | |
| 1924 #define _PR_MD_PUT_ENV _MD_PUT_ENV | |
| 1925 | |
| 1926 /* Atomic operations */ | |
| 1927 | |
| 1928 extern void _PR_MD_INIT_ATOMIC(void); | |
| 1929 #define _PR_MD_INIT_ATOMIC _MD_INIT_ATOMIC | |
| 1930 | |
| 1931 extern PRInt32 _PR_MD_ATOMIC_INCREMENT(PRInt32 *); | |
| 1932 #define _PR_MD_ATOMIC_INCREMENT _MD_ATOMIC_INCREMENT | |
| 1933 | |
| 1934 extern PRInt32 _PR_MD_ATOMIC_ADD(PRInt32 *, PRInt32); | |
| 1935 #define _PR_MD_ATOMIC_ADD _MD_ATOMIC_ADD | |
| 1936 | |
| 1937 extern PRInt32 _PR_MD_ATOMIC_DECREMENT(PRInt32 *); | |
| 1938 #define _PR_MD_ATOMIC_DECREMENT _MD_ATOMIC_DECREMENT | |
| 1939 | |
| 1940 extern PRInt32 _PR_MD_ATOMIC_SET(PRInt32 *, PRInt32); | |
| 1941 #define _PR_MD_ATOMIC_SET _MD_ATOMIC_SET | |
| 1942 | |
| 1943 /* Garbage collection */ | |
| 1944 | |
| 1945 /* | |
| 1946 ** Save the registers that the GC would find interesting into the thread | |
| 1947 ** "t". isCurrent will be non-zero if the thread state that is being | |
| 1948 ** saved is the currently executing thread. Return the address of the | |
| 1949 ** first register to be scanned as well as the number of registers to | |
| 1950 ** scan in "np". | |
| 1951 ** | |
| 1952 ** If "isCurrent" is non-zero then it is allowed for the thread context | |
| 1953 ** area to be used as scratch storage to hold just the registers | |
| 1954 ** necessary for scanning. | |
| 1955 */ | |
| 1956 extern PRWord *_MD_HomeGCRegisters(PRThread *t, int isCurrent, int *np); | |
| 1957 | |
| 1958 /* Time intervals */ | |
| 1959 | |
| 1960 extern PRIntervalTime _PR_MD_GET_INTERVAL(void); | |
| 1961 #define _PR_MD_GET_INTERVAL _MD_GET_INTERVAL | |
| 1962 | |
| 1963 extern PRIntervalTime _PR_MD_INTERVAL_PER_SEC(void); | |
| 1964 #define _PR_MD_INTERVAL_PER_SEC _MD_INTERVAL_PER_SEC | |
| 1965 | |
| 1966 /* Affinity masks */ | |
| 1967 | |
| 1968 extern PRInt32 _PR_MD_SETTHREADAFFINITYMASK(PRThread *thread, PRUint32 mask ); | |
| 1969 #define _PR_MD_SETTHREADAFFINITYMASK _MD_SETTHREADAFFINITYMASK | |
| 1970 | |
| 1971 extern PRInt32 _PR_MD_GETTHREADAFFINITYMASK(PRThread *thread, PRUint32 *mask); | |
| 1972 #define _PR_MD_GETTHREADAFFINITYMASK _MD_GETTHREADAFFINITYMASK | |
| 1973 | |
| 1974 /* File locking */ | |
| 1975 | |
| 1976 extern PRStatus _PR_MD_LOCKFILE(PROsfd osfd); | |
| 1977 #define _PR_MD_LOCKFILE _MD_LOCKFILE | |
| 1978 | |
| 1979 extern PRStatus _PR_MD_TLOCKFILE(PROsfd osfd); | |
| 1980 #define _PR_MD_TLOCKFILE _MD_TLOCKFILE | |
| 1981 | |
| 1982 extern PRStatus _PR_MD_UNLOCKFILE(PROsfd osfd); | |
| 1983 #define _PR_MD_UNLOCKFILE _MD_UNLOCKFILE | |
| 1984 | |
| 1985 /* Memory-mapped files */ | |
| 1986 | |
| 1987 extern PRStatus _PR_MD_CREATE_FILE_MAP(PRFileMap *fmap, PRInt64 size); | |
| 1988 #define _PR_MD_CREATE_FILE_MAP _MD_CREATE_FILE_MAP | |
| 1989 | |
| 1990 extern PRInt32 _PR_MD_GET_MEM_MAP_ALIGNMENT(void); | |
| 1991 #define _PR_MD_GET_MEM_MAP_ALIGNMENT _MD_GET_MEM_MAP_ALIGNMENT | |
| 1992 | |
| 1993 extern void * _PR_MD_MEM_MAP( | |
| 1994 PRFileMap *fmap, | |
| 1995 PROffset64 offset, | |
| 1996 PRUint32 len); | |
| 1997 #define _PR_MD_MEM_MAP _MD_MEM_MAP | |
| 1998 | |
| 1999 extern PRStatus _PR_MD_MEM_UNMAP(void *addr, PRUint32 size); | |
| 2000 #define _PR_MD_MEM_UNMAP _MD_MEM_UNMAP | |
| 2001 | |
| 2002 extern PRStatus _PR_MD_CLOSE_FILE_MAP(PRFileMap *fmap); | |
| 2003 #define _PR_MD_CLOSE_FILE_MAP _MD_CLOSE_FILE_MAP | |
| 2004 | |
| 2005 extern PRStatus _PR_MD_SYNC_MEM_MAP( | |
| 2006 PRFileDesc *fd, | |
| 2007 void *addr, | |
| 2008 PRUint32 len); | |
| 2009 #define _PR_MD_SYNC_MEM_MAP _MD_SYNC_MEM_MAP | |
| 2010 | |
| 2011 /* Named Shared Memory */ | |
| 2012 | |
| 2013 /* | |
| 2014 ** Declare PRSharedMemory. | |
| 2015 */ | |
| 2016 struct PRSharedMemory | |
| 2017 { | |
| 2018 char *ipcname; /* after conversion to native */ | |
| 2019 PRSize size; /* from open */ | |
| 2020 PRIntn mode; /* from open */ | |
| 2021 PRIntn flags; /* from open */ | |
| 2022 #if defined(PR_HAVE_POSIX_NAMED_SHARED_MEMORY) | |
| 2023 int id; | |
| 2024 #elif defined(PR_HAVE_SYSV_NAMED_SHARED_MEMORY) | |
| 2025 int id; | |
| 2026 #elif defined(PR_HAVE_WIN32_NAMED_SHARED_MEMORY) | |
| 2027 HANDLE handle; | |
| 2028 #else | |
| 2029 PRUint32 nothing; /* placeholder, nothing behind here */ | |
| 2030 #endif | |
| 2031 PRUint32 ident; /* guard word at end of struct */ | |
| 2032 #define _PR_SHM_IDENT 0xdeadbad | |
| 2033 }; | |
| 2034 | |
| 2035 extern PRSharedMemory * _MD_OpenSharedMemory( | |
| 2036 const char *name, | |
| 2037 PRSize size, | |
| 2038 PRIntn flags, | |
| 2039 PRIntn mode | |
| 2040 ); | |
| 2041 #define _PR_MD_OPEN_SHARED_MEMORY _MD_OpenSharedMemory | |
| 2042 | |
| 2043 extern void * _MD_AttachSharedMemory( PRSharedMemory *shm, PRIntn flags ); | |
| 2044 #define _PR_MD_ATTACH_SHARED_MEMORY _MD_AttachSharedMemory | |
| 2045 | |
| 2046 extern PRStatus _MD_DetachSharedMemory( PRSharedMemory *shm, void *addr ); | |
| 2047 #define _PR_MD_DETACH_SHARED_MEMORY _MD_DetachSharedMemory | |
| 2048 | |
| 2049 extern PRStatus _MD_CloseSharedMemory( PRSharedMemory *shm ); | |
| 2050 #define _PR_MD_CLOSE_SHARED_MEMORY _MD_CloseSharedMemory | |
| 2051 | |
| 2052 extern PRStatus _MD_DeleteSharedMemory( const char *name ); | |
| 2053 #define _PR_MD_DELETE_SHARED_MEMORY _MD_DeleteSharedMemory | |
| 2054 | |
| 2055 extern PRFileMap* _md_OpenAnonFileMap( | |
| 2056 const char *dirName, | |
| 2057 PRSize size, | |
| 2058 PRFileMapProtect prot | |
| 2059 ); | |
| 2060 #define _PR_MD_OPEN_ANON_FILE_MAP _md_OpenAnonFileMap | |
| 2061 | |
| 2062 extern PRStatus _md_ExportFileMapAsString( | |
| 2063 PRFileMap *fm, | |
| 2064 PRSize bufSize, | |
| 2065 char *buf | |
| 2066 ); | |
| 2067 #define _PR_MD_EXPORT_FILE_MAP_AS_STRING _md_ExportFileMapAsString | |
| 2068 | |
| 2069 extern PRFileMap * _md_ImportFileMapFromString( | |
| 2070 const char *fmstring | |
| 2071 ); | |
| 2072 #define _PR_MD_IMPORT_FILE_MAP_FROM_STRING _md_ImportFileMapFromString | |
| 2073 | |
| 2074 | |
| 2075 | |
| 2076 /* Interprocess communications (IPC) */ | |
| 2077 | |
| 2078 /* | |
| 2079 * The maximum length of an NSPR IPC name, including the | |
| 2080 * terminating null byte. | |
| 2081 */ | |
| 2082 #define PR_IPC_NAME_SIZE 1024 | |
| 2083 | |
| 2084 /* | |
| 2085 * Types of NSPR IPC objects | |
| 2086 */ | |
| 2087 typedef enum { | |
| 2088 _PRIPCSem, /* semaphores */ | |
| 2089 _PRIPCShm /* shared memory segments */ | |
| 2090 } _PRIPCType; | |
| 2091 | |
| 2092 /* | |
| 2093 * Make a native IPC name from an NSPR IPC name. | |
| 2094 */ | |
| 2095 extern PRStatus _PR_MakeNativeIPCName( | |
| 2096 const char *name, /* NSPR IPC name */ | |
| 2097 char *result, /* result buffer */ | |
| 2098 PRIntn size, /* size of result buffer */ | |
| 2099 _PRIPCType type /* type of IPC object */ | |
| 2100 ); | |
| 2101 | |
| 2102 /* Socket call error code */ | |
| 2103 | |
| 2104 NSPR_API(PRInt32) _PR_MD_GET_SOCKET_ERROR(void); | |
| 2105 #define _PR_MD_GET_SOCKET_ERROR _MD_GET_SOCKET_ERROR | |
| 2106 | |
| 2107 /* Get name of current host */ | |
| 2108 extern PRStatus _PR_MD_GETHOSTNAME(char *name, PRUint32 namelen); | |
| 2109 #define _PR_MD_GETHOSTNAME _MD_GETHOSTNAME | |
| 2110 | |
| 2111 extern PRStatus _PR_MD_GETSYSINFO(PRSysInfo cmd, char *name, PRUint32 namelen); | |
| 2112 #define _PR_MD_GETSYSINFO _MD_GETSYSINFO | |
| 2113 | |
| 2114 /* File descriptor inheritance */ | |
| 2115 | |
| 2116 /* | |
| 2117 * If fd->secret->inheritable is _PR_TRI_UNKNOWN and we need to | |
| 2118 * know the inheritable attribute of the fd, call this function | |
| 2119 * to find that out. This typically requires a system call. | |
| 2120 */ | |
| 2121 extern void _PR_MD_QUERY_FD_INHERITABLE(PRFileDesc *fd); | |
| 2122 #define _PR_MD_QUERY_FD_INHERITABLE _MD_QUERY_FD_INHERITABLE | |
| 2123 | |
| 2124 /* --- PR_GetRandomNoise() related things --- */ | |
| 2125 | |
| 2126 extern PRSize _PR_MD_GetRandomNoise( void *buf, PRSize size ); | |
| 2127 #define _PR_MD_GET_RANDOM_NOISE(buf,size) _PR_MD_GetRandomNoise((buf),(size)) | |
| 2128 extern PRSize _pr_CopyLowBits( void *dest, PRSize dstlen, void *src, PRSize srcl
en ); | |
| 2129 | |
| 2130 /* end PR_GetRandomNoise() related */ | |
| 2131 | |
| 2132 #ifdef XP_BEOS | |
| 2133 | |
| 2134 extern PRLock *_connectLock; | |
| 2135 | |
| 2136 typedef struct _ConnectListNode { | |
| 2137 PRInt32 osfd; | |
| 2138 PRNetAddr addr; | |
| 2139 PRUint32 addrlen; | |
| 2140 PRIntervalTime timeout; | |
| 2141 } ConnectListNode; | |
| 2142 | |
| 2143 extern ConnectListNode connectList[64]; | |
| 2144 | |
| 2145 extern PRUint32 connectCount; | |
| 2146 | |
| 2147 #endif /* XP_BEOS */ | |
| 2148 | |
| 2149 PR_END_EXTERN_C | |
| 2150 | |
| 2151 #endif /* primpl_h___ */ | |
| OLD | NEW |