示例#1
0
/**
 * @brief Zuschlag fuer alle Fische eines Besitzers
 */
static void zuschlag(char *besitzer, int zuschlag)
{
	int fd, ret, gefunden = 0;
	Fischsatz fisch;

	evtl_namen_kuerzen(besitzer);
	writer_lock();
	debug_wait();
	fd = open(DATEI, O_RDWR);
	if(fd < 0)
	{
		perror("open");
		writer_unlock();
		exit(1);
	}
	while((ret = read(fd, &fisch, sizeof(fisch))) == sizeof(fisch))
	{
		if(!strcmp(fisch.besitzer, besitzer))
		{
			fisch.preis += zuschlag;
			if(lseek(fd, -sizeof(fisch), SEEK_CUR) ==(off_t)-1)
			{
				perror("lseek");
				writer_unlock();
				exit(1);
			}
			if(write(fd, &fisch, sizeof(fisch)) != sizeof(fisch))
			{
				perror("write");
				writer_unlock();
				exit(1);
			}
			gefunden = 1;
		}
	}
	if(ret < 0)
	{
		perror("read");
		writer_unlock();
		exit(1);
	}
	else if(ret > 0)
	{
		fprintf(stderr, "Warnung: Datei \"%s\" korrumpiert\n", DATEI);
	}
	if(!gefunden)
	{
		printf("Achtung: Kein Kunde namens \"%s\" in der Datei \"%s\"\n", besitzer, DATEI);
	}
	close(fd);
	writer_unlock();
}
示例#2
0
/**
 * @brief Einen neuen Fisch in die Datenbank eintragen
 */
static void neu(char *besitzer, char *fischname)
{
	int fd;
	int ret;
	Fischsatz fisch;

	evtl_namen_kuerzen(besitzer);
	evtl_namen_kuerzen(fischname);
	
	writer_lock();
	debug_wait();
	fd = open(DATEI, O_RDWR|O_CREAT, 0600);
	if(fd < 0)
	{
		perror("open");
		writer_unlock();
		exit(1);
	}
	while((ret = read(fd, &fisch, sizeof(fisch))) == sizeof(fisch))
	{
		if(!strcmp(fisch.besitzer, besitzer) && 
		   !strcmp(fisch.fischname, fischname))
		{
			printf("Kann Besitzer \"%s\" / Fisch \"%s\" nicht eintragen: Eintrag existiert bereits!\n", besitzer, fischname);
			writer_unlock();
			exit(1);
		}
	}
	if(ret < 0)
	{
		perror("read");
		writer_unlock();
		exit(1);
	}
	else if(ret > 0)
	{
		fprintf(stderr, "Warnung: Datei \"%s\" korrumpiert\n", DATEI);
		lseek(fd, -ret, SEEK_END);
	}
	strcpy(fisch.besitzer, besitzer);
	strcpy(fisch.fischname, fischname);
	fisch.preis = GRUNDPREIS;
	if((ret = write(fd, &fisch, sizeof(fisch))) != sizeof(fisch))
	{
		if(ret < 0)
			perror("write");
		else
			fprintf(stderr, "?!? Konnte nur %d von %d bytes schreiben\n", ret, sizeof(fisch));
	}
	close(fd);
	writer_unlock();
}
示例#3
0
int main(){
	leser_lock();
	leser_unlock();
	writer_lock();
	writer_unlock();
	leser_lock();
	writer_lock();
	leser_unlock();
	writer_lock();
	writer_unlock();
	
	return 0;
}
示例#4
0
/* WRITER THREAD writes timestamp to shared memory */
void* Writer(void* num)
{
    time_t now; 
    int i;
    pid_t tid = syscall(SYS_gettid);      
    time(&now);  /* grabs system time and stuff it into struct time_t now*/ 
    if (DEBUG)
        fprintf(stderr,"create writer thread pid: %d tid: %d %s\n",getpid(), tid,
                ctime(&now));

    /* construct a string for the writer to spit out to stderr */
    char buf[80] = "WRITER  ";
    strcat(buf,(char*)num); 
    strcat(buf," "); 
    char c[2] = "0"; /* ascii value for character 0 */

    /* make the loop random when you have multiple threads */
    for (i=1; i<= 3; i++){

        fib(20+(2*i));   /* do some busy work */ 
        writer_lock(semid);

        /* increment shared memory */
        (*shared)++;  

        fprintf(stdout,"Writer changed mem to: %d\n",*shared); 
        writer_unlock( semid );  
    }
    pthread_exit(0);
}
示例#5
0
void CRWMutex::unlockWrite()
{
#ifndef ANDROID
   pthread_rwlock_unlock(&mMutex);
#else
   writer_unlock(&mMutex);
#endif //ANDROID
}
示例#6
0
文件: writer.c 项目: onizenso/College
/* Writer function writes time to shared memory */
void *Writer( void * num )
{
   int i;
   pid_t tid;
   tid = syscall(SYS_gettid);      
   printf("create writer thread pid: %d tid: %d \n",getpid(), tid);

  /* make the loop random when you have multiple threads */
  for ( i=1; i<= 3; i++){
    writer_lock(semid);
    time( &now);
    strcpy((char *)mem_ptr, ctime(&now) );  
    printf("writer #%s  %s", (char *)num, mem_ptr); 
    writer_unlock( semid );  
    sleep(1);
  }
  pthread_exit(0);
}
示例#7
0
/**
 * @brief Rechnung fuer Besitzer ausgeben, seine Eintraege loeschen
 */
static void rechnung(char *besitzer)
{
	int fd, fdz, ret, gefunden = 0;
	Fischsatz fisch;
	int gesamtpreis = 0;
	writer_lock();
	debug_wait();
	if(rename(DATEI, ZWISCHENDATEI) < 0)
	{
		perror("rename");
		writer_unlock();
		exit(1);
	}
	evtl_namen_kuerzen(besitzer);

	fdz = open(ZWISCHENDATEI, O_RDONLY);
	if(fdz < 0)
	{
		perror("open");
		writer_unlock();
		exit(1);
	}
	fd = open(DATEI, O_RDWR|O_CREAT, 0600);
	if(fd < 0)
	{
		perror("open");
		writer_unlock();
		exit(1);
	}
	while((ret = read(fdz, &fisch, sizeof(fisch))) == sizeof(fisch))
	{
		if(!strcmp(fisch.besitzer, besitzer))
		{
			gesamtpreis += fisch.preis;
			gefunden = 1;
		}
		else
		{
			if(write(fd, &fisch, sizeof(fisch)) != sizeof(fisch))
			{
				perror("write");
				writer_unlock();
				exit(1);
			}
		}
	}
	if(ret < 0)
	{
		perror("read");
		writer_unlock();
		exit(1);
	}
	else if(ret > 0)
	{
		fprintf(stderr, "Warnung: Datei \"%s\" korrumpiert\n", DATEI);
	}
	if(gefunden)
	{
		printf("Rechnungsbetrag fuer %s: %d Eur\n", besitzer, gesamtpreis);
	}
	else
	{
		printf("Achtung: Kein Kunde namens \"%s\" in der Datei \"%s\"\n", besitzer, DATEI);
	}
	close(fdz);
	close(fd);
	writer_unlock();
}