Beispiel #1
0
void USB_OTG_BSP_mDelay (const uint32_t msec)
{
	//USB_OTG_BSP_uDelay(msec * 1000); 
	_wait(msec,_proc_loop);
}
Beispiel #2
0
void fan_rpm_task(void)
{
	fan_rpm = get_fan_int_counter() * 10 * 60 / 4;
	_wait(MILLI_SEC(100));
}
Beispiel #3
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__CLSSYNCMAG_SYNC, "_clsSyncManager::sync" )
   INT32 _clsSyncManager::sync( _clsSyncSession &session,
                                const UINT32 &w,
                                INT64 timeout )
   {
      PD_TRACE_ENTRY ( SDB__CLSSYNCMAG_SYNC ) ;
      SDB_ASSERT( w <= CLS_REPLSET_MAX_NODE_SIZE &&
                  CLS_REPLSE_WRITE_ONE <= w,
                 "1 <= sync num <= CLS_REPLSET_MAX_NODE_SIZE" ) ;
      SDB_ASSERT( NULL != session.eduCB, "educb should not be NULL" ) ;
      SDB_ASSERT( DPS_INVALID_LSN_OFFSET != session.endLsn,
                  "end lsn should not be valid" ) ;
      INT32 rc = SDB_OK ;
      UINT32 sub = 0;
      BOOLEAN needWait = TRUE ;

      if ( w <= CLS_REPLSE_WRITE_ONE )
      {
         goto done ;
      }

      _info->mtx.lock_r() ;

      if ( 0 == _validSync )
      {
         _info->mtx.release_r() ;
         goto done ;
      }
      else if ( _aliveCount < _validSync && w > _aliveCount + 1 )
      {
         rc = SDB_CLS_WAIT_SYNC_FAILED ;
         _info->mtx.release_r() ;
         goto error ;
      }
      else if ( w > _validSync + 1 )
      {
         sub = CLS_W_2_SUB( _validSync + 1 ) ;
      }
      else
      {
         sub = CLS_W_2_SUB( w ) ;
      }

      _mtxs[sub].get() ;
      if ( DPS_INVALID_LSN_OFFSET != _checkList[sub] &&
           session.endLsn < _checkList[sub] )
      {
         needWait = FALSE ;
      }
      else
      {
         rc = _syncList[sub].push( session ) ;
      }
      _mtxs[sub].release() ;
      _info->mtx.release_r() ;

      if ( SDB_OK != rc )
      {
         goto error ;
      }
      else if ( needWait )
      {
         rc = _wait( session.eduCB, sub, timeout ) ;
      }

   done:
      PD_TRACE_EXITRC ( SDB__CLSSYNCMAG_SYNC, rc ) ;
      return rc ;
   error:
      goto done ;
   }
Beispiel #4
0
 T& wait()
 { 
   _wait();
   return std::move(*_result);
 }
Beispiel #5
0
 void wait()
 { 
   _wait();
 }
Beispiel #6
0
void MicroDelay(unsigned int t){_wait(t);}
Beispiel #7
0
/* only support one operator in a command :
 *      cat < README
 *      cat README > newfile
 *      ls | cat
 */
static int parse_cmd(int argc, char **argv) {
    int i;
    int fd;
    int pid, pid2;
    int pfd[2];
    char argcmd[LEN_CMD];
    char type;
    char **argv2;

    type = ' ';

    /* need a argument after >, < or | */
    for (i = 1; i < argc - 1; i++) {
        if (strcmp("<", argv[i]) == 0
                || strcmp(">", argv[i]) == 0
                || strcmp("|", argv[i]) == 0) {

            argc = i;
            argv2 = &argv[i+1];
            type = argv[i][0];
            argv[i] = 0;
            break;
        }
    }

    pid = _fork();
    /********** in new process **********/
    if (pid == 0) {
        switch(type) {
            case '<':{
                         if ((fd = _open(argv2[0], O_RONLY)) < 0) {
                             printf("sh1: can not open file `%s`\n", argv2[0]);
                             _exit();
                         }

                         if (_close(stdin) < 0) {
                             puts("sh1: can not close stdin\n");
                             _exit();
                         }

                         if (_dup(fd) < 0) {
                             puts("sh1: can not close stdin\n");
                             _exit();
                         }

                         break;
                     }
            case '>':{
                         if ((fd = _open(argv2[0], O_RW | O_CREATE)) < 0) {
                             printf("sh1: can not open file `%s`\n", argv2[0]);
                             _exit();
                         }

                         if (_close(stdout) < 0) {
                             puts("sh1: can not close stdout\n");
                             _exit();
                         }

                         if (_dup(fd) < 0) {
                             puts("sh1: can not close stdin\n");
                             _exit();
                         }
                         break;
                     }
            case '|':{
                         if (_pipe(pfd) < 0) {
                             puts("sh1: pipe\n");
                             _exit();
                         }

                         pid2 = _fork();
                         if (pid2 == 0) {
                             if (_close(stdin) < 0) {
                                 printf("sh2: can not close stdin\n");
                                 _exit();
                             }

                             if (_dup(pfd[0]) != stdin) {
                                 printf("sh2: can not dup fd0\n");
                                 _close(pfd[0]);
                                 _exit();
                             }

                             memset(argcmd, 0, sizeof(argcmd));
                             strcpy(argcmd, "/bin/");
                             strcat(argcmd, argv2[0]);

                             if (_exec(argcmd, argv2) < 0) {
                                 printf("sh2: can not exec %s\n", argcmd);
                                 _close(pfd[0]);
                                 _close(stdin);
                                 _exit();
                             }
                         } else if (pid2 < 0) {
                             printf("sh2: fork fail\n");
                             _close(pfd[0]);
                             _close(stdin);
                             _exit();
                         }
                         break;
                     }
            default:
                     break;
        }


        if (type == '|') {
            if (_close(stdout) < 0) {
                _close(pfd[1]);
                _exit();
            }

            if (_dup(pfd[1]) != stdout) {
                _close(pfd[1]);
                _exit();
            }
        }

        memset(argcmd, 0, sizeof(argcmd));
        strcpy(argcmd, "/bin/");
        strcat(argcmd, argv[0]);

        if (_exec(argcmd, argv) < 0) {
            /* when type == '|' when argv2 is invaild, printf maybe cause sleeping */
            if (type != '|') printf("sh1: can not exec %s\n", argcmd);
            _close(pfd[1]);
            _close(stdin);
            _exit();
        }
        /**********************************/
    } else if (pid > 0) {
        if (_wait() < 0) {
            printf("sh: wait %d return -1\n", pid);
            goto bad;
        }
    } else {
        printf("sh: fork fail");
        goto bad;
    }

    return 0;

bad:
    return -1;
}
Beispiel #8
0
void CappedInsertNotifier::wait(Microseconds timeout) const {
    stdx::unique_lock<stdx::mutex> lk(_mutex);
    _wait(lk, _version, timeout);
}
Beispiel #9
0
void CappedInsertNotifier::wait() const {
    stdx::unique_lock<stdx::mutex> lk(_mutex);
    _wait(lk, _version, Microseconds::max());
}
Beispiel #10
0
Waitmsg*
p9waitfor(int pid)
{
	return _wait(pid, 0);
}
Beispiel #11
0
Waitmsg*
p9waitnohang(void)
{
	return _wait(-1, WNOHANG);
}
Beispiel #12
0
Waitmsg*
p9wait(void)
{
	return _wait(-1, 0);
}
Beispiel #13
0
bool epoll_wait_call::wait_os(bool zero_timeout)
{
	return _wait(zero_timeout ? 0 : m_timeout);
}
Beispiel #14
0
//Pessoa viaja
void person_travel(ElevatorMonitor* monitor, int thread, int person_current_floor, int destiny, buffer* buff){
    pthread_mutex_lock(&monitor->monitorGlobalLock);
    
    int inside = 0;
    
    //Se a pessoa tem que ir para o mesmo andar que já está, retorna
    if (person_current_floor == destiny) {
        pthread_mutex_unlock(&monitor->monitorGlobalLock);
        return;
    }

    
    //Descobre a direção do movimento da pessoa
    int dir = UP;
    if (destiny < person_current_floor) {
        dir = DOWN;
    }
    else{
        dir = UP;
    }
    
    //Se o elevador esta parado, com a porta aberta, indo para o mesmo sentido e não lotado, entra
    if(monitor->currentFloor == person_current_floor
       && monitor->doorState == DOOR_OPEN
       && monitor->people_inside < monitor->capacity
       && monitor->movementState == dir){
        inside = 1;
    }


    //Enquanto não entra, tenta entrar
    while(!inside) {
        
        //Se quer subir
        if(person_current_floor < destiny){

            //Aperta o botão no painel
            if (!outsidePanel_is_up_button_on(monitor->outside_panels[person_current_floor])) {
                buffer_write(buff, thread, monitor->start_time, 'S', person_current_floor);
                outsidePanel_turn_on_up_button(monitor->outside_panels[person_current_floor]);

            }
            
            //Sinaliza para o elevador que ele tem um andar para ir.
            pthread_cond_signal(&monitor->hasFloorToGo);
            dir = UP;
            
            
            buffer_write(buff, thread, monitor->start_time, 'B', monitor->currentFloor);

            //Espera o elevador chegar e chamar as pessoas que querem subir
            pthread_cond_wait(monitor->floorUpConditions+person_current_floor, &monitor->monitorGlobalLock);
            
            buffer_write(buff, thread, monitor->start_time, 'E', monitor->currentFloor);
            
            
        }
        //Se quer descer
        else if(person_current_floor > destiny){
            //Aperta o botão
            if (!outsidePanel_is_down_button_on(monitor->outside_panels[person_current_floor])) {
                buffer_write(buff, thread, monitor->start_time, 'D', person_current_floor);
                outsidePanel_turn_on_down_button(monitor->outside_panels[person_current_floor]);

            }
            pthread_cond_signal(&monitor->hasFloorToGo);
            dir = DOWN;
            
            buffer_write(buff, thread, monitor->start_time, 'B', monitor->currentFloor);

            //Espera o elevador chamar e verificar se pode descer
            pthread_cond_wait(monitor->floorDownConditions+person_current_floor, &monitor->monitorGlobalLock);
            buffer_write(buff, thread, monitor->start_time, 'E', monitor->currentFloor);
            
        }
        
        //Pode entrar?
        if(monitor->people_inside < monitor->capacity && monitor->currentFloor == person_current_floor && monitor->doorState == DOOR_OPEN){
            inside = 1;

            pthread_cond_signal(&monitor->hasFloorToGo);
            
            //Avisa para mais pessoas entrarem
            if(dir == UP){
                pthread_cond_signal(monitor->floorUpConditions+person_current_floor);
            }
            else{
                pthread_cond_signal(monitor->floorDownConditions+person_current_floor);
            }
        //Se não pode entrar, espera um tempo até chamar de novo
        }else{
            _wait(monitor, (2*TIME_FOR_PEOPLE_TO_LEAVE));
        }
    }
    
    buffer_write(buff, thread, monitor->start_time, 'N', monitor->currentFloor);
    
    //Entra
    monitor->people_inside++;
    monitor->destinies[destiny]++;

    //Aperta o botao para o andar de destino
    buffer_write(buff, thread, monitor->start_time, 'I', destiny);
    insidePanel_press_button(monitor->inside_panel, destiny);

    pthread_cond_signal(&monitor->hasFloorToGo);

    //Espera chegar no andar
    pthread_cond_wait(monitor->floorLeaveConditions+destiny, &monitor->monitorGlobalLock);
    
    buffer_write(buff, thread, monitor->start_time, 'V', monitor->currentFloor);
    monitor->people_inside--;
    monitor->destinies[destiny]--;
    
    //Sai, avisa mais alguem pra sair
    pthread_cond_signal(monitor->floorLeaveConditions+destiny);
    
    pthread_mutex_unlock(&monitor->monitorGlobalLock);
    return;
}
Beispiel #15
0
int fdwait(int fd, int rw)
{
    return _wait(NULL, fd, rw);
}
Beispiel #16
0
SQRESULT
Thread::wait(HSQUIRRELVM v)
{
	_wait(v);
	return 0;
}
Beispiel #17
0
int mqwait(void *socket, int rw)
{
    return _wait(socket, -1, rw);
}
Beispiel #18
0
/**
 * Interrupt 80h. Handles the system calls.
 *
 *  @param regs Pointer to struct containing micro's registers.
 */
void int80(registers* regs) {

    switch (regs->eax) {

        case _SYS_READ:
            regs->eax = _read((unsigned int)regs->ebx, (char*)translate(regs->ecx), (size_t)regs->edx);
            break;
        case _SYS_WRITE:
            regs->eax = _write((unsigned int)regs->ebx, (const char*)translate(regs->ecx), (size_t)regs->edx);
            break;
        case _SYS_TIME:
            regs->eax = _time((time_t*)translate(regs->ebx));
            break;
        case _SYS_IOCTL:
            regs->eax = _ioctl(regs->ebx, regs->ecx, (void*)translate(regs->edx));
            break;
        case _SYS_TICKS:
            regs->eax = _getTicksSinceStart();
            break;
        case _SYS_YIELD:
            // This just makes sure we call the scheduler again, for now
            break;
        case _SYS_EXIT:
            _exit();
            break;
        case _SYS_GETPID:
            regs->eax = _getpid();
            break;
        case _SYS_GETPPID:
            regs->eax = _getppid();
            break;
        case _SYS_RUN:
            regs->eax = _run((EntryPoint) translate(regs->ebx), (char*) translate(regs->ecx), regs->edx);
            break;
        case _SYS_WAIT:
            regs->eax = _wait();
            break;
        case _SYS_KILL:
            _kill((pid_t) regs->ebx);
            break;
        case _SYS_PINFO:
            regs->eax = _pinfo((struct ProcessInfo*)translate(regs->ebx), (size_t)regs->ecx);
            break;
        case _SYS_SLEEP:
            _sleep(regs->ebx);
            break;
        case _SYS_NICE:
            regs->eax = _nice(regs->ebx);
            break;
        case _SYS_RENICE:
            regs->eax = _renice(regs->ebx, regs->ecx);
            break;
        case _SYS_CLOSE:
            regs->eax = _close(regs->ebx);
            break;
        case _SYS_OPEN:
            regs->eax = _open((char*)translate(regs->ebx), regs->ecx, regs->edx);
            break;
        case _SYS_CREAT:
            regs->eax = _creat((char*)translate(regs->ebx), regs->ecx);
            break;
        case _SYS_MKDIR:
            regs->eax = _mkdir((const char*)translate(regs->ebx), regs->ecx);
            break;
        case _SYS_RMDIR:
            regs->eax = _rmdir((const char*)translate(regs->ebx));
            break;
        case _SYS_UNLINK:
            regs->eax = _unlink((const char*)translate(regs->ebx));
            break;
        case _SYS_RENAME:
            regs->eax = _rename((const char*)translate(regs->ebx), (const char*)translate(regs->ecx));
            break;
        case _SYS_CHDIR:
            regs->eax = _chdir((const char*)translate(regs->ebx));
            break;
        case _SYS_GETCWD:
            regs->eax = _getcwd((char*)translate(regs->ebx), (size_t)regs->ecx);
            break;
        case _SYS_READDIR:
            regs->eax = _readdir(regs->ebx, (struct fs_DirectoryEntry*)translate(regs->ecx), regs->edx);
            break;
        case _SYS_SETPPERSONA:
            _setProcessPersona(regs->ebx, regs->ecx, regs->edx);
            break;
        case _SYS_GETPPERSONA:
            _getProcessPersona(regs->ebx, (int*)translate(regs->ecx), (int*) translate(regs->edx));
            break;
        case _SYS_SYMLINK:
            regs->eax = _symlink((const char *)translate(regs->ebx), (const char *)translate(regs->ecx));
            break;
        case _SYS_MKFIFO:
            regs->eax = _mkfifo((const char*)translate(regs->ebx));
            break;
        case _SYS_CHMOD:
            regs->eax = _chmod(regs->ebx, (const char*)translate(regs->ecx));
            break;
        case _SYS_STAT:
            regs->eax = _stat((const char*)translate(regs->ebx), (struct stat*)translate(regs->ecx));
            break;
        case _SYS_CHOWN:
            regs->eax = _chown((const char*)translate(regs->ebx));
            break;
        case _SYS_LOG:
            _loglevel(regs->ebx);
            break;
        case _SYS_STACKSIZE:
            regs->eax = _stacksize();
    }
}