Exemplo n.º 1
0
void RedScreen::on_layer_changed(ScreenLayer& layer)
{
    Lock lock(_layer_changed_lock);
    if (_active_layer_change_event) {
        return;
    }
    _active_layer_change_event = true;
    AutoRef<LayerChangedEvent> change_event(new LayerChangedEvent(_id));
    _owner.push_event(*change_event);
}
Exemplo n.º 2
0
MBconn*
master_connect_backup(BackupItem *bitem)
{
    char    *ip;
    int     write_port;
    MBconn  *mbconn;
    WThread *wt = g_runtime->wthread;
    //int     error = 0;
    
    ip = bitem->ip;
    write_port = bitem->write_port;
    if (bitem->mbconn && bitem->mbconn->sock > 0) {
        DINFO("=====================destroy mbconn\n");
        //bitem->mbconn->destroy((Conn *)bitem->mbconn);
        mb_conn_destroy_delay((Conn *)bitem->mbconn);
        bitem->state = STATE_NOWRITE;
        bitem->mbconn = NULL;
    }

    mbconn = (MBconn *)conn_client_create(ip, write_port, sizeof(MBconn));
    if (mbconn == NULL) {
        DERROR("can not create mbconn struct\n");
        return NULL;
    }
    DINFO("mbconn->rbuf: %p\n", mbconn->rbuf);
    
    mbconn->item    = bitem; 
    mbconn->thread  = wt;
    mbconn->destroy = mb_conn_destroy_delay;
    mbconn->base    = wt->base;
    bitem->state    = STATE_NOWRITE; 
    mbconn->ready   = mb_data_ready;
    mbconn->wrote   = mb_conn_wrote;
    
    Conn *conn = (Conn *)mbconn;
    char *buffer = conn_write_buffer(conn, 1024);
    int count;

    g_cf->heartbeat_port = 30000;
    count = pack(buffer, 0, "$4ciiii", CMD_GETPORT, g_cf->write_port, g_cf->read_port, g_cf->sync_port, g_cf->heartbeat_port);
    //DINFO("--------------------count:%d\n", count);
    conn->wlen = count;
    change_event((Conn *)mbconn, EV_WRITE|EV_PERSIST, 0, 1); 

    return mbconn;
}
Exemplo n.º 3
0
Arquivo: poll.c Projeto: h-sun/miss
// Called to shutdown the current program. If the program has
// shutdown hooks then these will be initiated, if not the
// program will be terminated. The abort parameter controls what
// happens if shutdown is already in progress. If it is true and
// the shutdown sequence is already in progress then this will be
// aborted and the program terminated.
//
void shutdown_program(boolean abort)
{
  // Search for a thread waiting for a shutdown event.
  int i;
  for(i = 0; i < eventCnt; i++)
  {
    NXTEvent *event = events[i];
    if (event->typ == SYSTEM_EVENT && event->filter == SHUTDOWN)
    {
      // if a process is waiting the shutdown process has not started, so start it
      if (event->state == WAITING)
        change_event(event, SHUTDOWN, 0);
      else
        // process already underway, should we abort?
        if (abort)
          break;
      return;
    }
  }
  // no thread waiting so just shut things down...
  schedule_request(REQUEST_EXIT);
}
Exemplo n.º 4
0
int
master_ready(Conn *conn, char *data, int datalen)
{
    WThread *wt = g_runtime->wthread;
    //int ret;
    int lastlogver, lastlogline;
    //int lastret;

    commitlog_read(wt->clog, &lastlogver, &lastlogline);
    DINFO("=======lastlogver: %d, lastlogline: %d\n", lastlogver, lastlogline);
    //DNOTE("=======lastlogver: %d, lastlogline: %d\n", lastlogver, lastlogline);
    //写本地commitlog
    //commitlog_write(wt->clog, g_runtime->synclog->version, g_runtime->synclog->index_pos, 
        //data, datalen);

    int newlogver, newlogline;

    //commitlog_read(wt->clog, &newlogver, &newlogline);
    newlogver = g_runtime->synclog->version;
    newlogline = g_runtime->synclog->index_pos;

    //DNOTE("=======newlogver: %d, newlogline: %d\n", newlogver, newlogline);
    DINFO("=======newlogver: %d, newlogline: %d\n", newlogver, newlogline);
    //DNOTE("in synclog version: %d, logline: %d\n", g_runtime->synclog->version,   g_runtime->synclog->index_pos);
    DINFO("in synclog version: %d, logline: %d\n", g_runtime->synclog->version,   g_runtime->synclog->index_pos);
    /* 
    int dlen = wt->clog->len + sizeof(char);
    char *buffer = conn_write_buffer(conn, dlen); 
    
    ret = pack(buffer, 0, "$4cC", dlen, CMD_WRITE, wt->clog->len, wt->clog->data); 
    */
    BackupInfo *binfo = wt->backup_info;
    BackupItem *bitem  = binfo->item;
    
    //保存客户端命令
    pack(binfo->cltcmd, 0, "ii", newlogver, newlogline);
    memcpy(binfo->cltcmd+sizeof(int)*2, data, datalen);
    binfo->cmdlen = datalen + sizeof(int)*2;

    //binfo->done = 0;
    binfo->succ = 0;
    
    DINFO("state: %d, succ: %d\n", wt->state, binfo->succ);
    //系统不可用
    if (wt->state == STATE_NOCONN) {
        conn_send_buffer_reply(conn, MEMLINK_ERR_NOWRITE, NULL, 0); 
        return 0;
    }
    
    //while (binfo->timer_send == TRUE) {
    //}

    binfo->ctlconn = conn;
    DINFO("need send comand to all backup\n");
    while (bitem) {
        if(bitem->state == STATE_ALLREADY) {
            Conn *conn = (Conn *)bitem->mbconn;
            //DNOTE("-------------------wlen: %d, wpos: %d\n", conn->wlen, conn->wpos);
            DINFO("-------------------wlen: %d, wpos: %d\n", conn->wlen, conn->wpos);
            char *buffer = conn_write_buffer(conn, 2048);
            int  count;
            int  ret;
            
            DINFO("clog->len: %d\n", wt->clog->len);
            //count = pack(buffer, 0, "$4ciiiC:4", CMD_WRITE, lastlogver, lastlogline, wt->clog->state, wt->clog->len , wt->clog->data);
            count = pack(buffer, 0, "$4ciiiC:4", CMD_WRITE, lastlogver, lastlogline, wt->clog->state, binfo->cmdlen, binfo->cltcmd);
            int lastver, lastline, lastret, logver, logline;
            
            unpack(buffer+sizeof(int)+sizeof(char), 0, "iii", &lastver, &lastline, &lastret);
            DINFO("lastver: %d, lastline: %d, lastret: %d\n", lastver, lastline,
                lastret);

            unpack(buffer+sizeof(int)*5+sizeof(char), 0, "ii", &logver, &logline);
            DINFO("unpack logver: %d, logline: %d\n", logver, logline);
            conn->wlen = count;
            
            DINFO("change event to write\n");
            //DNOTE("change event to write\n");
            ret = change_event((Conn *)bitem->mbconn, EV_WRITE | EV_PERSIST, 0, 0);
            /*
            if (ret < 0) {
                DERROR("change_event error: %d, %s:%d\n", ret, bitem->ip, bitem->write_port);
                Conn *conn = (Conn *)bitem->mbconn;
                conn->destroy((Conn *)bitem->mbconn);
                binfo->succ_conns--;
            }
            */
        }
        bitem = bitem->next;
    }
    
    DINFO("=======add timer check event\n");
    struct timeval tm;
    evtimer_set(&binfo->timer_check_evt, mb_data_timeout, conn);
    evutil_timerclear(&tm);
    tm.tv_sec = 1;
    event_base_set(wt->base, &binfo->timer_check_evt);
    event_add(&binfo->timer_check_evt, &tm);

    return 0;
}
Exemplo n.º 5
0
int
request_vote(uint64_t id, unsigned char idflag, uint64_t voteid, unsigned short port)
{
    struct sockaddr_in s;
    int fd;
    int ret;
    char err[ERRBUFLEN];

    DINFO("*** VOTE REQUEST: id: %llu, idflag: %d, voteid: %llu, port: %d\n",
          (unsigned long long)id, idflag, (unsigned long long)voteid, port);

    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1) {
        strerror_r(errno, err, ERRBUFLEN);
        DERROR("*** VOTE: create socket error: %s\n", err);
        return -1;
    }

    if (set_nonblock(fd) == -1) {
        close(fd);
        return -1;
    }

    VoteConn *conn = (VoteConn *)zz_malloc(sizeof(VoteConn));
    if (conn == NULL) {
        DERROR("*** VOTE: conn malloc error.\n");
        MEMLINK_EXIT;
    }

    memset(conn, 0, sizeof(VoteConn));
    conn->rbuf = (char *)zz_malloc(CONN_MAX_READ_LEN);
    if (conn->rbuf == NULL) {
        DERROR("*** VOTE: rbuf malloc error.\n");
        MEMLINK_EXIT;
    }
    /*
        conn->wbuf = (char *)zz_malloc(CONN_MAX_READ_LEN);
        if (conn->wbuf == NULL) {
            DERROR("*** VOTE: wbuf malloc error.\n");
            MEMLINK_EXIT;
        }
    */
    conn->wbuf = conn->rbuf;
    conn->rsize = CONN_MAX_READ_LEN;
    conn->wsize = CONN_MAX_READ_LEN;
    conn->sock = fd;
    conn->destroy = vote_destroy;
    conn->wrote = conn_wrote;
    conn->ready = vote_ready;
    conn->timeout = vote_timeout;
    conn->read = conn_event_read;
    conn->write = conn_event_write;
    conn->base = g_runtime->wthread->base;

    conn->vote_status = VOTE_REQUEST;
    //conn->thread = &conn->status;

    strcpy(conn->client_ip, g_cf->vote_host);
    conn->client_port = g_cf->vote_port;

    conn->id = id;
    conn->idflag = idflag;
    conn->voteid = voteid;
    conn->wport = port;
    conn->wlen = cmd_vote_pack(conn->wbuf, id, idflag, voteid, port);

    bzero(&s, sizeof(s));
    s.sin_family = AF_INET;

    //strcpy(g_cf->vote_host, VOTE_HOST);
    //g_cf->vote_port = VOTE_PORT;

    inet_pton(AF_INET, g_cf->vote_host, &s.sin_addr);
    s.sin_port = htons(g_cf->vote_port);

    int flag = 1;
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
    ret = connect(fd, (struct sockaddr *)&s, sizeof(s));
    if (ret == -1) {
        if (errno != EINPROGRESS && errno != EINTR) {
            strerror_r(errno, err, ERRBUFLEN);
            DERROR("*** VOTE: connect error: %s\n", err);
            conn->destroy((Conn *)conn);
            return -1;
        }
    }

    if (change_event((Conn *)conn, EV_WRITE|EV_PERSIST, g_cf->timeout, 1) < 0) {
        DERROR("*** VOTE: change_event error\n");
        conn->destroy((Conn *)conn);
        return -1;
    }

    return 0;
}
Exemplo n.º 6
0
int
vote_ready(Conn *conn, char *buf, int datalen)
{
    short retcode;
    uint8_t cmd;
    int count = sizeof(int);
    char ip[INET_ADDRSTRLEN];
    uint16_t port;
    uint64_t voteid;

    memcpy(&cmd, buf+count, sizeof(cmd));
    count += sizeof(cmd);
    if (g_cf->sync_mode == MODE_MASTER_SLAVE) {
        conn_send_buffer_reply(conn, MEMLINK_ERR_SLAVE, NULL, 0);
        return 0;
    }
    switch (cmd) {
    case CMD_VOTE:
        memcpy(&retcode, buf+count, sizeof(retcode));
        count += sizeof(retcode);
        switch (retcode) {
        case CMD_VOTE_WAIT:
            DINFO("*** VOTE WAITING\n");

            int timeout = 10*g_cf->timeout;
            if (timeout < 60) {
                timeout = 60;
            } else if (timeout > 300) {
                timeout = 300;
            }
            //*((int *)conn->thread) = VOTE_WAITING;
            conn->vote_status = VOTE_WAITING;
            event_del(&conn->evt);
            change_event(conn, EV_READ|EV_PERSIST, timeout, 1);

            break;
        case CMD_VOTE_MASTER:
            DINFO("*** VOTE MASTER\n");

            /*
                                if (conn->thread != g_runtime->wthread)
                                    *((int *)conn->thread) = VOTE_OK;
            */
            conn->vote_status = VOTE_OK;
            count += unpack_voteid(buf+count, &voteid);

            if (g_cf->role == ROLE_NONE) {
                DINFO("*** master init\n");
                master_init(voteid, buf+count, datalen-count);
                g_cf->role = ROLE_MASTER;
                g_runtime->voteid = voteid;
            } else {
                DINFO("*** switch to master\n");
                if (switch_master(voteid, buf+count, datalen-count) < 0) {
                    DERROR("*** FATAL ERROR : switch to master error\n");
                    g_cf->role = ROLE_NONE;
                    g_runtime->voteid = 0;
                } else {
                    g_cf->role = ROLE_MASTER;
                    g_runtime->voteid = voteid;
                }
            }

            DINFO("*** voteid: %llu\n", (unsigned long long)g_runtime->voteid);
            DINFO("*** VOTE: I am master\n");
            while (count < datalen) {
                count += unpack_votehost(buf+count, ip, &port);
                DINFO("*** VOTE backup: %s(%d)\n", ip, port);
            }
            /*
                                Host **hostp = &g_runtime->hosts;
                                while (count < datalen) {
                                    count += unpack_votehost(buf+count, ip, &port);
                                    DINFO("*** VOTE backup: %s(%d)\n", ip, port);
                                    if (*hostp == NULL) {
                                        *hostp = (Host *)zz_malloc(sizeof(Host));
                                        strcpy((*hostp)->ip, ip);
                                        (*hostp)->port = port;
                                        (*hostp)->next = NULL;
                                        hostp = &(*hostp)->next;
                                    } else {
                                        strcpy((*hostp)->ip, ip);
                                        (*hostp)->port = port;
                                        hostp = &(*hostp)->next;
                                    }
                                }

                                if (*hostp != NULL) {
                                    release_hosts(*hostp);
                                    *hostp = NULL;
                                }
            */
            conn_send_buffer_reply(conn, MEMLINK_OK, NULL, 0);

            break;
        case CMD_VOTE_BACKUP:
            DINFO("*** VOTE BACKUP\n");
            /*
                                if (conn->thread != g_runtime->wthread)
                                    *((int *)conn->thread) = VOTE_OK;
            */
            conn->vote_status = VOTE_OK;

            count += unpack_voteid(buf+count, &voteid);
            unpack_votehost(buf+count, ip, &port);


            if (g_cf->role == ROLE_NONE) {
                DINFO("*** backup init\n");
                backup_init(voteid, buf+count, datalen-count);
                g_cf->role = ROLE_BACKUP;
                g_runtime->voteid = voteid;
            } else {
                DINFO("*** switch to backup\n");
                if (switch_backup(voteid, buf+count, datalen-count) < 0) {
                    DERROR("*** FATAL ERROR : switch to backup error\n");
                    g_cf->role = ROLE_NONE;
                    g_runtime->voteid = 0;
                } else {
                    g_cf->role = ROLE_BACKUP;
                    g_runtime->voteid = voteid;
                }
            }
            DINFO("*** VOTE: I am backup, master is %s(%d)\n", ip, port);
            DINFO("*** voteid: %llu\n", (unsigned long long)g_runtime->voteid);

            /*
                                Host *host;
                                if (g_runtime->hosts == NULL) {
                                    host = (Host *)zz_malloc(sizeof(Host));
                                    if (host == NULL) {
                                        DERROR("*** VOTE: zz_malloc error\n");
                                        MEMLINK_EXIT;
                                    }
                                    host->next = NULL;
                                    strcpy(host->ip, ip);
                                    host->port = port;
                                    g_runtime->hosts = host;
                                } else {
                                    host = g_runtime->hosts;
                                    strcpy(host->ip, ip);
                                    host->port = port;
                                    release_hosts(host->next);
                                    host->next = NULL;
                                }
            */
            conn_send_buffer_reply(conn, MEMLINK_OK, NULL, 0);

            break;
        case CMD_VOTE_NONEED:
            DINFO("*** VOTE NONEED\n");

            if (g_cf->role == ROLE_NONE) {
                //*((int *)conn->thread) = VOTE_CONTINUE;
                conn->vote_status = VOTE_CONTINUE;
                break;
            }

            //*((int *)conn->thread) = VOTE_OK;
            conn->vote_status = VOTE_OK;
            backup_create_heartbeat(g_runtime->wthread);

            break;
        case MEMLINK_ERR_VOTE_PARAM:
            DERROR("*** VOTE PARAM ERROR\n");

            //*((int *)conn->thread) = VOTE_ERR_PARAM;
            conn->vote_status = VOTE_ERR_PARAM;

            break;
        default:
            DERROR("*** VOTE UNKNOWN ERROR\n");
            //if (conn->thread != g_runtime->wthread)
            //    *((int *)conn->thread) = VOTE_OK;
            conn->vote_status = VOTE_OK;

            break;
        }
        break;
    case CMD_VOTE_UPDATE:
        DINFO("*** VOTE UPDATING\n");
        if (g_cf->role != ROLE_MASTER) {
            conn_send_buffer_reply(conn, MEMLINK_ERR_NOT_MASTER, NULL, 0);
            break;
        }
        //DINFO("*** VOTE MASTER\n");
        /*
                    if (conn->thread != g_runtime->wthread)
                        *((int *)conn->thread) = VOTE_OK;
        */
        //conn->vote_status = VOTE_OK;

        count += unpack_voteid(buf+count, &voteid);
        DINFO("*** voteid: %llu\n", (unsigned long long)voteid);
        DINFO("*** VOTE: I am master\n");

        g_cf->role = ROLE_MASTER;
        g_runtime->voteid = voteid;

        mb_binfo_update(voteid, buf+count, datalen-count);

        while (count < datalen) {
            count += unpack_votehost(buf+count, ip, &port);
            DINFO("*** VOTE backup: %s(%d)\n", ip, port);
        }
        /*
                    Host **hostp = &g_runtime->hosts;
                    while (count < datalen) {
                        count += unpack_votehost(buf+count, ip, &port);
                        DINFO("*** backup: %s(%d)\n", ip, port);
                        if (*hostp == NULL) {
                            *hostp = (Host *)zz_malloc(sizeof(Host));
                            strcpy((*hostp)->ip, ip);
                            (*hostp)->port = port;
                            (*hostp)->next = NULL;
                            hostp = &(*hostp)->next;
                        } else {
                            strcpy((*hostp)->ip, ip);
                            (*hostp)->port = port;
                            hostp = &(*hostp)->next;
                        }
                    }

                    if (*hostp != NULL) {
                        release_hosts(*hostp);
                        *hostp = NULL;
                    }
        */
        conn_send_buffer_reply(conn, MEMLINK_OK, NULL, 0);

        break;
    case CMD_VOTE_DETECT:
        DINFO("*** VOTE DETECT\n");
        if (g_cf->role == ROLE_MASTER) {
            retcode = CMD_VOTE_MASTER;
        } else if (g_cf->role == ROLE_BACKUP) {
            retcode = CMD_VOTE_BACKUP;
        } else {
            retcode = MEMLINK_ERR_NO_ROLE;
        }
        conn_send_buffer_reply(conn, retcode, (char *)&g_runtime->voteid, sizeof(g_runtime->voteid));

        break;
    default:
        break;
    }
    return 0;
}
Exemplo n.º 7
0
/**
 * NOTE: The technique is not the same as that used in TinyVM.
 * The return value indicates the impact of the call on the VM
 * system. EXEC_CONTINUE normal return the system should return to the return
 * address provided by the VM. EXEC_RUN The call has modified the value of
 * VM PC and this should be used to restart execution. EXEC_RETRY The call
 * needs to be re-tried (typically for a GC failure), all global state
 * should be left intact, the PC has been set appropriately.
 *
 */
int dispatch_native(TWOBYTES signature, STACKWORD * paramBase)
{
  STACKWORD p0 = paramBase[0];
  switch (signature) {
  case wait_4_5V:
    return monitor_wait((Object *) word2ptr(p0), 0);
  case wait_4J_5V:
    return monitor_wait((Object *) word2ptr(p0), ((int)paramBase[1] > 0 ? 0x7fffffff : paramBase[2]));
  case notify_4_5V:
    return monitor_notify((Object *) word2ptr(p0), false);
  case notifyAll_4_5V:
    return monitor_notify((Object *) word2ptr(p0), true);
  case start_4_5V:
    // Create thread, allow for instruction restart
    return init_thread((Thread *) word2ptr(p0));
  case yield_4_5V:
    schedule_request(REQUEST_SWITCH_THREAD);
    break;
  case sleep_4J_5V:
    sleep_thread(((int)p0 > 0 ? 0x7fffffff : paramBase[1]));
    schedule_request(REQUEST_SWITCH_THREAD);
    break;
  case getPriority_4_5I:
    push_word(get_thread_priority((Thread *) word2ptr(p0)));
    break;
  case setPriority_4I_5V:
    {
      STACKWORD p = (STACKWORD) paramBase[1];

      if (p > MAX_PRIORITY || p < MIN_PRIORITY)
	return throw_new_exception(JAVA_LANG_ILLEGALARGUMENTEXCEPTION);
      else
	set_thread_priority((Thread *) word2ptr(p0), p);
    }
    break;
  case currentThread_4_5Ljava_3lang_3Thread_2:
    push_ref(ptr2ref(currentThread));
    break;
  case interrupt_4_5V:
    interrupt_thread((Thread *) word2ptr(p0));
    break;
  case interrupted_4_5Z:
    {
      JBYTE i = currentThread->interruptState != INTERRUPT_CLEARED;

      currentThread->interruptState = INTERRUPT_CLEARED;
      push_word(i);
    }
    break;
  case isInterrupted_4_5Z:
    push_word(((Thread *) word2ptr(p0))->interruptState
	      != INTERRUPT_CLEARED);
    break;
  case join_4_5V:
    join_thread((Thread *) word2ptr(p0), 0);
    break;
  case join_4J_5V:
    join_thread((Thread *) word2obj(p0), paramBase[2]);
    break;
  case halt_4I_5V:
    schedule_request(REQUEST_EXIT);
    break;
  case shutdown_4_5V:
    shutdown_program(false);
    break;
  case currentTimeMillis_4_5J:
    push_word(0);
    push_word(systick_get_ms());
    break;
  case readSensorValue_4I_5I:
    push_word(sp_read(p0, SP_ANA));
    break;
  case setPowerTypeById_4II_5V:
    sp_set_power(p0, paramBase[1]);
    break;
  case freeMemory_4_5J:
    push_word(0);
    push_word(getHeapFree());
    break;
  case totalMemory_4_5J:
    push_word(0);
    push_word(getHeapSize());
    break;
  case floatToRawIntBits_4F_5I:	// Fall through
  case intBitsToFloat_4I_5F:
    push_word(p0);
    break;
  case doubleToRawLongBits_4D_5J:	// Fall through
  case longBitsToDouble_4J_5D:
    push_word(p0);
    push_word(paramBase[1]);
    break;
  case drawString_4Ljava_3lang_3String_2II_5V:
    {
      String *p = (String *)word2obj(p0);
      Object *charArray;
      if (!p) return throw_new_exception(JAVA_LANG_NULLPOINTEREXCEPTION);
      charArray = (Object *) word2ptr(get_word_4_ns(fields_start(p)));
      if (!charArray) return throw_new_exception(JAVA_LANG_NULLPOINTEREXCEPTION);
      display_goto_xy(paramBase[1], paramBase[2]);
      display_jstring(p);
    }
    break;
  case drawInt_4III_5V:
    display_goto_xy(paramBase[1], paramBase[2]);
    display_int(p0, 0);
    break;
  case drawInt_4IIII_5V:
     display_goto_xy(paramBase[2], paramBase[3]);
     display_int(p0, paramBase[1]);
    break;   
  case asyncRefresh_4_5V:
    display_update();
    break;
  case clear_4_5V:
    display_clear(0);
    break;
  case getDisplay_4_5_1B:
    push_word(display_get_array());
    break;
  case setAutoRefreshPeriod_4I_5I:
    push_word(display_set_auto_update_period(p0));
    break;
  case getRefreshCompleteTime_4_5I:
    push_word(display_get_update_complete_time());
    break;
  case bitBlt_4_1BIIII_1BIIIIIII_5V:
    {
      Object *src = word2ptr(p0);
      Object *dst = word2ptr(paramBase[5]);
      display_bitblt((byte *)(src != NULL ?jbyte_array(src):NULL), paramBase[1], paramBase[2], paramBase[3], paramBase[4], (byte *)(dst!=NULL?jbyte_array(dst):NULL), paramBase[6], paramBase[7], paramBase[8], paramBase[9], paramBase[10], paramBase[11], paramBase[12]);
      break;
    }
  case getSystemFont_4_5_1B:
    push_word(display_get_font());
    break;
  case setContrast_4I_5V:
    nxt_lcd_set_pot(p0);
    break;
  case getBatteryStatus_4_5I:
    push_word(battery_voltage());
    break;
  case getButtons_4_5I:
    push_word(buttons_get());
    break;
  case getTachoCountById_4I_5I:
    push_word(nxt_motor_get_count(p0));
    break;
  case controlMotorById_4III_5V:
    nxt_motor_set_speed(p0, paramBase[1], paramBase[2]); 
    break;
  case resetTachoCountById_4I_5V:
    nxt_motor_set_count(p0, 0);
    break;
  case i2cEnableById_4II_5V:
    if (i2c_enable(p0, paramBase[1]) == 0)
      return EXEC_RETRY;
    else
      break;
  case i2cDisableById_4I_5V:
    i2c_disable(p0);
    break;
  case i2cStatusById_4I_5I:
    push_word(i2c_status(p0));
    break;
  case i2cStartById_4II_1BIII_5I:
    {
    	Object *p = word2obj(paramBase[2]);
    	JBYTE *byteArray = p ? jbyte_array(p) + paramBase[3] : NULL;
    	push_word(i2c_start(p0,
    	                    paramBase[1],
    	                    (U8 *)byteArray,
    	                    paramBase[4],
    	                    paramBase[5]));
    }
    break; 
  case i2cCompleteById_4I_1BII_5I:
    {
    	Object *p = word2ptr(paramBase[1]);
    	JBYTE *byteArray = p ? jbyte_array(p) + paramBase[2] : NULL;
    	push_word(i2c_complete(p0,
    	                       (U8 *)byteArray,
    	                       paramBase[3]));
    }
    break; 
  case playFreq_4III_5V:
    sound_freq(p0,paramBase[1], paramBase[2]);
    break;
  case btGetBC4CmdMode_4_5I:
    push_word(bt_get_mode());
    break;
  case btSetArmCmdMode_4I_5V:
    if (p0 == 0) bt_set_arm7_cmd();
    else bt_clear_arm7_cmd(); 
    break;
  case btSetResetLow_4_5V:
    bt_set_reset_low();
    break;
  case btSetResetHigh_4_5V:
    bt_set_reset_high();
    break;
  case btWrite_4_1BII_5I:
    {
      Object *p = word2ptr(p0);
      byte *byteArray = (byte *) jbyte_array(p);
      push_word(bt_write(byteArray, paramBase[1], paramBase[2]));                      
    }
    break;
  case btRead_4_1BII_5I:
    {
      Object *p = word2ptr(p0);
      byte *byteArray = (byte *) jbyte_array(p);
      push_word(bt_read(byteArray, paramBase[1], paramBase[2]));                      
    }
    break;
  case btPending_4_5I:
    {
      push_word(bt_event_check(0xffffffff));
    }
    break;
  case btEnable_4_5V:
    if (bt_enable() == 0)
      return EXEC_RETRY;
    else
      break;
  case btDisable_4_5V:
    bt_disable();
    break;
  case usbRead_4_1BII_5I:
     {
      Object *p = word2ptr(p0);
      byte *byteArray = (byte *) jbyte_array(p);
      push_word(udp_read(byteArray,paramBase[1], paramBase[2]));
    } 
    break;
  case usbWrite_4_1BII_5I:
     {
      Object *p = word2ptr(p0);
      byte *byteArray = (byte *) jbyte_array(p);
      push_word(udp_write(byteArray,paramBase[1], paramBase[2]));                      
    }
    break; 
  case usbStatus_4_5I:
    {
      push_word(udp_event_check(0xffffffff));
    }
    break;
  case usbEnable_4I_5V:
    {
      udp_enable(p0);
    }
    break;
  case usbDisable_4_5V:
    {
      udp_disable();
    }
    break;
  case usbReset_4_5V:
    udp_reset();
    break; 
  case usbSetSerialNo_4Ljava_3lang_3String_2_5V: 
    {
      byte *p = word2ptr(p0);
      int len;
      Object *charArray = (Object *) word2ptr(get_word_4_ns(fields_start(p)));

      len = get_array_length(charArray);
      udp_set_serialno((U8 *)jchar_array(charArray), len);
    }
    break;
  case usbSetName_4Ljava_3lang_3String_2_5V:
    {
      byte *p = word2ptr(p0);
      int len;
      Object *charArray = (Object *) word2ptr(get_word_4_ns(fields_start(p)));

      len = get_array_length(charArray);
      udp_set_name((U8 *)jchar_array(charArray), len);
    }
    break;
  case flashWritePage_4_1BI_5I:
    {
      Object *p = word2ptr(p0);
      unsigned long *intArray = (unsigned long *) jint_array(p);
      push_word(flash_write_page(intArray,paramBase[1]));                      
    }
    break;
  case flashReadPage_4_1BI_5I:
    {
      Object *p = word2ptr(p0);
      unsigned long *intArray = (unsigned long *) jint_array(p);
      push_word(flash_read_page(intArray,paramBase[1]));                      
    }
    break;
  case flashExec_4II_5I:
    push_word(run_program((byte *)(&FLASH_BASE[(p0*FLASH_PAGE_SIZE)]), paramBase[1]));
    break;
  case playSample_4IIIII_5V:
    sound_play_sample(((unsigned char *) &FLASH_BASE[(p0*FLASH_PAGE_SIZE)]) + paramBase[1],paramBase[2],paramBase[3],paramBase[4]);
    break;
  case playQueuedSample_4_1BIIII_5I:
    push_word(sound_add_sample((U8 *)jbyte_array(word2obj(p0)) + paramBase[1],paramBase[2],paramBase[3],paramBase[4]));
    break;
  case getTime_4_5I:
    push_word(sound_get_time());
    break;
  case getDataAddress_4Ljava_3lang_3Object_2_5I:
    if (is_array(word2obj(p0)))
      push_word (ptr2word ((byte *) array_start(word2ptr(p0))));
    else
      push_word (ptr2word ((byte *) fields_start(word2ptr(p0))));
    break;
  case getObjectAddress_4Ljava_3lang_3Object_2_5I:
    push_word(p0);
    break;
  case gc_4_5V:
    // Restartable garbage collection
    return garbage_collect();
  case shutDown_4_5V:
    shutdown(); // does not return
  case boot_4_5V:
    display_clear(1);
    while (1) nxt_avr_firmware_update_mode(); // does not return 
  case arraycopy_4Ljava_3lang_3Object_2ILjava_3lang_3Object_2II_5V:
    return arraycopy(word2ptr(p0), paramBase[1], word2ptr(paramBase[2]), paramBase[3], paramBase[4]);
  case executeProgram_4I_5V:
    // Exceute program, allow for instruction re-start
    return execute_program(p0);
  case setDebug_4_5V:
    set_debug(word2ptr(p0));
    break;
  case eventOptions_4II_5I:
    {
      byte old = debugEventOptions[p0];
      debugEventOptions[p0] = (byte)paramBase[1];
      push_word(old);
    }
    break;
  case suspendThread_4Ljava_3lang_3Object_2_5V:
    suspend_thread(ref2ptr(p0));
    break;
  case resumeThread_4Ljava_3lang_3Object_2_5V:
    resume_thread(ref2ptr(p0));
    break;
  case getProgramExecutionsCount_4_5I:
    push_word(gProgramExecutions);
    break;
  case getFirmwareRevision_4_5I:
    push_word((STACKWORD) getRevision());
    break;
  case getFirmwareRawVersion_4_5I:
    push_word((STACKWORD) VERSION_NUMBER); 
    break;
  case hsEnable_4II_5V:
    {
      if (hs_enable((int)p0, (int)paramBase[1]) == 0)
        return EXEC_RETRY;
    }
    break;
  case hsDisable_4_5V:
    {
      hs_disable();
    }
    break;
  case hsWrite_4_1BII_5I:
    {
      Object *p = word2ptr(p0);
      byte *byteArray = (byte *) jbyte_array(p);
      push_word(hs_write(byteArray, paramBase[1], paramBase[2]));                      
    }
    break;
  case hsRead_4_1BII_5I:
    {
      Object *p = word2ptr(p0);
      byte *byteArray = (byte *) jbyte_array(p);
      push_word(hs_read(byteArray, paramBase[1], paramBase[2]));                      
    }
    break;
  case hsPending_4_5I:
    {
      push_word(hs_pending());
    }
    break;
  case hsSend_4BB_1BII_1C_5I:
    {
      Object *p = word2ptr(paramBase[2]);
      U8 *data = (U8 *)jbyte_array(p);
      p = word2ptr(paramBase[5]);
      U16 *crc = (U16 *)jchar_array(p);
      push_word(hs_send((U8) p0, (U8)paramBase[1], data, paramBase[3], paramBase[4], crc));
    }
    break;
  case hsRecv_4_1BI_1CI_5I:
    {
      Object *p = word2ptr(p0);
      U8 *data = (U8 *)jbyte_array(p);
      p = word2ptr(paramBase[2]);
      U16 *crc = (U16 *)jchar_array(p);
      push_word(hs_recv(data, paramBase[1], crc, paramBase[3]));
    }
    break;
    
  case getUserPages_4_5I:
    push_word(FLASH_MAX_PAGES - flash_start_page);
    break;
  case setVMOptions_4I_5V:
    gVMOptions = p0;
    break;
  case getVMOptions_4_5I:
    push_word(gVMOptions);
    break;
  case isAssignable_4II_5Z:
    push_word(is_assignable(p0, paramBase[1]));
    break;
  case cloneObject_4Ljava_3lang_3Object_2_5Ljava_3lang_3Object_2:
    {
      Object *newObj = clone((Object *)ref2obj(p0));
      if (newObj == NULL) return EXEC_RETRY;
      push_word(obj2ref(newObj));
    }
    break;
  case memPeek_4III_5I:
    push_word(mem_peek(p0, paramBase[1], paramBase[2]));
    break;
  case memCopy_4Ljava_3lang_3Object_2IIII_5V:
    mem_copy(word2ptr(p0), paramBase[1], paramBase[2], paramBase[3], paramBase[4]);
    break;
  case memGetReference_4II_5Ljava_3lang_3Object_2:
    push_word(mem_get_reference(p0, paramBase[1]));
    break;
  case setSensorPin_4III_5V:
    sp_set(p0, paramBase[1], paramBase[2]);
    break;
  case getSensorPin_4II_5I:
    push_word(sp_get(p0, paramBase[1]));
    break;
  case setSensorPinMode_4III_5V:
    sp_set_mode(p0, paramBase[1], paramBase[2]);
    break;
  case readSensorPin_4II_5I:
    push_word(sp_read(p0, paramBase[1]));
    break;
  case nanoTime_4_5J:
    {
      U64 ns = systick_get_ns();
      push_word(ns >> 32);
      push_word(ns);
    }
    break;
  case createStackTrace_4Ljava_3lang_3Thread_2Ljava_3lang_3Object_2_5_1I:
    {
      Object *trace = create_stack_trace((Thread *)ref2obj(p0), ref2obj(paramBase[1]));
      if (trace == NULL) return EXEC_RETRY;
      push_word(obj2ref(trace));
    }
    break;
  case registerEvent_4_5I:
    push_word(register_event((NXTEvent *) ref2obj(p0)));
    break;
  case unregisterEvent_4_5I:
    push_word(unregister_event((NXTEvent *) ref2obj(p0)));
    break;
  case changeEvent_4II_5I:
    push_word(change_event((NXTEvent *) ref2obj(p0), paramBase[1], paramBase[2]));
    break;
  case isInitialized_4I_5Z:
    push_word(is_initialized_idx(p0));
    break;
  case allocate_4II_5Ljava_3lang_3Object_2:
    {
      Object *allocated;
      if(paramBase[1]>0){
        allocated=new_single_array(p0,paramBase[1]);
      }else{
        allocated=new_object_for_class(p0);
      }
      if(allocated == NULL) return EXEC_RETRY;
      push_word(obj2ref(allocated));
    }
    break;
  case memPut_4IIII_5V:
    store_word_ns((byte *)(memory_base[p0] + paramBase[1]), paramBase[2],paramBase[3]);
    break;
  case notifyEvent_4ILjava_3lang_3Thread_2_5Z:
    push_word(debug_event(paramBase[1], NULL, (Thread*) ref2obj(paramBase[2]), 0, 0, 0, 0));
    break;
  case setThreadRequest_4Ljava_3lang_3Thread_2Llejos_3nxt_3debug_3SteppingRequest_2_5V:
    {
      Thread *th = (Thread*) ref2obj(p0);
      th->debugData = (REFERENCE) paramBase[1];
      // currently we only get stepping requests
      if(paramBase[1])
        th->flags |= THREAD_STEPPING;
      else
        th->flags &= ~THREAD_STEPPING;
    }
    break;
  case isStepping_4Ljava_3lang_3Thread_2_5Z:
    {
      Thread *th = (Thread*) ref2obj(p0);
      push_word(is_stepping(th));
    }
    break;
  case setBreakpointList_4_1Llejos_3nxt_3debug_3Breakpoint_2I_5V:
    breakpoint_set_list((Breakpoint**) array_start(p0), paramBase[1]);
    break;
  case enableBreakpoint_4Llejos_3nxt_3debug_3Breakpoint_2Z_5V:
    breakpoint_enable((Breakpoint*) word2ptr(p0), (boolean) paramBase[1]);
    break;
  case firmwareExceptionHandler_4Ljava_3lang_3Throwable_2II_5V:
    firmware_exception_handler((Throwable *)p0, paramBase[1], paramBase[2]);
    break;
  case exitThread_4_5V:
    currentThread->state = DEAD;
    schedule_request(REQUEST_SWITCH_THREAD);
    break;
  case updateThreadFlags_4Ljava_3lang_3Thread_2II_5I:
    ((Thread *)p0)->flags |= paramBase[1];
    ((Thread *)p0)->flags &= ~paramBase[2];
//printf("m %x %d\n", p0, ((Thread *)p0)->flags);
    push_word(((Thread *)p0)->flags);
    break;
    
  default:
    return throw_new_exception(JAVA_LANG_NOSUCHMETHODERROR);
  }
  return EXEC_CONTINUE;
}