Esempio n. 1
0
void pvm_restart_connection( pvm_object_t o )
{
    struct data_area_4_connection *da = pvm_object_da( o, connection );
printf("restarting connection");
    da->kernel = 0;

#warning restart!
}
Esempio n. 2
0
void pvm_backtrace(struct data_area_4_thread *tda)
{
    struct pvm_code_handler *code = &tda->code;

    if(code->IP > code->IP_max)
    {
        printf("pvm_backtrace IP > IP_Max!\n");
        return;
    }

    printf("pvm_backtrace thread IP %d\n", code->IP);

    printf("pvm_backtrace thread this:\n");
    pvm_object_dump(tda->_this_object);
    printf("\n\n");

    pvm_object_t sframe = tda->call_frame;

    while( !pvm_is_null(sframe) )
    {
        //if( !pvm_object_class_is(sframe, pvm_get_stack_frame_class()) ) ??!

        struct data_area_4_call_frame *fda = pvm_object_da(sframe,call_frame);

        printf("pvm_backtrace frame:\n");
        pvm_object_dump(sframe);
        printf("\n");

        printf("pvm_backtrace frame this:\n");
        pvm_object_t thiso = fda->this_object;
        pvm_object_dump(thiso);
        printf("\n");

        printf("pvm_backtrace frame IP: %d\n", fda->IP);

        pvm_object_t tclass = thiso.data->_class;
        int ord = fda->ordinal;

        int lineno = pvm_ip_to_linenum(tclass, ord, fda->IP);
        if( lineno >= 0 )
        {
            pvm_object_t mname = pvm_get_method_name( tclass, ord );

            pvm_object_print(mname);
            printf(":%d\n", lineno);
        }

        printf("\n\n");
        sframe = fda->prev;
    }

}
Esempio n. 3
0
static void start_new_vm_thread(struct pvm_object new_thread)
{
    args_used++;

    //int tid = hal_start_thread(thread_run_func, &new_thread, THREAD_FLAG_VM|THREAD_FLAG_USER);
    int tid = hal_start_thread(thread_run_func, &new_thread, THREAD_FLAG_VM);

    struct data_area_4_thread *tda = pvm_object_da( new_thread, thread );
    tda->tid = tid;

    t_set_owner( tid, new_thread.data );
    //phantom_thread_t *t = get_thread(tid);
    //t->owner = new_thread.data;

    while(args_used > 0)
        hal_sleep_msec(1);

    if(tda->sleep_flag)
    {
        //timedcall_t *e = &(tda->timer);
        net_timer_event *e = &(tda->timer);

        int didit = 0;

        if( e->pending )
        {
            bigtime_t msecMore = e->sched_time - hal_system_time();

            msecMore /= 1000;

            if( msecMore > 0 )
            {
                // Thread is sleeping on timer, reactivate wakeup
                phantom_wakeup_after_msec( msecMore, tda );
            }
            else
            {
                // Sleep time is passed, just wake
                SYSCALL_WAKE_THREAD_UP(tda);
            }
            didit = 1;
        }

        if(!didit)
        {
            SHOW_ERROR( 0, "Sleeping VM thread has no means to wakeup (%p)", new_thread.data );
        }

    }
}
Esempio n. 4
0
void pvm_gc_iter_directory(gc_iterator_call_t func, struct pvm_object_storage * os, void *arg)
{
    struct data_area_4_directory      *da = (struct data_area_4_directory *)os->da;

    struct data_area_4_binary *bin = pvm_object_da( da->container, binary );

    void *bp = bin->data;
    int i;
    for( i = 0; i < da->nEntries; i++, bp += da->elSize )
    {
        gc_fcall( func, arg, *((pvm_object_t*)bp) );
    }

    gc_fcall( func, arg, da->container );
}
Esempio n. 5
0
void pvm_restart_window( pvm_object_t o )
{
    struct data_area_4_window *da = pvm_object_da( o, window );

    printf("restart WIN\n");

    da->w.title = da->title; // must be correct in snap? don't reset?

    queue_init(&(da->w.events));
    da->w.events_count = 0;

    drv_video_window_enter_allwq( &da->w );

    //event_q_put_win( 0, 0, UI_EVENT_WIN_REPAINT, &da->w );
    ev_q_put_win( 0, 0, UI_EVENT_WIN_REDECORATE, &da->w );
}
Esempio n. 6
0
void pvm_restart_tty( pvm_object_t o )
{
    struct data_area_4_tty *tty = pvm_object_da( o, tty );

    printf( "restart TTY %p\n", tty );

    tty->w.title = tty->title; // need? must be correct in snap

    // BUG! How do we fill owner? We must have object ref here
    tty->w.inKernelEventProcess = 0;
    tty->w.owner = -1;

    queue_init(&(tty->w.events));
    tty->w.events_count = 0;

    drv_video_window_enter_allwq( &tty->w );

    //event_q_put_win( 0, 0, UI_EVENT_WIN_REPAINT, &tty->w );
    //event_q_put_win( 0, 0, UI_EVENT_WIN_REDECORATE, &tty->w );
}
Esempio n. 7
0
struct pvm_object pvm_weakref_get_object(struct pvm_object wr )
{
    struct data_area_4_weakref *da = pvm_object_da( wr, weakref );
    struct pvm_object out;

    // still crashes :(

    // HACK HACK HACK BUG - wiring target too. TODO need wire size parameter for page cross situations!
    wire_page_for_addr( &(da->object) );
    wire_page_for_addr( da->object.data );

    // All we do is return new reference to our object,
    // incrementing refcount before

#if WEAKREF_SPIN
    wire_page_for_addr( &da->lock );
    int ie = hal_save_cli();
    hal_spin_lock( &da->lock );
#else
    hal_mutex_lock( &da->mutex );
#endif

    // TODO should we check refcount before and return null if zero?
    if( 0 == da->object.data->_ah.refCount )
        printf("zero object in pvm_weakref_get_object\n");

    out = ref_inc_o( da->object );

#if WEAKREF_SPIN
    hal_spin_unlock( &da->lock );
    if( ie ) hal_sti();
    unwire_page_for_addr( &da->lock );
#else
    hal_mutex_unlock( &da->mutex );
#endif

    unwire_page_for_addr( da->object.data );
    unwire_page_for_addr( &(da->object) );

    return out;
}
Esempio n. 8
0
static pvm_object_t cn_url_blocking_syscall_worker( pvm_object_t conn, struct data_area_4_thread *tc, int nmethod, pvm_object_t arg )
{
    (void) conn;
    (void) tc;
    (void) arg;

    struct data_area_4_connection *c = pvm_object_da( conn, connection );

    //struct cn_url_volatile   *vp = c->v_kernel_state;
    struct cn_url_persistent *pp = c->p_kernel_state;

    char buf[4096];

    errno_t e = 0;


    switch( nmethod )
    {
    default:
    case CONN_OP_READ:
        e = net_curl( pp->url, buf, sizeof(buf) );
        break;

    case CONN_OP_WRITE:
    case CONN_OP_BIND:
        e = ENOSYS;
        break;
    }


//ret:
    if( e )
    {
        SHOW_ERROR( 1, "err %d", e );
        // err_ret:
        return pvm_create_string_object("");
    }

    char *bp = buf;

    // Skip HTTP headers

    for( ; *bp ; bp++ )
    {
        if( (bp[0] == '\r') && (bp[1] == '\n') && (bp[2] == '\r') && (bp[3] == '\n') )
        {
            bp += 4;
            goto done;
        }

        if( (bp[0] == '\n') && (bp[1] == '\n') )
        {
            bp += 2;
            goto done;
        }
    }
    // fall through if no headers, ignore?
    SHOW_ERROR( 1, "no headers in '%s'", buf );
    // goto err_ret;

done:
    return pvm_create_string_object(bp);
}
Esempio n. 9
0
static pvm_object_t cn_udp_blocking_syscall_worker( pvm_object_t conn, struct data_area_4_thread *tc, int nmethod, pvm_object_t arg )
{
    (void) conn;
    (void) tc;
    (void) arg;

    struct data_area_4_connection *c = pvm_object_da( conn, connection );
    struct cn_udp_volatile *vp = c->v_kernel_state;



    errno_t e = ENOSYS;
    int ret = 0;


    if( !vp->udp_endpoint )
    {
        e = ENOTCONN;
        goto ret;
    }


    switch( nmethod )
    {
    default:
    case CONN_OP_READ:
    case CONN_OP_WRITE:
        e = ENOSYS;
        break;

#if HAVE_NET

    case CONN_OP_BIND:
        {
            if(!IS_PHANTOM_INT(arg))
            {
                SHOW_ERROR0( 1, "bind arg not int" );
                e = EINVAL;
                break;
            }

            i4sockaddr a;

            a.port = pvm_get_int(arg);

            if( udp_bind(vp->udp_endpoint, &a) )
                e = EISCONN;
            else
                e = 0;
            break;
        }
#endif // HAVE_NET

    }


ret:
    if( e )
    {
        SHOW_ERROR( 1, "err %d", e );
        return pvm_create_int_object(-e);
    }


    return pvm_create_int_object(ret);
}