void exit_Client() { int i; // supprime les pipes for(i=0;i<MAX_USER;i++) { if(clients[i].type==1) unlink(clients[i].pipe_name); } // libère les mémoires partagés mutfree(mut); key_t key = ftok("/etc/passwd", 1); shmfree(key); key = ftok("/etc/passwd", 2); shmfree(key); }
// Finalize the buffer-cache shared memory block void bc_fin() { // drop files table ft_fin(); // free shared memory shmfree(&bcshmid, bc); // free getblk mutex semFree(semid); // drop file key remove(_SHMKEYPATH_BC_); remove(_SEMKEYPATH_BC_); }
stat_t SelfHealingSessionServer::HandleDisconnect(const L4_ThreadId_t& tid, L4_Msg_t& msg) { SessionControlBlock* c; addr_t base; ENTER; base = L4_Get(&msg, 0); c = Search(tid, base); if (c == 0) { return ERR_NOT_FOUND; } DOUT("shm release @ %.8lX\n", base); shmfree(base, c->size); Deregister(c); L4_Clear(&msg); EXIT; return ERR_NONE; }
/* * drawevents2 calls flush to display anything that was drawn. */ static Input * drawevents2(int block, int *ninp) { static int flushing; if(!flushing){ if(screen.dirty){ drawflush(screen.r); flushing = 1; screen.dirty = 0; } ninputs = 0; } while((block && (flushing || ninputs == 0)) || XPending(display)){ XEvent ev; XNextEvent(display, &ev); switch(ev.type){ case MapNotify: case ReparentNotify: addredraw(); continue; case Expose: addredraw(); continue; case KeyPress: case KeyRelease: { XKeyEvent *ep = &ev.xkey; if(0)fprintf( stderr, "key %s %d (%x) '%c' at (%d,%d) state %x\n", ev.type == KeyPress ? "pressed" : "released", ep->keycode, ep->keycode, isprint(ep->keycode) ? ep->keycode : '.', ep->x, ep->y, ep->state ); u64int mod; KeySym keysym; int code; char keystr[8] = {0}; keysym = XLookupKeysym(ep, ep->state & (ShiftMask|LockMask)); if((code = keysym2ucs(keysym)) != -1) utf8encode(keystr, sizeof keystr-1, code); else keystr[0] = '\0'; switch(keysym){ case XK_Return: case XK_KP_Enter: strncpy(keystr, "\n", sizeof keystr-1); mod = KeyStr; break; case XK_Tab: case XK_KP_Tab: case XK_ISO_Left_Tab: strncpy(keystr, "\t", sizeof keystr-1); mod = KeyStr; break; case XK_Break: mod = KeyBreak; break; case XK_BackSpace: mod = KeyBackSpace; break; case XK_Down: mod = KeyDown; break; case XK_End: mod = KeyEnd; break; case XK_Home: mod = KeyHome; break; case XK_Left: mod = KeyLeft; break; case XK_Page_Down: mod = KeyPageDown; break; case XK_Page_Up: mod = KeyPageUp; break; case XK_Right: mod = KeyRight; break; case XK_Up: mod = KeyUp; break; case XK_Shift_L: case XK_Shift_R: mod = KeyShift; break; case XK_Control_L: case XK_Control_R: mod = KeyControl; break; case XK_Meta_L: case XK_Meta_R: mod = KeyMeta; /* mac command key */ break; case XK_Alt_L: case XK_Alt_R: mod = KeyAlt; break; case XK_Super_L: case XK_Super_R: fprintf(stderr, "super\n"); mod = KeySuper; break; case XK_Hyper_L: case XK_Hyper_R: fprintf(stderr, "hyper\n"); mod = KeyHyper; break; case XK_KP_Insert: case XK_Insert: mod = KeyIns; break; case XK_KP_Delete: case XK_Delete: mod = KeyDel; break; case XK_Caps_Lock: mod = KeyCapsLock; break; default: mod = 0; break; } addinput( 0, 0, keystr, mod, ev.type == KeyPress, ev.type == KeyRelease ); } continue; case ButtonPress: case ButtonRelease: { XButtonEvent *ep = &ev.xbutton; u64int mod; switch(ep->button){ case 0:case 1:case 2:case 3:case 4: case 5:case 6:case 7:case 9:case 10: mod = Mouse0 << ep->button; break; default: fprintf(stderr, "unsupported mouse button %d\n", ep->button); mod = 0; break; } if(mod != 0){ addinput( ep->x, ep->y, NULL, mod, ev.type == ButtonPress, ev.type == ButtonRelease ); } } continue; case EnterNotify: case LeaveNotify: fprintf(stderr, "enter/leave\n"); continue; case MotionNotify: if(input_prevmod != 0){ XMotionEvent *ep = &ev.xmotion; u64int m; if(0)fprintf( stderr, "motion at (%d,%d) state %x\n", ep->x, ep->y, ep->state ); for(m = Mouse0; m <= LastMouse; m <<= 1){ addinput( ep->x, ep->y, NULL, m, 0,0 ); } } continue; case ConfigureNotify: { XConfigureEvent *ce = &ev.xconfigure; if(ce->width != width || ce->height != height){ shmfree(); width = ce->width; height = ce->height; if(shminit() == -1){ *ninp = 0; return NULL; } addredraw(); } continue; } } if(ev.type == XShmGetEventBase(display) + ShmCompletion){ flushing = 0; if(animating){ addredraw(); } continue; } fprintf(stderr, "unknown xevent %d\n", ev.type); } if(!flushing && ninputs > 0){ *ninp = ninputs; return inputs; } *ninp = 0; return NULL; }