Exemple #1
0
static void select_list_enqueue(termstate_t *term, struct term_select_info *t)
{
    l4semaphore_down(&term->termsem);
    t->prev       = NULL;
    t->next       = term->select_list;
    term->select_list = t;
    l4semaphore_up(&term->termsem);
}
Exemple #2
0
static void select_list_dequeue(termstate_t *term, struct term_select_info *t)
{
    if (t)
    {
        l4semaphore_down(&term->termsem);
        if (t == term->select_list)
            term->select_list = t->next;
        else
            t->prev->next = t->next;
        l4semaphore_up(&term->termsem);
    }
}
Exemple #3
0
/**
 * \brief  Get the keycode from keylist
 *	
 * \return keycode
 *
 * When a key is pressed or released the event handler stores the keycode 
 * in a keylist. getkeycode() reads from this list and returns the keycode.
 * Skip all keycode > 127.
 */
static int 
_getkeycode(void)
{
  int code;

  if (!__init)
    return 0;
  
  _cursor(SHOW);
  
  l4semaphore_down(&keysem);
  code = keylist[keylist_tail];
  keylist_tail = (keylist_tail + 1) % CONTXT_KEYLIST_SIZE;
  __keyin = 1;
  
  _cursor(HIDE);
  
  if(code > 127)
    code = 0;

  return code;
}
Exemple #4
0
int sysinit (cfg_opts *options)
{
    struct t_os2process *proc; // sysinit's PTDA/proc
    //l4events_ch_t event_ch = L4EVENTS_EXIT_CHANNEL;
    //l4events_nr_t event_nr = L4EVENTS_NO_NR;
    //l4events_event_t event;
    char   *env;
    APIRET rc;

    // create global environment
    create_env(&env);

    // Create the sysinit process PTDA structure (pid == ppid == 0)
    proc = PrcCreate(0,         // ppid
                     "sysinit", // pPrg
                     NULL,      // pArg
                     env);      // pEnv

    /* set task number */
    sysinit_id = l4_myself();
    proc->task = sysinit_id;

    if (!names_register("os2srv.sysinit"))
        io_log("error registering on the name server\n");

    /* Start servers */
    exec_runserver(proc->pid);

    /* Start run=/call= */
    exec_run_call(proc->pid);

    // Check PROTSHELL statement value
    if (!options->protshell || !*(options->protshell))
    {
        io_log("No PROTSHELL statement in CONFIG.SYS\n");
        rc = ERROR_INVALID_PARAMETER; /*ERROR_INVALID_PARAMETER 87; Not defined for Windows*/
    } else {
        exec_protshell(options);
        rc = 0; /* NO_ERROR */
    }

    io_log("sem wait\n");

    if (!rc) // wait until child process (protshell) terminates (this will unblock us)
        l4semaphore_down(&proc->term_sem);

    io_log("done waiting\n");

    /* if (use_events) // use events server
    {
      // terminate by sending an exit event
      event.len = sizeof(l4_threadid_t);
      *(l4_threadid_t*)event.str = l4_myself();
      // send exit event
      l4events_send(event_ch, &event, &event_nr, L4EVENTS_SEND_ACK);
      // get acknowledge
      l4events_get_ack(&event_nr, L4_IPC_NEVER);
    } */

    io_log("event notification sent\n");

    // unregister at names
    if (!names_unregister_task(sysinit_id))
        io_log("Cannot unregister at name server!\n");

    // destroy proc/PTDA
    PrcDestroy(proc);

    // destroy global environment
    destroy_env(env);

    io_log("OS/2 Server ended\n");
    // terminate OS/2 Server
    exit(rc);

    return rc;
}