[683] | 1 | //
|
---|
| 2 | // Simulation de memoire partagee pour mac
|
---|
| 3 | //
|
---|
| 4 |
|
---|
| 5 | #include <stdio.h>
|
---|
| 6 | #include "macshm.h"
|
---|
| 7 |
|
---|
| 8 | int shmget(int key, size_t size, int flags)
|
---|
| 9 | {
|
---|
| 10 | char fn[256];
|
---|
| 11 | sprintf(fn, "shm.%d", key);
|
---|
| 12 | c2pstr(fn);
|
---|
| 13 | OSErr err = 0;
|
---|
| 14 | if (flags & IPC_CREAT) err = Create((StringPtr)fn, 0,'MMCC','TEXT');
|
---|
| 15 | if ((flags & IPC_EXCL) && (err == dupFNErr)) return -1;
|
---|
| 16 | short fRefNum;
|
---|
| 17 | FSOpen((StringPtr)fn, 0, &fRefNum);
|
---|
| 18 | long sz;
|
---|
| 19 | GetEOF(fRefNum, &sz);
|
---|
| 20 | if (size > sz) SetEOF(fRefNum, size);
|
---|
| 21 | FSClose(fRefNum);
|
---|
| 22 | return key;
|
---|
| 23 | }
|
---|
| 24 |
|
---|
| 25 | void* shmat(int shmid, void*, int)
|
---|
| 26 | {
|
---|
| 27 | char fn[256];
|
---|
| 28 | sprintf(fn, "shm.%d", shmid);
|
---|
| 29 | c2pstr(fn);
|
---|
| 30 | short fRefNum;
|
---|
| 31 | FSOpen((StringPtr)fn, 0, &fRefNum);
|
---|
| 32 | long sz;
|
---|
| 33 | GetEOF(fRefNum, &sz);
|
---|
| 34 | char* p = new char[sz + sizeof(int)];
|
---|
| 35 | *(int*)p = shmid;
|
---|
| 36 | p += sizeof(int);
|
---|
| 37 | FSRead(fRefNum, &sz, p);
|
---|
| 38 | FSClose(fRefNum);
|
---|
| 39 | return (void*) p;
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 | int shmctl(int shmid, int cmd, struct shmid_ds* buf)
|
---|
| 43 | {
|
---|
| 44 | char fn[256];
|
---|
| 45 | sprintf(fn, "shm.%d", shmid);
|
---|
| 46 | c2pstr(fn);
|
---|
| 47 | switch(cmd) {
|
---|
| 48 | case IPC_STAT:
|
---|
| 49 | short fRefNum;
|
---|
| 50 | FSOpen((StringPtr)fn, 0, &fRefNum);
|
---|
| 51 | long sz;
|
---|
| 52 | GetEOF(fRefNum, &sz);
|
---|
| 53 | buf->shm_segsz = sz;
|
---|
| 54 | FSClose(fRefNum);
|
---|
| 55 | return 0;
|
---|
| 56 | case IPC_RMID:
|
---|
| 57 | FSDelete((StringPtr)fn, 0);
|
---|
| 58 | return 0;
|
---|
| 59 | }
|
---|
| 60 | return -1;
|
---|
| 61 | }
|
---|
| 62 | int shmdt(const void *addr)
|
---|
| 63 | {
|
---|
| 64 | char* p = (char*)addr - sizeof(int);
|
---|
| 65 | int shmid = *(int*)p;
|
---|
| 66 |
|
---|
| 67 | char fn[256];
|
---|
| 68 | sprintf(fn, "shm.%d", shmid);
|
---|
| 69 | c2pstr(fn);
|
---|
| 70 | short fRefNum;
|
---|
| 71 | FSOpen((StringPtr)fn, 0, &fRefNum);
|
---|
| 72 | long sz;
|
---|
| 73 | GetEOF(fRefNum, &sz);
|
---|
| 74 | FSWrite(fRefNum, &sz, addr);
|
---|
| 75 | FSClose(fRefNum);
|
---|
| 76 |
|
---|
| 77 | delete[] p;
|
---|
| 78 | return 0;
|
---|
| 79 | }
|
---|
| 80 |
|
---|