[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r3029 - GNUnet/src/util/os
From: |
grothoff |
Subject: |
[GNUnet-SVN] r3029 - GNUnet/src/util/os |
Date: |
Fri, 23 Jun 2006 08:05:30 -0700 (PDT) |
Author: grothoff
Date: 2006-06-23 08:05:28 -0700 (Fri, 23 Jun 2006)
New Revision: 3029
Removed:
GNUnet/src/util/os/semaphore.c~
GNUnet/src/util/os/semaphoretest.c~
Log:
tmps
Deleted: GNUnet/src/util/os/semaphore.c~
===================================================================
--- GNUnet/src/util/os/semaphore.c~ 2006-06-23 15:05:03 UTC (rev 3028)
+++ GNUnet/src/util/os/semaphore.c~ 2006-06-23 15:05:28 UTC (rev 3029)
@@ -1,605 +0,0 @@
-/*
- This file is part of GNUnet.
- (C) 2001, 2002, 2003, 2004 Christian Grothoff (and other contributing
authors)
-
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-/**
- * @file util/os/semaphore.c
- * @brief functions related to IPC synchronization
- */
-
-#include "gnunet_util_os.h"
-#include "platform.h"
-
-#if SOLARIS || FREEBSD || OSX
-#include <semaphore.h>
-#endif
-#if SOMEBSD
-# include <sys/file.h>
-#endif
-#if LINUX
-# include <sys/ipc.h>
-# include <sys/sem.h>
-#endif
-#ifdef _MSC_VER
-#include <semaphore.h>
-#endif
-
-/**
- * Shall we use error-checking (slow)
- * mutexes (e.g. for debugging)
- */
-#define USE_CHECKING_MUTEX 1
-
-typedef struct {
-#if SOLARIS || FREEBSD5 || OSX
- sem_t * internal;
-#elif WINDOWS
- HANDLE internal;
-#elif LINUX
- int internal;
- char * filename;
-#elif SOMEBSD
- int initialValue;
- int fd;
- Mutex internalLock;
- char * filename;
-#elif _MSC_VER
- int internal; /* KLB_FIX */
- char * filename;
-#else
- /* PORT-ME! */
-#endif
-} IPC_Semaphore_Internal;
-
-
-#if LINUX
- /* IPC semaphore kludging for linux */
-
- /* Why don't we start at count 0 and increment when opening? */
- #define PROCCOUNT 10000
-
- /**
- * Implementation for a single semaphore actually uses three :
- *
- * 0 : actual semaphore value
- * 1 : process counter
- * 2 : lock
- */
-
- /* Various operations */
- static struct sembuf op_lock[2] = {
- {2, 0, 0}, /* wait for [2] (lock) to equal 0 */
- {2, 1, SEM_UNDO} /* then increment [2] to 1 - this locks it */
- /* UNDO to release the lock if processes exits */
/* before explicitly unlocking */
- };
- static struct sembuf op_unlock[1] = {
- {2, -1, SEM_UNDO} /* decrement [2] (lock) back to 0 */
- };
- static struct sembuf op_endcreate[2] = {
- {1, -1, SEM_UNDO},/* decrement [1] (proc counter) with undo on exit */
- /* UNDO to adjust proc counter if process exits
- before explicitly calling sem_close() */
- {2, -1, SEM_UNDO} /* then decrement [2] (lock) back to 0 */
- };
- static struct sembuf op_close[3] = {
- {2, 0, 0}, /* wait for [2] (lock) to equal 0 */
- {2, 1, SEM_UNDO}, /* then increment [2] to 1 - this locks it */
- {1, 1, SEM_UNDO} /* then increment [1] (proc counter) */
- };
-#endif
-
-#if SOMEBSD
-static void FLOCK(int fd,
- int operation) {
- int ret;
-
- ret = -1;
- while (ret == -1) {
- ret = flock(fd, operation);
- if (ret == -1) {
- if (errno != EINTR) {
- LOG_STRERROR(LOG_ERROR, "flock");
- return;
- }
- }
- }
- fsync(fd);
-}
-static int LSEEK(int fd, off_t pos, int mode) {
- int ret;
- ret = lseek(fd, pos, mode);
- if (ret == -1)
- LOG_STRERROR(LOG_ERROR, "lseek");
- return ret;
-}
-#endif
-
-IPC_Semaphore * ipc_semaphore_new_(const char * basename,
- const unsigned int initialValue,
- const char * filename,
- const int linenumber) {
- /* Could older FreeBSD use this too since this code can shorten the IPC name
*/
-#if SOLARIS || OSX || FREEBSD5
- char * noslashBasename;
- int i;
- IPC_Semaphore * rret;
- IPC_Semaphore_Internal * ret;
-
- rret = MALLOC(sizeof(IPC_Semaphore));
- ret = MALLOC(sizeof(IPC_Semaphore_Internal));
- rret->platform = ret;
- noslashBasename = STRDUP(basename);
- for (i=strlen(noslashBasename);i>0;i--)
- if (noslashBasename[i] == '/')
- noslashBasename[i] = '.'; /* first character MUST be /, but Solaris
- forbids it afterwards */
- noslashBasename[0] = '/';
- ret->internal = sem_open(noslashBasename,
- O_CREAT,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, /* 660 */
- initialValue);
- while ( (ret->internal == (void *) SEM_FAILED)
- && (errno == ENAMETOOLONG) ) {
- if (strlen(noslashBasename) < 4)
- break; /* definitely OS error... */
- noslashBasename[strlen(noslashBasename)/2] = '\0'; /* cut in half */
- ret->internal = sem_open(noslashBasename,
- O_CREAT,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, /* 660 */
- initialValue);
- }
- if (ret->internal == (void *) SEM_FAILED)
- DIE_FILE_STRERROR("sem_open", noslashBasename);
- FREE(noslashBasename);
- return rret;
-#elif WINDOWS
- char * noslashBasename;
- int i;
- IPC_Semaphore * rret;
- IPC_Semaphore_Internal * ret;
- SECURITY_ATTRIBUTES sec;
- DWORD dwErr;
-
- rret = MALLOC(sizeof(IPC_Semaphore));
- ret = MALLOC(sizeof(IPC_Semaphore_Internal));
- rret->platform = ret;
- noslashBasename = STRDUP(basename);
- for (i=strlen(noslashBasename);i>0;i--)
- if (noslashBasename[i] == '\\')
- noslashBasename[i] = '.'; /* must not contain backslashes */
-
- sec.nLength = sizeof(SECURITY_ATTRIBUTES);
- sec.bInheritHandle = TRUE;
- sec.lpSecurityDescriptor = NULL;
-
- ret->internal = CreateSemaphore(&sec, initialValue, LONG_MAX,
noslashBasename);
- dwErr = GetLastError();
- if (! ret->internal && dwErr == ERROR_ALREADY_EXISTS) {
- ret->internal = OpenSemaphore(SEMAPHORE_MODIFY_STATE, TRUE,
noslashBasename);
- dwErr = GetLastError();
- }
- if (! ret->internal) {
- LOG(LOG_FAILURE, _("Can't create semaphore: %i"), dwErr);
- DIE_FILE_STRERROR("sem_open", noslashBasename);
- }
- FREE(noslashBasename);
- return rret;
-#elif LINUX
- union semun {
- int val;
- struct semid_ds *buf;
- ushort *array;
- } semctl_arg;
- IPC_Semaphore * rret;
- IPC_Semaphore_Internal * ret;
- key_t key;
- FILE * fp;
- int pcount;
-
- rret = MALLOC(sizeof(IPC_Semaphore));
- ret = MALLOC(sizeof(IPC_Semaphore_Internal));
- rret->platform = ret;
-
- fp = FOPEN(basename, "a+");
- if (NULL == fp) {
- LOG_FILE_STRERROR_FL(LOG_FATAL,
- "fopen",
- basename,
- filename,
- linenumber);
- FREE(rret);
- FREE(ret);
- return NULL;
- }
- fclose(fp);
-
- key = ftok(basename,'g');
-
-again:
-
- ret->internal = semget(key, 3, IPC_CREAT|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
-
- if (ret->internal == -1)
- DIE_STRERROR_FL("semget", filename, linenumber);
- if (semop(ret->internal, &op_lock[0], 2) < 0) {
- if (errno == EINVAL)
- goto again;
- else
- DIE_STRERROR_FL("semop", filename, linenumber);
- }
-
- /* get process count */
- if ( (pcount = semctl(ret->internal, 1, GETVAL, 0)) < 0)
- DIE_STRERROR_FL("semctl", filename, linenumber);
- if (pcount==0) {
- semctl_arg.val = initialValue;
- if (semctl(ret->internal, 0, SETVAL, semctl_arg) < 0)
- DIE_STRERROR_FL("semtcl", filename, linenumber);
- semctl_arg.val = PROCCOUNT;
- if (semctl(ret->internal, 1, SETVAL, semctl_arg) < 0)
- DIE_STRERROR_FL("semtcl", filename, linenumber);
- }
-
- if (semop(ret->internal, &op_endcreate[0], 2) < 0)
- DIE_STRERROR_FL("semop", filename, linenumber);
-
- ret->filename = STRDUP(basename);
- return rret;
-#elif SOMEBSD
- int fd;
- int cnt;
- IPC_Semaphore * rret;
- IPC_Semaphore_Internal * ret;
-
- rret = MALLOC(sizeof(IPC_Semaphore));
- ret = MALLOC(sizeof(IPC_Semaphore_Internal));
- rret->platform = ret;
-
- MUTEX_CREATE(&ret->internalLock);
- ret->filename = STRDUP(basename);
- fd = -1;
- while (fd == -1) {
- fd = fileopen(basename,
- O_CREAT|O_RDWR|O_EXCL,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP /* 660 */);
- if ( (fd == -1) &&
- (errno == EEXIST) ) {
- /* try without creation */
- fd = fileopen(basename,
- O_RDWR,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP /* 660 */);
- /* possibly the file was deleted in the meantime,
- then try again with O_CREAT! */
- if ( (fd == -1) &&
- (errno != ENOENT) )
- break;
- }
- }
- if (fd == -1) {
- LOG_FILE_STRERROR(LOG_ERROR, "open", ret->filename);
- MUTEX_DESTROY(&ret->internalLock);
- FREE(ret->filename);
- FREE(ret);
- FREE(rret);
- return NULL;
- }
- FLOCK(fd, LOCK_EX);
- if (sizeof(int) != READ(fd, &cnt, sizeof(int))) {
- cnt = htonl(initialValue);
- LSEEK(fd, 0, SEEK_SET);
- if (sizeof(int) != WRITE(fd, &cnt, sizeof(int)))
- LOG_FILE_STRERROR(LOG_WARNING, "write", basename);
- }
- LSEEK(fd, sizeof(int), SEEK_SET);
- if (sizeof(int) != READ(fd, &cnt, sizeof(int)))
- cnt = htonl(1);
- else
- cnt = htonl(ntohl(cnt)+1);
- LSEEK(fd, sizeof(int), SEEK_SET);
- if (sizeof(int) != WRITE(fd, &cnt, sizeof(int)))
- LOG_FILE_STRERROR(LOG_WARNING, "write", basename);
- FLOCK(fd, LOCK_UN);
- ret->fd = fd;
- ret->initialValue = initialValue;
- return rret;
-#else
- #ifndef _MSC_VER
- #warning Port IPC.
- return NULL;
- #else
- return NULL;
- #endif
-#endif
-}
-
-void ipc_semaphore_up_(IPC_Semaphore * rsem,
- const char * filename,
- const int linenumber) {
- IPC_Semaphore_Internal * sem;
- if (rsem == NULL) /* error on creation, optimistic execution; good luck */
- return;
- sem = rsem->platform;
-#if SOLARIS || OSX || FREEBSD5
- if (0 != sem_post(sem->internal))
- LOG(LOG_WARNING,
- "sem_post signaled error: %s at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
-#elif WINDOWS
- if (!ReleaseSemaphore(sem->internal, 1, NULL))
- LOG(LOG_WARNING,
- "ReleaseSemaphore signaled error: %i at %s:%d\n",
- GetLastError(),
- filename,
- linenumber);
-#elif LINUX
- {
- struct sembuf sops = {0,1,SEM_UNDO};
-
- if (0 != semop(sem->internal,&sops,1))
- LOG(LOG_WARNING,
- "semop signaled error: %s at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
- }
-#elif SOMEBSD
- {
- int cnt;
-
-
- MUTEX_LOCK(&sem->internalLock);
- FLOCK(sem->fd, LOCK_EX);
- LSEEK(sem->fd, 0, SEEK_SET);
- if (sizeof(int) != READ(sem->fd, &cnt, sizeof(int))) {
- LOG(LOG_WARNING,
- "could not read IPC semaphore count (%s) at %s:%d!\n",
- STRERROR(errno),
- __FILE__,
- __LINE__);
- MUTEX_UNLOCK(&sem->internalLock);
- return;
- }
- cnt = htonl(ntohl(cnt)+1);
- LSEEK(sem->fd, 0, SEEK_SET);
- if (sizeof(int) != WRITE(sem->fd, &cnt, sizeof(int)))
- LOG(LOG_WARNING,
- "could not write to IPC file %s (%s) at %s:%d\n",
- sem->filename,
- STRERROR(errno),
- __FILE__,
- __LINE__);
- FLOCK(sem->fd, LOCK_UN);
- MUTEX_UNLOCK(&sem->internalLock);
- }
-#endif
-}
-
-void ipc_semaphore_down_(IPC_Semaphore * rsem,
- const char * filename,
- const int linenumber) {
- IPC_Semaphore_Internal * sem;
-
- if (rsem == NULL) /* error on creation, optimistic execution; good luck */
- return;
- sem = rsem->platform;
-#if OSX || SOLARIS || FREEBSD5
- while (0 != sem_wait(sem->internal)) {
- switch(errno) {
- case EINTR:
- break;
- case EINVAL:
- errexit(" ipc_semaphore_down called on invalid semaphore (in %s:%d)\n",
- filename,
- linenumber);
- case EDEADLK:
- errexit(" ipc_semaphore_down caused deadlock! (in %s:%d)\n",
- filename,
- linenumber);
- case EAGAIN:
- LOG(LOG_WARNING,
- "did not expect EAGAIN from sem_wait (in %s:%d).\n",
- filename,
- linenumber);
- break;
- default:
- LOG(LOG_ERROR,
- "did not expect %s from sem_wait at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
- break;
- }
- }
-#elif WINDOWS
- if (WaitForSingleObject(sem->internal, INFINITE) == WAIT_FAILED)
- LOG(LOG_WARNING,
- "WaitForSingleObject signaled error: %s at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
-#elif LINUX
- {
- struct sembuf sops = {0,-1,SEM_UNDO};
-
- while (0 != semop(sem->internal,&sops,1)) {
- switch(errno) {
- case EINTR:
- break;
- case EINVAL:
- errexit(" ipc_semaphore_down called on invalid semaphore (in %s:%d)\n",
- filename,
- linenumber);
- case EAGAIN:
- LOG(LOG_WARNING,
- "did not expect EAGAIN from sem_wait (in %s:%d).\n",
- filename,
- linenumber);
- break;
- default:
- LOG(LOG_ERROR,
- "did not expect %s from sem_wait at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
- break;
- }
- }
- }
-#elif SOMEBSD
- {
- int cnt;
-
- MUTEX_LOCK(&sem->internalLock);
- FLOCK(sem->fd, LOCK_EX);
- cnt = ntohl(0);
- while (htonl(cnt) == 0) {
- LSEEK(sem->fd, 0, SEEK_SET);
- if (sizeof(int) != READ(sem->fd, &cnt, sizeof(int))) {
- LOG(LOG_WARNING,
- "could not read IPC semaphore count (%s) at %s:%d!\n",
- STRERROR(errno),
- __FILE__,
- __LINE__);
- FLOCK(sem->fd, LOCK_UN);
- MUTEX_UNLOCK(&sem->internalLock);
- return;
- }
- if (htonl(cnt) == 0) {
- /* busy wait! */
- FLOCK(sem->fd, LOCK_UN);
- gnunet_util_sleep(50 * cronMILLIS);
- FLOCK(sem->fd, LOCK_EX);
- }
- }
-
- cnt = htonl(ntohl(cnt)-1);
- LSEEK(sem->fd, 0, SEEK_SET);
- if (sizeof(int) != WRITE(sem->fd, &cnt, sizeof(int)))
- LOG(LOG_WARNING,
- "could not write update to IPC file %s at %s:%d\n",
- sem->filename,
- __FILE__,
- __LINE__);
- FLOCK(sem->fd, LOCK_UN);
- MUTEX_UNLOCK(&sem->internalLock);
- }
-#else
-#endif
-}
-
-void ipc_semaphore_free_(IPC_Semaphore * rsem,
- const char * filename,
- const int linenumber) {
- IPC_Semaphore_Internal * sem;
- if (rsem == NULL) /* error on creation, optimistic execution; good luck */
- return;
- sem = rsem->platform;
- FREE(rsem);
-#if SOLARIS || OSX || FREEBSD5
- if (0 != sem_close(sem->internal))
- LOG(LOG_WARNING,
- "sem_close signaled error: %s at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
-#elif WINDOWS
- if (!CloseHandle(sem->internal))
- LOG(LOG_WARNING,
- "CloseHandle signaled error: %i at %s:%d\n",
- GetLastError(),
- filename,
- linenumber);
-#elif LINUX
- {
- int pcount;
-
- if (semop(sem->internal, &op_close[0], 3) < 0)
- LOG(LOG_WARNING,
- "semop signaled error: %s at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
-
- if ( (pcount = semctl(sem->internal, 1, GETVAL, 0)) < 0)
- LOG(LOG_WARNING,
- "semctl: %s at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
- if (pcount > PROCCOUNT)
- LOG(LOG_WARNING,
- "pcount too large at %s:%d\n",
- filename,
- linenumber);
- else if (pcount == PROCCOUNT) {
- if (0 != semctl(sem->internal,0,IPC_RMID,0))
- LOG(LOG_WARNING,
- "semctl signaled error: %s at %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
- UNLINK(sem->filename);
- } else {
- if (semop(sem->internal, &op_unlock[0], 1) < 0)
- LOG(LOG_WARNING,
- "semop %s %s:%d\n",
- STRERROR(errno),
- filename,
- linenumber);
- }
- FREE(sem->filename);
- }
-#elif SOMEBSD
- {
- int cnt;
-
- MUTEX_DESTROY(&sem->internalLock);
- FLOCK(sem->fd, LOCK_EX);
- LSEEK(sem->fd, sizeof(int), SEEK_SET);
- if (sizeof(int) == READ(sem->fd, &cnt, sizeof(int))) {
- cnt = htonl(ntohl(cnt)-1);
- LSEEK(sem->fd, sizeof(int), SEEK_SET);
- if (sizeof(int) != WRITE(sem->fd, &cnt, sizeof(int)))
- LOG(LOG_WARNING,
- "could not write to IPC file %s at %s:%d\n",
- sem->filename,
- __FILE__,
- __LINE__);
- if (ntohl(cnt) == 0) {
- UNLINK(sem->filename);
- }
- } else
- LOG(LOG_WARNING,
- "could not read process count of IPC %s at %s:%d\n",
- sem->filename,
- __FILE__,
- __LINE__);
- FREE(sem->filename);
- FLOCK(sem->fd, LOCK_UN);
- closefile(sem->fd);
- }
-#else
-#endif
- FREE(sem);
-}
-
-
-/* end of semaphore.c */
Deleted: GNUnet/src/util/os/semaphoretest.c~
===================================================================
--- GNUnet/src/util/os/semaphoretest.c~ 2006-06-23 15:05:03 UTC (rev 3028)
+++ GNUnet/src/util/os/semaphoretest.c~ 2006-06-23 15:05:28 UTC (rev 3029)
@@ -1,339 +0,0 @@
-/**
- * @file test/hashtest.c
- * @brief testcase for util/semaphore.c
- */
-
-#include "gnunet_util.h"
-#include "platform.h"
-
-#include <sys/types.h>
-#ifndef MINGW /* PORT-ME MINGW */
-
-
-static Mutex lock;
-
-static Semaphore * sem;
-
-static volatile int sv;
-
-static volatile int tv;
-
-static IPC_Semaphore * ipc;
-
-static void lockIt() {
- sv = 0;
- fprintf(stderr, ".");
- while (sv == 0)
- gnunet_util_sleep(50 * cronMILLIS); /* busy waiting may not always work */
- MUTEX_LOCK(&lock);
- sv = 1;
- MUTEX_UNLOCK(&lock);
- sv = 2;
- tv = 2;
-}
-
-static void bigStack() {
- int i;
- char big[1024 * 100];
-
- fprintf(stderr, ".");
- for (i=0;i<1024*100;i++)
- big[i] = (char) i;
-}
-
-static int testPTHREAD_CREATE() {
- PTHREAD_T pt;
- void * unused;
-
- sv = -1; tv = 0;
- fprintf(stderr, ".");
- MUTEX_CREATE(&lock);
- PTHREAD_CREATE(&pt,
- (PThreadMain)&lockIt,
- NULL,
- 1024);
- PTHREAD_DETACH(&pt);
- while (tv != 2) {
- sv = 1;
- gnunet_util_sleep(50 * cronMILLIS); /* busy waiting may not always work */
- }
- MUTEX_DESTROY(&lock);
- PTHREAD_CREATE(&pt,
- (PThreadMain)&bigStack,
- NULL,
- 1024*100 + 25000); /* fails by segfault */
- PTHREAD_JOIN(&pt, &unused);
- return 0;
-}
-
-static int testMutex() {
- PTHREAD_T pt;
- void * unused;
- MUTEX_CREATE(&lock);
-
- sv = 1;
- tv = 0;
- PTHREAD_CREATE(&pt,
- (PThreadMain)&lockIt,
- NULL,
- 1024);
- while (sv == 1)
- gnunet_util_sleep(50 * cronMILLIS); /* busy waiting may not always work */
- MUTEX_LOCK(&lock);
- sv = 5; /* release lockIt from while sv==0 loop,
- blocks it on lock */
- fprintf(stderr, ".");
-
- if (sv != 5) {
- MUTEX_UNLOCK(&lock);
- while (tv != 2)
- gnunet_util_sleep(50 * cronMILLIS); /* busy waiting may not always work
*/
- MUTEX_DESTROY(&lock);
- printf("MUTEX test failed at %s:%u\n",
- __FILE__, __LINE__);
- return 1; /* error */
- } else {
- MUTEX_UNLOCK(&lock);
- while (tv != 2)
- gnunet_util_sleep(50 * cronMILLIS); /* busy waiting may not always work
*/
- PTHREAD_JOIN(&pt, &unused);
- MUTEX_DESTROY(&lock);
- return 0; /* ok */
- }
-}
-
-static int testRecursiveMutex() {
- int i;
-
- fprintf(stderr, ".");
- MUTEX_CREATE_RECURSIVE(&lock);
- for (i=0;i<50;i++)
- MUTEX_LOCK(&lock);
- for (i=0;i<50;i++)
- MUTEX_UNLOCK(&lock);
- MUTEX_DESTROY(&lock);
- return 0; /* ok -- fails by hanging!*/
-}
-
-static void semUpDown() {
- int i;
-
- fprintf(stderr, ".");
- for (i=0;i<42;i++)
- SEMAPHORE_DOWN(sem); /* fails by blocking */
- if (SEMAPHORE_DOWN_NONBLOCKING(sem) != SYSERR) {
- SEMAPHORE_FREE(sem);
- printf("SEMAPHORE_DOWN_NONBLOCKING failed at %s:%u\n"
- "Testcase deadlocked.\n",
- __FILE__, __LINE__);
- return; /* will halt testcase! */
- }
- for (i=0;i<42;i++)
- SEMAPHORE_UP(sem);
-}
-
-static int testSemaphore() {
- int i;
- PTHREAD_T pt;
- void * unused;
-
- sem = SEMAPHORE_NEW(42);
- fprintf(stderr, ".");
- for (i=0;i<42;i++)
- SEMAPHORE_DOWN(sem); /* fails by blocking */
- if (SEMAPHORE_DOWN_NONBLOCKING(sem) != SYSERR) {
- SEMAPHORE_FREE(sem);
- printf("SEMAPHORE_DOWN_NONBLOCKING failed at %s:%u\n",
- __FILE__, __LINE__);
- return 1;
- }
- for (i=0;i<42;i++)
- SEMAPHORE_UP(sem);
- for (i=0;i<42;i++)
- if (OK != SEMAPHORE_DOWN_NONBLOCKING(sem)) {
- SEMAPHORE_FREE(sem);
- printf("SEMAPHORE_DOWN_NONBLOCKING failed at %s:%u\n",
- __FILE__, __LINE__);
- return 1;
- }
- if (SEMAPHORE_DOWN_NONBLOCKING(sem) != SYSERR) {
- SEMAPHORE_FREE(sem);
- printf("SEMAPHORE_DOWN_NONBLOCKING failed at %s:%u\n",
- __FILE__, __LINE__);
- return 1;
- }
- fprintf(stderr, ".");
- PTHREAD_CREATE(&pt,
- (PThreadMain)&semUpDown,
- NULL,
- 1024);
- for (i=0;i<42;i++)
- SEMAPHORE_UP(sem);
- PTHREAD_JOIN(&pt, &unused);
- for (i=0;i<42;i++)
- SEMAPHORE_DOWN(sem);
- if (SEMAPHORE_DOWN_NONBLOCKING(sem) != SYSERR) {
- SEMAPHORE_FREE(sem);
- printf("SEMAPHORE_DOWN_NONBLOCKING failed at %s:%u\n",
- __FILE__, __LINE__);
- return 1;
- }
- return 0;
-}
-
-static int testIPCSemaphore() {
- pid_t me;
- int cnt;
- int i;
- int j;
- FILE * fd;
- int ret;
- int si;
- int sw;
-
- ret = 0;
- REMOVE("/tmp/gnunet_ipc_xchange");
- REMOVE("/tmp/gnunet_ipc_semtest");
- me = fork();
- sw = me;
-
- ipc = IPC_SEMAPHORE_NEW("/tmp/gnunet_ipc_semtest",
- 0);
- for (cnt=0;cnt<3;cnt++) {
- if (sw == 0) {
- for (i=0;i<6;i++) {
- IPC_SEMAPHORE_DOWN(ipc);
- fd = FOPEN("/tmp/gnunet_ipc_xchange",
- "a+");
- if (fd == NULL) {
- printf("Could not open testfile for reading: %s\n",
- STRERROR(errno));
- ret = 1;
- goto END;
- }
- fseek(fd, 4*i, SEEK_SET);
- si = GN_FREAD(&j, 4, 1, fd);
- while (si == 0)
- si = GN_FREAD(&j, 4, 1, fd);
- if (si != 1) {
- printf("Could not read from testfile: %d - %s at %s:%d\n",
- si,
- STRERROR(errno),
- __FILE__,
- __LINE__);
- ret = 1;
- goto END;
- }
- fclose(fd);
- if (j != i+cnt) {
- printf("IPC test failed at cnt=%d i=%d j=%d %s:%u\n",
- cnt, i, j, __FILE__, __LINE__);
- ret = 1;
- goto END;
- } else
- fprintf(stderr, ".");
- }
- REMOVE("/tmp/gnunet_ipc_xchange");
- sw = 1;
- } else {
- for (i=0;i<6;i++) {
- sleep(1);
- fd = FOPEN("/tmp/gnunet_ipc_xchange",
- "w+");
- if (fd == NULL) {
- printf("Could not open testfile for writing: %s\n",
- STRERROR(errno));
- ret = 1;
- goto END;
- }
- fseek(fd, 4*i, SEEK_SET);
- j=cnt+i;
- if (1 != GN_FWRITE(&j, 4, 1, fd)) {
- printf("Could not write to testfile: %s\n",
- STRERROR(errno));
- ret = 1;
- goto END;
- }
- fclose(fd);
- IPC_SEMAPHORE_UP(ipc);
- }
- fprintf(stderr, ".");
- sleep(2); /* give reader ample time to finish */
- sw = 0;
- }
- }
- END:
- IPC_SEMAPHORE_FREE(ipc);
- REMOVE("/tmp/gnunet_ipc_xchange");
- if (me == 0) {
- exit(ret);
- } else {
- LOG(LOG_DEBUG,
- " waiting for other process to exit.\n");
- if (-1 == waitpid(me, &j, 0))
- LOG(LOG_ERROR,
- " waitpid failed: %s\n",
- STRERROR(errno));
- if ((! WIFEXITED(j)) || WEXITSTATUS(j) == 1)
- ret = 1; /* error in child */
- }
- return ret;
-}
-
-
-/**
- * Perform option parsing from the command line.
- */
-static int parseCommandLine(int argc,
- char * argv[]) {
- char c;
-
- while (1) {
- int option_index = 0;
- static struct GNoption long_options[] = {
- { "loglevel",1, 0, 'L' },
- { "config", 1, 0, 'c' },
- { 0,0,0,0 }
- };
-
- c = GNgetopt_long(argc,
- argv,
- "c:L:",
- long_options,
- &option_index);
-
- if (c == -1)
- break; /* No more flags to process */
-
- switch(c) {
- case 'L':
- FREENONNULL(setConfigurationString("GNUNET",
- "LOGLEVEL",
- GNoptarg));
- break;
- case 'c':
- FREENONNULL(setConfigurationString("FILES",
- "gnunet.conf",
- GNoptarg));
- break;
- } /* end of parsing commandline */
- }
- return OK;
-}
-#endif /* PORT-ME MINGW */
-
-int main(int argc, char * argv[]){
- int ret = 0;
-
-#ifndef MINGW
- initUtil(argc, argv, &parseCommandLine);
- ret += testPTHREAD_CREATE();
- ret += testMutex();
- ret += testRecursiveMutex();
- ret += testSemaphore();
- ret += testIPCSemaphore();
- fprintf(stderr, "\n");
- doneUtil();
-#endif
- return ret;
-}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r3029 - GNUnet/src/util/os,
grothoff <=