- struct proc *p = curproc; /* XXX */
- int error;
- extern char devioc[];
-
-#ifdef DEBUG
- if (grfdebug & GDB_LOCK)
- printf("grflock(%d): dev %x flags %x lockpid %x\n",
- p->p_pid, gp-grf_softc, gp->g_flags,
- gp->g_lockp ? gp->g_lockp->p_pid : -1);
-#endif
-#ifdef HPUXCOMPAT
- if (gp->g_pid) {
-#ifdef DEBUG
- if (grfdebug & GDB_LOCK)
- printf(" lockpslot %d lockslot %d lock[lockslot] %d\n",
- gp->g_lock->gl_lockslot, gp->g_lockpslot,
- gp->g_lock->gl_locks[gp->g_lockpslot]);
-#endif
- gp->g_lock->gl_lockslot = 0;
- if (gp->g_lock->gl_locks[gp->g_lockpslot] == 0) {
- gp->g_lockp = NULL;
- gp->g_lockpslot = 0;
- }
- }
-#endif
- if (gp->g_lockp) {
- if (gp->g_lockp == p)
- return(EBUSY);
- if (!block)
- return(EAGAIN);
- do {
- gp->g_flags |= GF_WANTED;
- if (error = tsleep((caddr_t)&gp->g_flags,
- (PZERO+1) | PCATCH, devioc, 0))
- return (error);
- } while (gp->g_lockp);
- }
- gp->g_lockp = p;
-#ifdef HPUXCOMPAT
- if (gp->g_pid) {
- int slot = grffindpid(gp);
-#ifdef DEBUG
- if (grfdebug & GDB_LOCK)
- printf(" slot %d\n", slot);
-#endif
- gp->g_lockpslot = gp->g_lock->gl_lockslot = slot;
- gp->g_lock->gl_locks[slot] = 1;
- }
-#endif
- return(0);