/** * @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(); }
/** * @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(); }
int main(){ leser_lock(); leser_unlock(); writer_lock(); writer_unlock(); leser_lock(); writer_lock(); leser_unlock(); writer_lock(); writer_unlock(); return 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); }
void CRWMutex::unlockWrite() { #ifndef ANDROID pthread_rwlock_unlock(&mMutex); #else writer_unlock(&mMutex); #endif //ANDROID }
/* 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); }
/** * @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(); }