rc_t vol_t::mark_failed(bool /*evict*/, bool redo) { spinlock_write_critical_section cs(&_mutex); if (_failed) { return RCOK; } bool useBackup = _backups.size() > 0; /* * The order of operations in this method is crucial. We may only set * failed after the restore manager is created, otherwise read/write * operations will find a null restore manager and thus will not be able to * wait for restore. Generating a failure LSN must occur after we've set * the failed flag, because we must guarantee that no read or write * occurred after the failure LSN (restore_begin log record). Finally, the * restore manager may only be forked once the failure LSN has been set, * lsn_t::null, which is why we cannot pass the failureLSN in the * constructor. */ // open backup file -- may already be open due to new backup being taken if (useBackup && _backup_fd < 0) { W_DO(open_backup()); } if (!ss_m::logArchiver) { throw runtime_error("Cannot simulate restore with mark_failed \ without a running log archiver"); }
int main(int argc, char **argv) { char buf[1024], *usage = "usage: deepstripper-gtk [-d[ebug]] [-h[elp]] [-o[utput] <path>]\n" " [-dps12|-dps16 <path>] [-e[xtract] <project>]\n"; GtkWidget *vbox, *men, *paned, *note, *frame, *scroll; GtkItemFactory *fac; GtkAccelGroup *acc; int i, dps = -1; for (i=1; i<argc; i++) { if (strcmp(argv[i], "-d")==0) { g_dbg = g_dbg<<1 | 1; } else if (strncmp(argv[i], "-h", 2)==0) { g_print("%s", usage); return 0; } } gtk_init(&argc, &argv); g_main = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(g_main), 600, 400); set_title("?", GETCWD(buf, sizeof(buf)), ""); g_signal_connect(G_OBJECT(g_main), "delete_event", G_CALLBACK(quit), NULL); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(g_main), vbox); gtk_widget_show(vbox); acc = gtk_accel_group_new(); fac = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<deepstripper-main>", acc); gtk_item_factory_create_items(fac, MENU_SIZE, root_menu, 0); men = gtk_item_factory_get_widget(fac, "<deepstripper-main>"); gtk_box_pack_start(GTK_BOX(vbox), men, FALSE, FALSE, 0); gtk_window_add_accel_group(GTK_WINDOW(g_main), acc); gtk_widget_show(men); g_multi = gtk_item_factory_get_item(fac, "/Multi"); paned = gtk_hpaned_new(); gtk_container_set_border_width(GTK_CONTAINER(paned), 5); gtk_box_pack_start(GTK_BOX(vbox), paned, TRUE, TRUE, 0); gtk_widget_show(paned); note = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(note), GTK_POS_BOTTOM); gtk_notebook_set_show_border(GTK_NOTEBOOK(note), TRUE); gtk_notebook_set_homogeneous_tabs(GTK_NOTEBOOK(note), TRUE); gtk_widget_set_size_request(note, 150, 200); gtk_paned_pack1(GTK_PANED(paned), note, TRUE, FALSE); gtk_widget_show(note); for (i=0; i<N_TABS; i++) { GtkWidget *l = gtk_label_new(g_tabs[i].tab); gtk_widget_show(l); gtk_notebook_append_page(GTK_NOTEBOOK(note), make_list(g_tabs[i].data, i), l); } frame = gtk_frame_new("Item properties:"); gtk_widget_set_size_request(frame, 150, 200); gtk_paned_pack2(GTK_PANED(paned), frame, TRUE, FALSE); gtk_widget_show(frame); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(frame), scroll); gtk_widget_show(scroll); g_info = gtk_label_new(DEFAULT_INFO); gtk_label_set_justify(GTK_LABEL(g_info), GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap(GTK_LABEL(g_info), FALSE); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), g_info); gtk_widget_show(g_info); g_stat = gtk_statusbar_new(); gtk_box_pack_end(GTK_BOX(vbox), g_stat, FALSE, FALSE, 0); gtk_widget_show(g_stat); set_status("status"); // Display everything gtk_widget_show(g_main); // Process all other command line switches for (i=1; i<argc; i++) { if (strncmp(argv[i], "-o", 2)==0) { if (chdir(argv[++i])) about_box("unable to change directory"); else set_title(NULL, GETCWD(buf, sizeof(buf)), NULL); } else if (strncmp(argv[i], "-dps", 4)==0) { open_backup(argv[i], argv[i+1]); if (strcmp(argv[i], "-dps12")==0) dps = AOSP_DPS12; else dps = AOSP_DPS16; ++i; } else if (strncmp(argv[i], "-e", 2)==0) { if (dps<0) about_box("No backup specified to extract from"); else { open_project(dps, akaiosdisk_project_byname(&g_disk, argv[++i])); select_tracks(MID_SELNOE); extract_tracks(); } } else if (strncmp(argv[i], "-d", 2)==0 || strncmp(argv[i], "-h", 2)==0) { ; // Skip earlier opts } else { about_box(usage); } } // Run message pump.. gtk_main(); return 0; }
// Menu handler static void menu(gpointer d, guint action, GtkWidget *w) { char *name; switch(action) { case MID_OPEN12: _DBG(_DBG_GUI,"open DPS12\n"); name = get_file("Open DPS12 backup", FALSE); if (name) open_backup("-dps12", name); break; case MID_OPEN16: _DBG(_DBG_GUI,"open DPS16\n"); name = get_file("Open DPS16 backup", FALSE); if (name) open_backup("-dps16", name); break; case MID_CLOSE: _DBG(_DBG_GUI,"close\n"); close_backup(); break; case MID_PROPS: _DBG(_DBG_GUI,"properties\n"); show_project_info(); break; case MID_EXIT: quit(w, NULL, d); break; case MID_SELASS: _DBG(_DBG_GUI,"select assigned\n"); select_tracks(action); break; case MID_SELNOE: _DBG(_DBG_GUI,"select non-empty\n"); select_tracks(action); break; case MID_SELALL: _DBG(_DBG_GUI,"select all\n"); select_tracks(action); break; case MID_SELNONE: _DBG(_DBG_GUI,"select none\n"); select_tracks(action); break; case MID_SELEXP: _DBG(_DBG_GUI,"export selected\n"); if (g_proj.splbyte==2) extract_tracks(); else about_box("FIXME: only 16-bit data can be exported"); break; case MID_HELP: _DBG(_DBG_GUI,"help about\n"); about_box(NULL); break; case MID_VERSION: _DBG(_DBG_GUI,"help versions\n"); { char buf[256]; sprintf(buf, "deepstripper-gtk: %s\ngtk-build: %d.%d.%d\ngtk-runtime: %d.%d.%d", RELEASE, GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION, gtk_major_version, gtk_minor_version, gtk_micro_version); about_box(buf); } break; case MID_MULTI: _DBG(_DBG_GUI,"change project: %s\n", ((AkaiOsDisk_Dirent *)d)->name); open_project(g_dps, (AkaiOsDisk_Dirent *)d); break; default: _DBG(_DBG_GUI,"unknown action: %d\n", action); break; } }