rbb 99/05/17 06:11:52
Modified: docs time.txt apr configure.in apr/locks/unix crossproc.c intraproc.c locks.c locks.h apr/test Makefile.in apr/threadproc/unix thread.c Added: apr/test testthread.c Log: Test program for locks and threads. Definately not a comprehensive test, but a good start. This also fixes some major bugs in the locking and thread code. Revision Changes Path 1.3 +145 -13 apache-apr/docs/time.txt Index: time.txt =================================================================== RCS file: /home/cvs/apache-apr/docs/time.txt,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- time.txt 1999/05/10 14:36:18 1.2 +++ time.txt 1999/05/17 13:11:47 1.3 @@ -5,29 +5,161 @@ am using seconds instead of milliseconds, because HTTP says we only need second granularity, if this is not granular enough, it is easy to change later. - APRStatus ap_current_time(APRTime *) + + ap_time_t *ap_make_time(ap_context_t *) + Make a variable to store time. + Arguments: + arg 1) Context to operate on. + return) The new time structure. + + ap_statu_t *ap_current_time(ap_context_t *, ap_time_t *) Returns the number of seconds since the epoch. define the epoch as midnight January 1, 1970, UTC. + Arguments: + arg 1) The context to operate on + arg 2) The time strcuture to store the time to. + return) current time on local machine. NULL on error. + + ap_status_t ap_explode_time(ap_context_t *, ap_time_t *, ap_timetype_e); + Convert ap_time_t value into an expanded time format. + Arguments: + arg 1) The context to operate on. + arg 2) The time to convert. + arg 3) The function to use to convert the time. + return) APR_SUCCESS or APR_FAILURE. + + ap_int32_t ap_get_sec(ap_context_t *, ap_time_t *) + Get the number of seconds into the minute [0,61] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of seconds. +NOTE: ap_explode time MUST be called before this. + + ap_int32_t ap_get_min(ap_context_t *, ap_time_t *) + Get the number of minutes into the hour [0,59] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of minute. +NOTE: ap_explode time MUST be called before this. + + ap_int32_t ap_get_hour(ap_context_t *, ap_time_t *) + Get the number of hours into the day [0,23] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of hours. +NOTE: ap_explode time MUST be called before this. + + ap_int32_t ap_get_mday(ap_context_t *, ap_time_t *) + Get the number of days into the month [1,31] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of days. +NOTE: ap_explode time MUST be called before this. + + ap_int32_t ap_get_mon(ap_context_t *, ap_time_t *) + Get the number of months into the year [0,11] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of monthss. +NOTE: ap_explode time MUST be called before this. + + ap_int32_t ap_get_year(ap_context_t *, ap_time_t *) + Get the number of years since 1900 + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of years. +NOTE: ap_explode time MUST be called before this. + + ap_int32_t ap_get_wday(ap_context_t *, ap_time_t *) + Get the number of days since Sunday [0, 6] Arguments: - arg 1) current time on local machine. - APRStatus ap_implode_time(const APRExplodedTime *, APRTime) + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of days. +NOTE: ap_explode time MUST be called before this. + + void ap_set_sec(ap_context_t *, ap_time_t *, ap_int32_t) + Set the number of seconds into the minute [0,61] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of seconds. +NOTE: ap_explode time MUST be called before this. + + void ap_set_min(ap_context_t *, ap_time_t *, ap_int32_t) + Set the number of minutes into the hour [0,59] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of minute. +NOTE: ap_explode time MUST be called before this. + + void ap_set_hour(ap_context_t *, ap_time_t *, ap_int32_t) + Set the number of hours into the day [0,23] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of hours. +NOTE: ap_explode time MUST be called before this. + + void ap_set_mday(ap_context_t *, ap_time_t *, ap_int32_t) + Set the number of days into the month [1,31] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of days. +NOTE: ap_explode time MUST be called before this. + + void ap_set_mon(ap_context_t *, ap_time_t *, ap_int32_t) + Set the number of months into the year [0,11] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of monthss. +NOTE: ap_explode time MUST be called before this. + + void ap_set_year(ap_context_t *, ap_time_t *, ap_int32_t) + Set the number of years since 1900 + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of years. +NOTE: ap_explode time MUST be called before this. + + void ap_set_wday(ap_context_t *, ap_time_t *, ap_int32_t) + Set the number of days since Sunday [0, 6] + Arguments: + arg 1) The context to operate on. + arg 2) The The time value. + return) The number of days. +NOTE: ap_explode time MUST be called before this. + + ap_int64_t ap_get_curtime(ap_context_t *, ap_time_t *) + Get the number of seconds since Jan 1 1970 (UTC) + Arguments: + arg 1) context to operate on + arg 2) variable time is stored in. + return) Number of seconds since epoch. + + ap_status_t ap_implode_time(ap_context_t *, ap_time_t *) Convert exploded time format into an APRTime value. Arguments: - arg 1) Time to convert in Exploded format - arg 2) converted time as seconds since epoch + arg 1) context to operate on + arg 2) abstracted time structure. + return) APR_SUCCESS or APR_FAILURE + APRStatus ap_format_time(char *, APRUInt32, char *, APRExplodedTime, APRUInt32); Format time into a buffer. Arguments: arg 1) Buffer to store string into arg 2) size of buffer. Truncate if buffer not long enough - arg 3) format to convert to. Use strftime formats (see posix - reference above) + arg 3) format to convert to. Use strftime format arg 4) Time variable to convert arg 5) number of bytes of buffer used. - APRStatus ap_explode_time(APRTime, APRTimePARAMFN, APRExplodedTime); - Convert APRTime vlaue into an expanded time format. - Arguments: - arg 1) number of seconds since the epoch to convert to Expanded time - arg 2) Time parameter function of the specified time zone. - arg 3) structure to store expanded time into 1.11 +1 -0 apache-apr/apr/configure.in Index: configure.in =================================================================== RCS file: /home/cvs/apache-apr/apr/configure.in,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- configure.in 1999/05/16 13:29:13 1.10 +++ configure.in 1999/05/17 13:11:48 1.11 @@ -22,6 +22,7 @@ if (echo "$SYS_SW" | grep -qi 'Linux'); then SYS_KV=`echo $SYS_REL | awk -F. '{printf "%s%s", $1, $2}'` LDLIBS="$LDLIBS -ldl" + CFLAGS="$CFLAGS -DUSE_PTHREAD_SERIALIZE -DUSE_FCNTL_SERIALIZE" PLATFORM="-DLINUX=$SYS_KV" OSDIR="unix" case "$SYS_KV" in 1.2 +38 -35 apache-apr/apr/locks/unix/crossproc.c Index: crossproc.c =================================================================== RCS file: /home/cvs/apache-apr/apr/locks/unix/crossproc.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- crossproc.c 1999/05/10 17:57:53 1.1 +++ crossproc.c 1999/05/17 13:11:49 1.2 @@ -56,9 +56,12 @@ #include "apr_lock.h" #include "apr_general.h" #include "locks.h" +#include <fcntlbits.h> +#include <unistd.h> +#include <sys/mman.h> #if defined (USE_SYSVSEM_SERIALIZE) -ap_status_t lock_cleanup(ap_lock_t *lock) +ap_status_t lock_cleanup(struct lock_t *lock) { union semun ick; if (lock->curr_locked == 1) { @@ -68,7 +71,7 @@ return APR_SUCCESS; } -ap_status_t create_inter_lock(ap_context_t *cont, ap_lock_t *new) +ap_status_t create_inter_lock(ap_context_t *cont, struct lock_t *new) { union semun ick; struct semid_ds buf; @@ -76,12 +79,12 @@ new->interproc = semget(IPC_PRIVATE, 1, IPC_CREATE | 0600); if (new->interproc < 0) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } ick.val = 1; if (senctl(new->interproc, 0, SETVAL, ick) < 0) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } /* pre-initialize these */ @@ -97,7 +100,7 @@ return APR_SUCCESS; } -ap_status_t lock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t lock_inter(ap_context_t *cont, struct lock_t *lock) { new->curr_locked == 1; if (semop(lock->interproc, &lock->op_on, 1) < 0) { @@ -106,7 +109,7 @@ return APR_SUCCESS; } -ap_status_t unlock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t unlock_inter(ap_context_t *cont, struct lock_t *lock) { if (semop(lock->interproc, &lock->op_off, 1) < 0) { return(APR_FAILURE); @@ -115,7 +118,7 @@ return APR_SUCCESS; } -ap_status_t destroy_inter_lock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t destroy_inter_lock(ap_context_t *cont, struct lock_t *lock) { if (lock_cleanup(lock) == APR_SUCCESS) { ap_kill_cleanup(cont->pool, lock, lock_cleanup); @@ -123,25 +126,25 @@ } return APR_FAILURE; } -#elif defined (USE_PTHREAD_SERIALIZE) +#elif defined (USE_PROC_PTHREAD_SERIALIZE) -ap_status_t lock_cleanup(ap_lock_t *lock) +ap_status_t lock_cleanup(struct lock_t *lock) { if (lock->curr_locked == 1) { if (pthread_mutex_unlock(lock->interproc)) { return APR_FAILURE; } - if (munmap((caddr_t)lock->interproc, sizeof(pthread_mutex_t)){ + if (munmap((caddr_t)lock->interproc, sizeof(pthread_mutex_t))){ return APR_FAILURE; } } return APR_SUCCESS; } -ap_status_t create_inter_lock(ap_context_t *cont, ap_lock_t *new) +ap_status_t create_inter_lock(ap_context_t *cont, struct lock_t *new) { int fd; - pthread_mutex_attr_t mattr; + pthread_mutexattr_t mattr; fd = open("/dev/zero", O_RDWR); if (fd < 0) { @@ -156,22 +159,22 @@ } close(fd); if ((errno = pthread_mutexattr_init(&mattr))) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } if ((errno = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } if ((errno = pthread_mutex_init(new->interproc, &mattr))) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } if ((errno = pthread_mutex_destroy(&mattr))) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } @@ -180,7 +183,7 @@ return APR_SUCCESS; } -ap_status_t lock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t lock_inter(ap_context_t *cont, struct lock_t *lock) { new->curr_locked == 1; if (errno = pthread_mutex_lock(lock->interproc)) { @@ -189,7 +192,7 @@ return APR_SUCCESS; } -ap_status_t unlock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t unlock_inter(ap_context_t *cont, struct lock_t *lock) { if (errno = pthread_mutex_unlock(lock->interproc)) { return(APR_FAILURE); @@ -198,7 +201,7 @@ return APR_SUCCESS; } -ap_status_t destroy_inter_lock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t destroy_inter_lock(ap_context_t *cont, struct lock_t *lock) { if (lock_cleanup(lock) == APR_SUCCESS) { ap_kill_cleanup(cont->pool, lock, lock_cleanup); @@ -209,23 +212,23 @@ #elif defined (USE_FCNTL_SERIALIZE) -ap_status_t lock_cleanup(ap_lock_t *lock) +ap_status_t lock_cleanup(struct lock_t *lock) { if (lock->curr_locked == 1) { if (fcntl(lock->interproc, F_SETLKW, &lock->unlock_it) < 0) { return(APR_FAILURE); } - new->curr_locked == 0; + lock->curr_locked == 0; } return APR_SUCCESS; } -ap_status_t create_inter_lock(ap_context_t *cont, ap_lock_t *new) +ap_status_t create_inter_lock(ap_context_t *cont, struct lock_t *new) { - new->interproc = open(new->fname, O_CREATE | O_WRONLY | O_EXCL, 0644); + new->interproc = open(new->fname, O_CREAT | O_WRONLY | O_EXCL, 0644); if (new->interproc < 0) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } /* pre-initialize these */ @@ -246,25 +249,25 @@ return APR_SUCCESS; } -ap_status_t lock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t lock_inter(ap_context_t *cont, struct lock_t *lock) { - new->curr_locked == 1; + lock->curr_locked == 1; if (fcntl(lock->interproc, F_SETLKW, &lock->lock_it) < 0) { return(APR_FAILURE); } return APR_SUCCESS; } -ap_status_t unlock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t unlock_inter(ap_context_t *cont, struct lock_t *lock) { if (fcntl(lock->interproc, F_SETLKW, &lock->unlock_it) < 0) { return(APR_FAILURE); } - new->curr_locked == 0; + lock->curr_locked == 0; return APR_SUCCESS; } -ap_status_t destroy_inter_lock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t destroy_inter_lock(ap_context_t *cont, struct lock_t *lock) { if (lock_cleanup(lock) == APR_SUCCESS) { ap_kill_cleanup(cont->pool, lock, lock_cleanup); @@ -273,7 +276,7 @@ return APR_FAILURE; } #elif defined (USE_FLOCK_SERIALIZE) -ap_status_t lock_cleanup(ap_lock_t *lock) +ap_status_t lock_cleanup(struct lock_t *lock) { if (lock->curr_locked == 1) { if (flock(lock->interproc, LOCK_UN) < 0) { @@ -285,12 +288,12 @@ return APR_SUCCESS; } -ap_status_t create_inter_lock(ap_context_t *cont, ap_lock_t *new) +ap_status_t create_inter_lock(ap_context_t *cont, struct lock_t *new) { new->interproc = open(new->fname, O_CREAT | O_WRONLY | O_EXCL, 0600); if (new->interproc < 0) { - lock_cleanup(cont, new); + lock_cleanup(new); return APR_FAILURE; } new->curr_locked == 0; @@ -298,7 +301,7 @@ return APR_SUCCESS; } -ap_status_t lock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t lock_inter(ap_context_t *cont, struct lock_t *lock) { new->curr_locked == 1; if (flock(lock->interproc, LOCK_EX) < 0) { @@ -307,7 +310,7 @@ return APR_SUCCESS; } -ap_status_t unlock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t unlock_inter(ap_context_t *cont, struct lock_t *lock) { if (flock(lock->interproc, LOCK_UN) < 0) { return(APR_FAILURE); @@ -316,7 +319,7 @@ return APR_SUCCESS; } -ap_status_t destroy_inter_lock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t destroy_inter_lock(ap_context_t *cont, struct lock_t *lock) { if (lock_cleanup(lock) == APR_SUCCESS) { ap_kill_cleanup(cont->pool, lock, lock_cleanup); 1.2 +22 -28 apache-apr/apr/locks/unix/intraproc.c Index: intraproc.c =================================================================== RCS file: /home/cvs/apache-apr/apr/locks/unix/intraproc.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- intraproc.c 1999/05/10 17:57:53 1.1 +++ intraproc.c 1999/05/17 13:11:49 1.2 @@ -56,77 +56,71 @@ #include "apr_lock.h" #include "apr_general.h" #include "locks.h" +#include <fcntlbits.h> #if defined (USE_PTHREAD_SERIALIZE) -ap_status_t lock_cleanup(ap_lock_t *lock) +ap_status_t lock_intra_cleanup(struct lock_t *lock) { if (lock->curr_locked == 1) { - if (pthread_mutex_unlock(lock->interproc)) { + if (pthread_mutex_unlock(lock->intraproc)) { return APR_FAILURE; } } return APR_SUCCESS; } -ap_status_t create_inter_lock(ap_context_t *cont, ap_lock_t *new) +ap_status_t create_intra_lock(ap_context_t *cont, struct lock_t *new) { - int fd; - pthread_mutex_attr_t mattr; + pthread_mutexattr_t mattr; - fd = open("/dev/zero", O_RDWR); - if (fd < 0) { - return APR_FAILURE; - } - - new->interproc = (pthread_mutex_t *)ap_palloc(cont->pool, + new->intraproc = (pthread_mutex_t *)ap_palloc(cont->pool, sizeof(pthread_mutex_t)); - if (new->interproc = (void *) (caddr_t) -1) { + if (new->intraproc == NULL ) { return APR_FAILURE; } - close(fd); if ((errno = pthread_mutexattr_init(&mattr))) { - lock_cleanup(cont, new); + lock_intra_cleanup(new); return APR_FAILURE; } - if ((errno = pthread_mutex_init(new->interproc, &mattr))) { - lock_cleanup(cont, new); + if ((errno = pthread_mutex_init(new->intraproc, &mattr))) { + lock_intra_cleanup(new); return APR_FAILURE; } - if ((errno = pthread_mutex_destroy(&mattr))) { - lock_cleanup(cont, new); + if ((errno = pthread_mutex_destroy(new->intraproc))) { + lock_intra_cleanup(new); return APR_FAILURE; } new->curr_locked == 0; - ap_register_cleanup(cont->pool, (void *)new, lock_cleanup, NULL); + ap_register_cleanup(cont->pool, (void *)new, lock_intra_cleanup, NULL); return APR_SUCCESS; } -ap_status_t lock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t lock_intra(ap_context_t *cont, struct lock_t *lock) { - new->curr_locked == 1; - if (errno = pthread_mutex_lock(lock->interproc)) { + lock->curr_locked == 1; + if (errno = pthread_mutex_lock(lock->intraproc)) { return(APR_FAILURE); } return APR_SUCCESS; } -ap_status_t unlock_inter(ap_context_t *cont, ap_lock_t *lock) +ap_status_t unlock_intra(ap_context_t *cont, struct lock_t *lock) { - if (errno = pthread_mutex_unlock(lock->interproc)) { + if (errno = pthread_mutex_unlock(lock->intraproc)) { return(APR_FAILURE); } - new->curr_locked == 0; + lock->curr_locked == 0; return APR_SUCCESS; } -ap_status_t destroy_inter_lock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t destroy_intra_lock(ap_context_t *cont, struct lock_t *lock) { - if (lock_cleanup(lock) == APR_SUCCESS) { - ap_kill_cleanup(cont->pool, lock, lock_cleanup); + if (lock_intra_cleanup(lock) == APR_SUCCESS) { + ap_kill_cleanup(cont->pool, lock, lock_intra_cleanup); return APR_SUCCESS; } return APR_FAILURE; 1.2 +6 -7 apache-apr/apr/locks/unix/locks.c Index: locks.c =================================================================== RCS file: /home/cvs/apache-apr/apr/locks/unix/locks.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- locks.c 1999/05/10 17:57:53 1.1 +++ locks.c 1999/05/17 13:11:49 1.2 @@ -53,16 +53,15 @@ * */ -#include "apr_lock.h" #include "apr_general.h" #include "locks.h" #include <strings.h> -ap_lock_t *ap_create_lock(ap_context_t *cont, ap_locktype_e type, char *fname) +struct lock_t *ap_create_lock(ap_context_t *cont, ap_locktype_e type, char *fname) { - ap_lock_t *new; + struct lock_t *new; - new = (ap_lock_t *)ap_palloc(cont->pool, sizeof(ap_lock_t)); + new = (struct lock_t *)ap_palloc(cont->pool, sizeof(struct lock_t)); new->type = type; new->fname = strdup(fname); @@ -80,7 +79,7 @@ return new; } -ap_status_t ap_lock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t ap_lock(ap_context_t *cont, struct lock_t *lock) { if (lock->type != APR_CROSS_PROCESS) { if (lock_intra(cont, lock) == APR_FAILURE) { @@ -95,7 +94,7 @@ return APR_SUCCESS; } -ap_status_t ap_unlock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t ap_unlock(ap_context_t *cont, struct lock_t *lock) { if (lock->type != APR_CROSS_PROCESS) { if (unlock_intra(cont, lock) == APR_FAILURE) { @@ -110,7 +109,7 @@ return APR_SUCCESS; } -ap_status_t ap_destroy_lock(ap_context_t *cont, ap_lock_t *lock) +ap_status_t ap_destroy_lock(ap_context_t *cont, struct lock_t *lock) { if (lock->type != APR_CROSS_PROCESS) { if (destroy_intra_lock(cont, lock) == APR_FAILURE) { 1.3 +6 -1 apache-apr/apr/locks/unix/locks.h Index: locks.h =================================================================== RCS file: /home/cvs/apache-apr/apr/locks/unix/locks.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- locks.h 1999/05/12 12:01:10 1.2 +++ locks.h 1999/05/17 13:11:49 1.3 @@ -61,10 +61,13 @@ #if defined (USE_USLOCK_SERIALIZE) #include <uslocks.h> #elif defined (USE_SYSVSEM_SERIALIZE) +#include <sys/file.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #endif +#include <fcntlbits.h> +#include <stdio.h> #include <pthread.h> #ifdef NEED_UNION_SEMUN @@ -88,14 +91,16 @@ int interproc; struct flock lock_it; struct flock unlock_it; -#elif defined (USE_PTHREAD_MUTEX) +#elif defined (USE_PROC_PTHREAD_SERIALIZE) pthread_mutex_t *interproc; #elif defined (USE_FLOCK_SERIALIZE) int interproc; #else /* No Interprocess serialization. Too bad. */ #endif +#if defined (USE_PTHREAD_SERIALIZE) pthread_mutex_t *intraproc; +#endif /* At some point, we should do a type for both inter and intra process * locking here. Something like pthread_mutex with PTHREAD_PROCESS_SHARED */ 1.4 +7 -1 apache-apr/apr/test/Makefile.in Index: Makefile.in =================================================================== RCS file: /home/cvs/apache-apr/apr/test/Makefile.in,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- Makefile.in 1999/05/16 13:29:14 1.3 +++ Makefile.in 1999/05/17 13:11:51 1.4 @@ -1,3 +1,4 @@ +# Generated automatically from Makefile.in by configure. #CFLAGS=$(OPTIM) $(CFLAGS1) $(EXTRA_CFLAGS) #LIBS=$(EXTRA_LIBS) $(LIBS1) #INCLUDES=$(INCLUDES1) $(INCLUDES0) $(EXTRA_INCLUDES) @@ -6,7 +7,7 @@ CC=gcc RANLIB=ranlib CFLAGS=-DLINUX=20 -g -O2 -LDLIBS= -ldl -lm -L../network_io -lnetwork -L../threadproc -lthreadproc -L../file_io -lfile -L../misc -lmisc -L../lib -lapr -L../time -ltime +LDLIBS= -ldl -lm -lpthread -L../network_io -lnetwork -L../threadproc -lthreadproc -L../file_io -lfile -L../misc -lmisc -L../lib -lapr -L../time -ltime -L../locks -llock LDFLAGS= $(LDLIBS) INCDIR=../../include INCDIR1=../../../include @@ -15,11 +16,13 @@ TARGETS= testfile \ testproc \ testsock \ + testthread \ testtime OBJS= testfile.o \ testproc.o \ testsock.o \ + testthread.o \ testtime.o .c.o: @@ -32,6 +35,9 @@ testproc: testproc.o $(CC) $(CFLAGS) testproc.o -o testproc $(LDFLAGS) + +testthread: testthread.o + $(CC) $(CFLAGS) testthread.o -o testthread $(LDFLAGS) testsock: testsock.o client.o server.o $(CC) $(CFLAGS) testsock.o -o testsock $(LDFLAGS) 1.1 apache-apr/apr/test/testthread.c Index: testthread.c =================================================================== /* ==================================================================== * Copyright (c) 1999 The Apache Group. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * 4. The names "Apache Server" and "Apache Group" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Group. * For more information on the Apache Group and the Apache HTTP server * project, please see <http://www.apache.org/>. * */ #include "apr_thread_proc.h" #include "apr_lock.h" #include "apr_errno.h" #include "apr_general.h" #include "errno.h" #include <stdio.h> #ifdef BEOS #include <unistd.h> #endif ap_lock_t *thread_lock; ap_context_t *context; int x = 0; void *thread_func1(void *data) { int i; for (i = 0; i < 10000; i++) { ap_lock(context, thread_lock); x++; ap_unlock(context, thread_lock); } } void *thread_func2(void *data) { int i; for (i = 0; i < 10000; i++) { ap_lock(context, thread_lock); x++; ap_unlock(context, thread_lock); } } void *thread_func3(void *data) { int i; for (i = 0; i < 10000; i++) { ap_lock(context, thread_lock); x++; ap_unlock(context, thread_lock); } } void *thread_func4(void *data) { int i; for (i = 0; i < 10000; i++) { ap_lock(context, thread_lock); x++; ap_unlock(context, thread_lock); } } int main() { ap_thread_t *t1; ap_thread_t *t2; ap_thread_t *t3; ap_thread_t *t4; ap_threadattr_t *tattr; ap_status_t st; fprintf(stdout, "Initializing the context......."); context = ap_initialize(NULL); if (context == NULL) { fprintf(stderr, "could not initialize\n"); exit(-1); } fprintf(stdout, "OK\n"); fprintf(stdout, "Initializing the lock......."); thread_lock = ap_create_lock(context, APR_INTRAPROCESS, "lock.file"); if (thread_lock == NULL) { fprintf(stderr, "Could not create lock\n"); exit(-1); } fprintf(stdout, "OK\n"); fprintf(stdout, "Starting all the threads......."); t1 = ap_create_thread(context, NULL, thread_func1, NULL); t2 = ap_create_thread(context, NULL, thread_func2, NULL); t3 = ap_create_thread(context, NULL, thread_func3, NULL); t4 = ap_create_thread(context, NULL, thread_func4, NULL); if (t1 == NULL || t2 == NULL || t3 == NULL || t4 == NULL) { fprintf(stderr, "Error starting thread\n"); exit(-1); } fprintf(stdout, "OK\n"); fprintf(stdout, "Waiting for threads to exit......."); ap_thread_join(context, t1, &st); ap_thread_join(context, t2, &st); ap_thread_join(context, t3, &st); ap_thread_join(context, t4, &st); fprintf (stdout, "OK\n"); fprintf(stdout, "Checking if locks worked......."); if (x != 40000) { fprintf(stderr, "The locks didn't work????\n"); } else { fprintf(stdout, "Everything is working!\n"); } exit(1); } 1.3 +10 -2 apache-apr/apr/threadproc/unix/thread.c Index: thread.c =================================================================== RCS file: /home/cvs/apache-apr/apr/threadproc/unix/thread.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- thread.c 1999/05/12 20:04:24 1.2 +++ thread.c 1999/05/17 13:11:51 1.3 @@ -90,10 +90,18 @@ struct thread_t *ap_create_thread(ap_context_t *cont, struct threadattr_t *attr, ap_thread_start_t func, void *data) { struct thread_t *new; - + pthread_attr_t *temp; + new = (struct thread_t *)ap_palloc(cont->pool, sizeof(struct thread_t)); + + new->td = (pthread_t *)ap_palloc(cont->pool, sizeof(pthread_t)); + + if (attr) + temp = attr->attr; + else + temp = NULL; - if (pthread_create(new->td, attr->attr, func, data) == 0) { + if (pthread_create(new->td, temp, func, data) == 0) { return new; } else {