os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/generic/tclThread.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/* 
sl@0
     2
 * tclThread.c --
sl@0
     3
 *
sl@0
     4
 *	This file implements   Platform independent thread operations.
sl@0
     5
 *	Most of the real work is done in the platform dependent files.
sl@0
     6
 *
sl@0
     7
 * Copyright (c) 1998 by Sun Microsystems, Inc.
sl@0
     8
 * Portions Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiaries. All rights reserved.  
sl@0
     9
 *
sl@0
    10
 * See the file "license.terms" for information on usage and redistribution
sl@0
    11
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
sl@0
    12
 *
sl@0
    13
 * RCS: @(#) $Id: tclThread.c,v 1.6.2.1 2004/05/06 01:02:59 davygrvy Exp $
sl@0
    14
 */
sl@0
    15
sl@0
    16
#include "tclInt.h"
sl@0
    17
#if defined(__SYMBIAN32__) 
sl@0
    18
#include "tclSymbianGlobals.h"
sl@0
    19
#endif 
sl@0
    20
sl@0
    21
/*
sl@0
    22
 * There are three classes of synchronization objects:
sl@0
    23
 * mutexes, thread data keys, and condition variables.
sl@0
    24
 * The following are used to record the memory used for these
sl@0
    25
 * objects so they can be finalized.
sl@0
    26
 *
sl@0
    27
 * These statics are guarded by the mutex in the caller of
sl@0
    28
 * TclRememberThreadData, e.g., TclpThreadDataKeyInit
sl@0
    29
 */
sl@0
    30
sl@0
    31
#ifndef __SYMBIAN32__ 
sl@0
    32
typedef struct {
sl@0
    33
    int num;		/* Number of objects remembered */
sl@0
    34
    int max;		/* Max size of the array */
sl@0
    35
    char **list;	/* List of pointers */
sl@0
    36
} SyncObjRecord;
sl@0
    37
#endif
sl@0
    38
#if !defined(__SYMBIAN32__) || !defined(__WINSCW__)
sl@0
    39
static SyncObjRecord keyRecord = {0, 0, NULL};
sl@0
    40
#endif
sl@0
    41
static SyncObjRecord mutexRecord = {0, 0, NULL};
sl@0
    42
static SyncObjRecord condRecord = {0, 0, NULL};
sl@0
    43
sl@0
    44
/*
sl@0
    45
 * Prototypes of functions used only in this file
sl@0
    46
 */
sl@0
    47
 
sl@0
    48
static void		RememberSyncObject _ANSI_ARGS_((char *objPtr,
sl@0
    49
			    SyncObjRecord *recPtr));
sl@0
    50
static void		ForgetSyncObject _ANSI_ARGS_((char *objPtr,
sl@0
    51
			    SyncObjRecord *recPtr));
sl@0
    52
sl@0
    53
/* 
sl@0
    54
 * Several functions are #defined to nothing in tcl.h if TCL_THREADS is not
sl@0
    55
 * specified.  Here we undo that so the procedures are defined in the
sl@0
    56
 * stubs table.
sl@0
    57
 */
sl@0
    58
#ifndef TCL_THREADS
sl@0
    59
#undef Tcl_MutexLock
sl@0
    60
#undef Tcl_MutexUnlock
sl@0
    61
#undef Tcl_MutexFinalize
sl@0
    62
#undef Tcl_ConditionNotify
sl@0
    63
#undef Tcl_ConditionWait
sl@0
    64
#undef Tcl_ConditionFinalize
sl@0
    65
#endif
sl@0
    66
sl@0
    67

sl@0
    68
/*
sl@0
    69
 *----------------------------------------------------------------------
sl@0
    70
 *
sl@0
    71
 * Tcl_GetThreadData --
sl@0
    72
 *
sl@0
    73
 *	This procedure allocates and initializes a chunk of thread
sl@0
    74
 *	local storage.
sl@0
    75
 *
sl@0
    76
 * Results:
sl@0
    77
 *	A thread-specific pointer to the data structure.
sl@0
    78
 *
sl@0
    79
 * Side effects:
sl@0
    80
 *	Will allocate memory the first time this thread calls for
sl@0
    81
 *	this chunk of storage.
sl@0
    82
 *
sl@0
    83
 *----------------------------------------------------------------------
sl@0
    84
 */
sl@0
    85
sl@0
    86
EXPORT_C VOID *
sl@0
    87
Tcl_GetThreadData(keyPtr, size)
sl@0
    88
    Tcl_ThreadDataKey *keyPtr;	/* Identifier for the data chunk */
sl@0
    89
    int size;			/* Size of storage block */
sl@0
    90
{
sl@0
    91
    VOID *result;
sl@0
    92
#ifdef TCL_THREADS
sl@0
    93
sl@0
    94
    /*
sl@0
    95
     * See if this is the first thread to init this key.
sl@0
    96
     */
sl@0
    97
sl@0
    98
    if (*keyPtr == NULL) {
sl@0
    99
	TclpThreadDataKeyInit(keyPtr);
sl@0
   100
    }
sl@0
   101
sl@0
   102
    /*
sl@0
   103
     * Initialize the key for this thread.
sl@0
   104
     */
sl@0
   105
sl@0
   106
    result = TclpThreadDataKeyGet(keyPtr);
sl@0
   107
    if (result == NULL) {
sl@0
   108
	result  = (VOID *)ckalloc((size_t)size);
sl@0
   109
	memset(result, 0, (size_t)size);
sl@0
   110
	TclpThreadDataKeySet(keyPtr, result);
sl@0
   111
    }
sl@0
   112
#else
sl@0
   113
    if (*keyPtr == NULL) {
sl@0
   114
	result = (VOID *)ckalloc((size_t)size);
sl@0
   115
	memset((char *)result, 0, (size_t)size);
sl@0
   116
	*keyPtr = (Tcl_ThreadDataKey)result;
sl@0
   117
	TclRememberDataKey(keyPtr);
sl@0
   118
    }
sl@0
   119
    result = *(VOID **)keyPtr;
sl@0
   120
#endif
sl@0
   121
    return result;
sl@0
   122
}
sl@0
   123

sl@0
   124
/*
sl@0
   125
 *----------------------------------------------------------------------
sl@0
   126
 *
sl@0
   127
 * TclThreadDataKeyGet --
sl@0
   128
 *
sl@0
   129
 *	This procedure returns a pointer to a block of thread local storage.
sl@0
   130
 *
sl@0
   131
 * Results:
sl@0
   132
 *	A thread-specific pointer to the data structure, or NULL
sl@0
   133
 *	if the memory has not been assigned to this key for this thread.
sl@0
   134
 *
sl@0
   135
 * Side effects:
sl@0
   136
 *	None.
sl@0
   137
 *
sl@0
   138
 *----------------------------------------------------------------------
sl@0
   139
 */
sl@0
   140
sl@0
   141
VOID *
sl@0
   142
TclThreadDataKeyGet(keyPtr)
sl@0
   143
    Tcl_ThreadDataKey *keyPtr;	/* Identifier for the data chunk,
sl@0
   144
				 * really (pthread_key_t **) */
sl@0
   145
{
sl@0
   146
#ifdef TCL_THREADS
sl@0
   147
    return (VOID *)TclpThreadDataKeyGet(keyPtr);
sl@0
   148
#else
sl@0
   149
    char *result = *(char **)keyPtr;
sl@0
   150
    return (VOID *)result;
sl@0
   151
#endif /* TCL_THREADS */
sl@0
   152
}
sl@0
   153
sl@0
   154

sl@0
   155
/*
sl@0
   156
 *----------------------------------------------------------------------
sl@0
   157
 *
sl@0
   158
 * TclThreadDataKeySet --
sl@0
   159
 *
sl@0
   160
 *	This procedure sets a thread local storage pointer.
sl@0
   161
 *
sl@0
   162
 * Results:
sl@0
   163
 *	None.
sl@0
   164
 *
sl@0
   165
 * Side effects:
sl@0
   166
 *	The assigned value will be returned by TclpThreadDataKeyGet.
sl@0
   167
 *
sl@0
   168
 *----------------------------------------------------------------------
sl@0
   169
 */
sl@0
   170
sl@0
   171
void
sl@0
   172
TclThreadDataKeySet(keyPtr, data)
sl@0
   173
    Tcl_ThreadDataKey *keyPtr;	/* Identifier for the data chunk,
sl@0
   174
				 * really (pthread_key_t **) */
sl@0
   175
    VOID *data;			/* Thread local storage */
sl@0
   176
{
sl@0
   177
#ifdef TCL_THREADS
sl@0
   178
    if (*keyPtr == NULL) {
sl@0
   179
	TclpThreadDataKeyInit(keyPtr);
sl@0
   180
    }
sl@0
   181
    TclpThreadDataKeySet(keyPtr, data);
sl@0
   182
#else
sl@0
   183
    *keyPtr = (Tcl_ThreadDataKey)data;
sl@0
   184
#endif /* TCL_THREADS */
sl@0
   185
}
sl@0
   186
sl@0
   187
sl@0
   188

sl@0
   189
/*
sl@0
   190
 *----------------------------------------------------------------------
sl@0
   191
 *
sl@0
   192
 * RememberSyncObject
sl@0
   193
 *
sl@0
   194
 *      Keep a list of (mutexes/condition variable/data key)
sl@0
   195
 *	used during finalization.
sl@0
   196
 *
sl@0
   197
 * Results:
sl@0
   198
 *	None.
sl@0
   199
 *
sl@0
   200
 * Side effects:
sl@0
   201
 *	Add to the appropriate list.
sl@0
   202
 *
sl@0
   203
 *----------------------------------------------------------------------
sl@0
   204
 */
sl@0
   205
sl@0
   206
static void
sl@0
   207
RememberSyncObject(objPtr, recPtr)
sl@0
   208
    char *objPtr;		/* Pointer to sync object */
sl@0
   209
    SyncObjRecord *recPtr;	/* Record of sync objects */
sl@0
   210
{
sl@0
   211
    char **newList;
sl@0
   212
    int i, j;
sl@0
   213
sl@0
   214
    /*
sl@0
   215
     * Save the pointer to the allocated object so it can be finalized.
sl@0
   216
     * Grow the list of pointers if necessary, copying only non-NULL
sl@0
   217
     * pointers to the new list.
sl@0
   218
     */
sl@0
   219
sl@0
   220
    if (recPtr->num >= recPtr->max) {
sl@0
   221
	recPtr->max += 8;
sl@0
   222
	newList = (char **)ckalloc(recPtr->max * sizeof(char *));
sl@0
   223
	for (i=0,j=0 ; i<recPtr->num ; i++) {
sl@0
   224
            if (recPtr->list[i] != NULL) {
sl@0
   225
		newList[j++] = recPtr->list[i];
sl@0
   226
            }
sl@0
   227
	}
sl@0
   228
	if (recPtr->list != NULL) {
sl@0
   229
	    ckfree((char *)recPtr->list);
sl@0
   230
	}
sl@0
   231
	recPtr->list = newList;
sl@0
   232
	recPtr->num = j;
sl@0
   233
    }
sl@0
   234
    recPtr->list[recPtr->num] = objPtr;
sl@0
   235
    recPtr->num++;
sl@0
   236
}
sl@0
   237

sl@0
   238
/*
sl@0
   239
 *----------------------------------------------------------------------
sl@0
   240
 *
sl@0
   241
 * ForgetSyncObject
sl@0
   242
 *
sl@0
   243
 *      Remove a single object from the list.
sl@0
   244
 *
sl@0
   245
 * Results:
sl@0
   246
 *	None.
sl@0
   247
 *
sl@0
   248
 * Side effects:
sl@0
   249
 *	Remove from the appropriate list.
sl@0
   250
 *
sl@0
   251
 *----------------------------------------------------------------------
sl@0
   252
 */
sl@0
   253
sl@0
   254
static void
sl@0
   255
ForgetSyncObject(objPtr, recPtr)
sl@0
   256
    char *objPtr;		/* Pointer to sync object */
sl@0
   257
    SyncObjRecord *recPtr;	/* Record of sync objects */
sl@0
   258
{
sl@0
   259
    int i;
sl@0
   260
sl@0
   261
    for (i=0 ; i<recPtr->num ; i++) {
sl@0
   262
	if (objPtr == recPtr->list[i]) {
sl@0
   263
	    recPtr->list[i] = NULL;
sl@0
   264
	    return;
sl@0
   265
	}
sl@0
   266
    }
sl@0
   267
}
sl@0
   268

sl@0
   269
/*
sl@0
   270
 *----------------------------------------------------------------------
sl@0
   271
 *
sl@0
   272
 * TclRememberMutex
sl@0
   273
 *
sl@0
   274
 *      Keep a list of mutexes used during finalization.
sl@0
   275
 *
sl@0
   276
 * Results:
sl@0
   277
 *	None.
sl@0
   278
 *
sl@0
   279
 * Side effects:
sl@0
   280
 *	Add to the mutex list.
sl@0
   281
 *
sl@0
   282
 *----------------------------------------------------------------------
sl@0
   283
 */
sl@0
   284
sl@0
   285
void
sl@0
   286
TclRememberMutex(mutexPtr)
sl@0
   287
    Tcl_Mutex *mutexPtr;
sl@0
   288
{
sl@0
   289
    RememberSyncObject((char *)mutexPtr, &mutexRecord);
sl@0
   290
}
sl@0
   291

sl@0
   292
/*
sl@0
   293
 *----------------------------------------------------------------------
sl@0
   294
 *
sl@0
   295
 * Tcl_MutexFinalize
sl@0
   296
 *
sl@0
   297
 *      Finalize a single mutex and remove it from the
sl@0
   298
 *	list of remembered objects.
sl@0
   299
 *
sl@0
   300
 * Results:
sl@0
   301
 *	None.
sl@0
   302
 *
sl@0
   303
 * Side effects:
sl@0
   304
 *	Remove the mutex from the list.
sl@0
   305
 *
sl@0
   306
 *----------------------------------------------------------------------
sl@0
   307
 */
sl@0
   308
sl@0
   309
EXPORT_C void
sl@0
   310
Tcl_MutexFinalize(mutexPtr)
sl@0
   311
    Tcl_Mutex *mutexPtr;
sl@0
   312
{
sl@0
   313
#ifdef TCL_THREADS
sl@0
   314
    TclpFinalizeMutex(mutexPtr);
sl@0
   315
#endif
sl@0
   316
    ForgetSyncObject((char *)mutexPtr, &mutexRecord);
sl@0
   317
}
sl@0
   318

sl@0
   319
/*
sl@0
   320
 *----------------------------------------------------------------------
sl@0
   321
 *
sl@0
   322
 * TclRememberDataKey
sl@0
   323
 *
sl@0
   324
 *      Keep a list of thread data keys used during finalization.
sl@0
   325
 *
sl@0
   326
 * Results:
sl@0
   327
 *	None.
sl@0
   328
 *
sl@0
   329
 * Side effects:
sl@0
   330
 *	Add to the key list.
sl@0
   331
 *
sl@0
   332
 *----------------------------------------------------------------------
sl@0
   333
 */
sl@0
   334
sl@0
   335
void
sl@0
   336
TclRememberDataKey(keyPtr)
sl@0
   337
    Tcl_ThreadDataKey *keyPtr;
sl@0
   338
{
sl@0
   339
    RememberSyncObject((char *)keyPtr, &keyRecord);
sl@0
   340
}
sl@0
   341

sl@0
   342
/*
sl@0
   343
 *----------------------------------------------------------------------
sl@0
   344
 *
sl@0
   345
 * TclRememberCondition
sl@0
   346
 *
sl@0
   347
 *      Keep a list of condition variables used during finalization.
sl@0
   348
 *
sl@0
   349
 * Results:
sl@0
   350
 *	None.
sl@0
   351
 *
sl@0
   352
 * Side effects:
sl@0
   353
 *	Add to the condition variable list.
sl@0
   354
 *
sl@0
   355
 *----------------------------------------------------------------------
sl@0
   356
 */
sl@0
   357
sl@0
   358
void
sl@0
   359
TclRememberCondition(condPtr)
sl@0
   360
    Tcl_Condition *condPtr;
sl@0
   361
{
sl@0
   362
    RememberSyncObject((char *)condPtr, &condRecord);
sl@0
   363
}
sl@0
   364

sl@0
   365
/*
sl@0
   366
 *----------------------------------------------------------------------
sl@0
   367
 *
sl@0
   368
 * Tcl_ConditionFinalize
sl@0
   369
 *
sl@0
   370
 *      Finalize a single condition variable and remove it from the
sl@0
   371
 *	list of remembered objects.
sl@0
   372
 *
sl@0
   373
 * Results:
sl@0
   374
 *	None.
sl@0
   375
 *
sl@0
   376
 * Side effects:
sl@0
   377
 *	Remove the condition variable from the list.
sl@0
   378
 *
sl@0
   379
 *----------------------------------------------------------------------
sl@0
   380
 */
sl@0
   381
sl@0
   382
EXPORT_C void
sl@0
   383
Tcl_ConditionFinalize(condPtr)
sl@0
   384
    Tcl_Condition *condPtr;
sl@0
   385
{
sl@0
   386
#ifdef TCL_THREADS
sl@0
   387
    TclpFinalizeCondition(condPtr);
sl@0
   388
#endif
sl@0
   389
    ForgetSyncObject((char *)condPtr, &condRecord);
sl@0
   390
}
sl@0
   391

sl@0
   392
/*
sl@0
   393
 *----------------------------------------------------------------------
sl@0
   394
 *
sl@0
   395
 * TclFinalizeThreadData --
sl@0
   396
 *
sl@0
   397
 *	This procedure cleans up the thread-local storage.  This is
sl@0
   398
 *	called once for each thread.
sl@0
   399
 *
sl@0
   400
 * Results:
sl@0
   401
 *	None.
sl@0
   402
 *
sl@0
   403
 * Side effects:
sl@0
   404
 *	Frees up all thread local storage.
sl@0
   405
 *
sl@0
   406
 *----------------------------------------------------------------------
sl@0
   407
 */
sl@0
   408
sl@0
   409
void
sl@0
   410
TclFinalizeThreadData()
sl@0
   411
{
sl@0
   412
    int i;
sl@0
   413
    Tcl_ThreadDataKey *keyPtr;
sl@0
   414
sl@0
   415
    TclpMasterLock();
sl@0
   416
    for (i=0 ; i<keyRecord.num ; i++) {
sl@0
   417
	keyPtr = (Tcl_ThreadDataKey *) keyRecord.list[i];
sl@0
   418
#ifdef TCL_THREADS
sl@0
   419
	TclpFinalizeThreadData(keyPtr);
sl@0
   420
#else
sl@0
   421
	if (*keyPtr != NULL) {
sl@0
   422
	    ckfree((char *)*keyPtr);
sl@0
   423
	    *keyPtr = NULL;
sl@0
   424
	}
sl@0
   425
#endif
sl@0
   426
    }
sl@0
   427
    TclpMasterUnlock();
sl@0
   428
}
sl@0
   429

sl@0
   430
/*
sl@0
   431
 *----------------------------------------------------------------------
sl@0
   432
 *
sl@0
   433
 * TclFinalizeSynchronization --
sl@0
   434
 *
sl@0
   435
 *      This procedure cleans up all synchronization objects:
sl@0
   436
 *      mutexes, condition variables, and thread-local storage.
sl@0
   437
 *
sl@0
   438
 * Results:
sl@0
   439
 *	None.
sl@0
   440
 *
sl@0
   441
 * Side effects:
sl@0
   442
 *	Frees up the memory.
sl@0
   443
 *
sl@0
   444
 *----------------------------------------------------------------------
sl@0
   445
 */
sl@0
   446
sl@0
   447
void
sl@0
   448
TclFinalizeSynchronization()
sl@0
   449
{
sl@0
   450
#ifdef TCL_THREADS
sl@0
   451
    Tcl_ThreadDataKey *keyPtr;
sl@0
   452
    Tcl_Mutex *mutexPtr;
sl@0
   453
    Tcl_Condition *condPtr;
sl@0
   454
    int i;
sl@0
   455
sl@0
   456
    TclpMasterLock();
sl@0
   457
    for (i=0 ; i<keyRecord.num ; i++) {
sl@0
   458
	keyPtr = (Tcl_ThreadDataKey *)keyRecord.list[i];
sl@0
   459
	TclpFinalizeThreadDataKey(keyPtr);
sl@0
   460
    }
sl@0
   461
    if (keyRecord.list != NULL) {
sl@0
   462
	ckfree((char *)keyRecord.list);
sl@0
   463
	keyRecord.list = NULL;
sl@0
   464
    }
sl@0
   465
    keyRecord.max = 0;
sl@0
   466
    keyRecord.num = 0;
sl@0
   467
sl@0
   468
    for (i=0 ; i<mutexRecord.num ; i++) {
sl@0
   469
	mutexPtr = (Tcl_Mutex *)mutexRecord.list[i];
sl@0
   470
	if (mutexPtr != NULL) {
sl@0
   471
	    TclpFinalizeMutex(mutexPtr);
sl@0
   472
	}
sl@0
   473
    }
sl@0
   474
    if (mutexRecord.list != NULL) {
sl@0
   475
	ckfree((char *)mutexRecord.list);
sl@0
   476
	mutexRecord.list = NULL;
sl@0
   477
    }
sl@0
   478
    mutexRecord.max = 0;
sl@0
   479
    mutexRecord.num = 0;
sl@0
   480
sl@0
   481
    for (i=0 ; i<condRecord.num ; i++) {
sl@0
   482
	condPtr = (Tcl_Condition *)condRecord.list[i];
sl@0
   483
	if (condPtr != NULL) {
sl@0
   484
	    TclpFinalizeCondition(condPtr);
sl@0
   485
	}
sl@0
   486
    }
sl@0
   487
    if (condRecord.list != NULL) {
sl@0
   488
	ckfree((char *)condRecord.list);
sl@0
   489
	condRecord.list = NULL;
sl@0
   490
    }
sl@0
   491
    condRecord.max = 0;
sl@0
   492
    condRecord.num = 0;
sl@0
   493
sl@0
   494
    TclpMasterUnlock();
sl@0
   495
#else
sl@0
   496
    if (keyRecord.list != NULL) {
sl@0
   497
	ckfree((char *)keyRecord.list);
sl@0
   498
	keyRecord.list = NULL;
sl@0
   499
    }
sl@0
   500
    keyRecord.max = 0;
sl@0
   501
    keyRecord.num = 0;
sl@0
   502
#endif
sl@0
   503
}
sl@0
   504
sl@0
   505

sl@0
   506
/*
sl@0
   507
 *----------------------------------------------------------------------
sl@0
   508
 *
sl@0
   509
 * Tcl_ExitThread --
sl@0
   510
 *
sl@0
   511
 *	This procedure is called to terminate the current thread.
sl@0
   512
 *	This should be used by extensions that create threads with
sl@0
   513
 *	additional interpreters in them.
sl@0
   514
 *
sl@0
   515
 * Results:
sl@0
   516
 *	None.
sl@0
   517
 *
sl@0
   518
 * Side effects:
sl@0
   519
 *	All thread exit handlers are invoked, then the thread dies.
sl@0
   520
 *
sl@0
   521
 *----------------------------------------------------------------------
sl@0
   522
 */
sl@0
   523
sl@0
   524
EXPORT_C void
sl@0
   525
Tcl_ExitThread(status)
sl@0
   526
    int status;
sl@0
   527
{
sl@0
   528
    Tcl_FinalizeThread();
sl@0
   529
#ifdef TCL_THREADS
sl@0
   530
    TclpThreadExit(status);
sl@0
   531
#endif
sl@0
   532
}
sl@0
   533
sl@0
   534
#ifndef TCL_THREADS
sl@0
   535

sl@0
   536
/*
sl@0
   537
 *----------------------------------------------------------------------
sl@0
   538
 *
sl@0
   539
 * Tcl_ConditionWait, et al. --
sl@0
   540
 *
sl@0
   541
 *	These noop procedures are provided so the stub table does
sl@0
   542
 *	not have to be conditionalized for threads.  The real
sl@0
   543
 *	implementations of these functions live in the platform
sl@0
   544
 *	specific files.
sl@0
   545
 *
sl@0
   546
 * Results:
sl@0
   547
 *	None.
sl@0
   548
 *
sl@0
   549
 * Side effects:
sl@0
   550
 *	None.
sl@0
   551
 *
sl@0
   552
 *----------------------------------------------------------------------
sl@0
   553
 */
sl@0
   554
sl@0
   555
#undef Tcl_ConditionWait
sl@0
   556
EXPORT_C void
sl@0
   557
Tcl_ConditionWait(condPtr, mutexPtr, timePtr)
sl@0
   558
    Tcl_Condition *condPtr;	/* Really (pthread_cond_t **) */
sl@0
   559
    Tcl_Mutex *mutexPtr;	/* Really (pthread_mutex_t **) */
sl@0
   560
    Tcl_Time *timePtr;		/* Timeout on waiting period */
sl@0
   561
{
sl@0
   562
}
sl@0
   563
sl@0
   564
#undef Tcl_ConditionNotify
sl@0
   565
EXPORT_C void
sl@0
   566
Tcl_ConditionNotify(condPtr)
sl@0
   567
    Tcl_Condition *condPtr;
sl@0
   568
{
sl@0
   569
}
sl@0
   570
sl@0
   571
#undef Tcl_MutexLock
sl@0
   572
EXPORT_C void
sl@0
   573
Tcl_MutexLock(mutexPtr)
sl@0
   574
    Tcl_Mutex *mutexPtr;
sl@0
   575
{
sl@0
   576
}
sl@0
   577
sl@0
   578
#undef Tcl_MutexUnlock
sl@0
   579
EXPORT_C void
sl@0
   580
Tcl_MutexUnlock(mutexPtr)
sl@0
   581
    Tcl_Mutex *mutexPtr;
sl@0
   582
{
sl@0
   583
}
sl@0
   584
#endif