/* INFO: toplevel udt_clr_serialize */ int clr_serialize (int _gc_in, dk_session_t * ses) { MonoArray *v_args = NULL; MonoArray *mono_list; int len, inx; MonoDomain *domain = virtuoso_domain; get_mono_thread (); v_args = MAKE_PARAM_ARRAY (domain, 1); SET_INT_ARG (domain, v_args, 0, _gc_in); QR_RESET_CTX { mono_list = (MonoArray *) call_mono (VIRTCLR_NAME, "VInvoke:obj_serialize_soap", v_args, domain); } QR_RESET_CODE { caddr_t err; POP_QR_RESET; err = thr_get_error_code (THREAD_CURRENT_THREAD); if (ARRAYP (err)) log_error ("Mono Serialization error : [%s] [%s]", ERR_STATE(err), ERR_MESSAGE (err)); else log_error ("Mono Serialization error : unknown"); dk_free_tree (err); goto no_obj; } END_QR_RESET; len = mono_array_length (mono_list); if (len - 1 < 256) { session_buffered_write_char (DV_BIN, ses); session_buffered_write_char (len - 1, ses); } else { session_buffered_write_char (DV_LONG_BIN, ses); print_long (len - 1, ses); } for (inx = 1; inx < len; inx++) { MonoObject *obj = (MonoObject *)mono_array_get (mono_list, gpointer, inx); guint8 b = *(guint8 *)((char *)obj + sizeof (MonoObject)); session_buffered_write_char (b, ses); } return len; no_obj: session_buffered_write_char (DV_DB_NULL, ses); return 1; }
caddr_t clr_deserialize (dk_session_t * ses, long mode, caddr_t asm_name, caddr_t type, void *udt) { MonoArray *v_args = NULL, *bin_data; MonoArray *mono_list; int len; caddr_t in_values, bin_data_ptr; MonoDomain *domain = virtuoso_domain; get_mono_thread (); in_values = (caddr_t) scan_session_boxing (ses); if (DV_TYPE_OF (in_values) != DV_BIN) return (caddr_t) box_num (0); len = box_length (in_values); bin_data = mono_array_new (domain, mono_get_byte_class(), len); bin_data_ptr = mono_array_addr (bin_data, char, 0); memcpy (bin_data_ptr, in_values, len); if (in_values) dk_free_tree (in_values); v_args = MAKE_PARAM_ARRAY (domain, 4); mono_array_set (v_args, gpointer, 0, bin_data); SET_INT_ARG (domain, v_args, 1, mode); SET_STRING_ARG (domain, v_args, 2, asm_name); SET_STRING_ARG (domain, v_args, 3, type); QR_RESET_CTX { mono_list = (MonoArray *) call_mono (VIRTCLR_NAME, "VInvoke:obj_deserialize", v_args, domain); } QR_RESET_CODE { caddr_t err; POP_QR_RESET; err = thr_get_error_code (THREAD_CURRENT_THREAD); if (ARRAYP (err)) log_error ("Mono Deserialization error : [%s] [%s]", ERR_STATE(err), ERR_MESSAGE (err)); else log_error ("Mono Deserialization error : unknown"); dk_free_tree (err); return 0; } END_QR_RESET; return sa_to_dk ((MonoArray *) mono_list, 0, 0, udt); }
/* kpreportのスレッドルーチン @arg 引数 */ void *kpreport_worker(void *arg) { if(kpreport_init() == 0){ ERR_MESSAGE("%s failed", log_err_prefix(kpreport_init)); } pthread_cleanup_push(kpreport_final, NULL); while(1){ interrupt++; read_periodic(); sleep(PERIOD); } pthread_exit(NULL); pthread_cleanup_pop(1); }