… | |
… | |
1026 | ); |
1026 | ); |
1027 | |
1027 | |
1028 | sub object_freezer_save { |
1028 | sub object_freezer_save { |
1029 | my ($filename, $rdata, $objs) = @_; |
1029 | my ($filename, $rdata, $objs) = @_; |
1030 | |
1030 | |
1031 | my $guard = cf::lock_acquire "io"; |
|
|
1032 | |
|
|
1033 | sync_job { |
1031 | sync_job { |
1034 | if (length $$rdata) { |
1032 | if (length $$rdata) { |
1035 | utf8::decode (my $decname = $filename); |
1033 | utf8::decode (my $decname = $filename); |
1036 | warn sprintf "saving %s (%d,%d)\n", |
1034 | warn sprintf "saving %s (%d,%d)\n", |
1037 | $decname, length $$rdata, scalar @$objs; |
1035 | $decname, length $$rdata, scalar @$objs; |
… | |
… | |
1062 | } else { |
1060 | } else { |
1063 | aio_unlink $filename; |
1061 | aio_unlink $filename; |
1064 | aio_unlink "$filename.pst"; |
1062 | aio_unlink "$filename.pst"; |
1065 | } |
1063 | } |
1066 | }; |
1064 | }; |
1067 | |
|
|
1068 | undef $guard; |
|
|
1069 | } |
1065 | } |
1070 | |
1066 | |
1071 | sub object_freezer_as_string { |
1067 | sub object_freezer_as_string { |
1072 | my ($rdata, $objs) = @_; |
1068 | my ($rdata, $objs) = @_; |
1073 | |
1069 | |
… | |
… | |
1078 | |
1074 | |
1079 | sub object_thawer_load { |
1075 | sub object_thawer_load { |
1080 | my ($filename) = @_; |
1076 | my ($filename) = @_; |
1081 | |
1077 | |
1082 | my ($data, $av); |
1078 | my ($data, $av); |
1083 | |
|
|
1084 | my $guard = cf::lock_acquire "io"; |
|
|
1085 | |
1079 | |
1086 | (aio_load $filename, $data) >= 0 |
1080 | (aio_load $filename, $data) >= 0 |
1087 | or return; |
1081 | or return; |
1088 | |
1082 | |
1089 | unless (aio_stat "$filename.pst") { |
1083 | unless (aio_stat "$filename.pst") { |
1090 | (aio_load "$filename.pst", $av) >= 0 |
1084 | (aio_load "$filename.pst", $av) >= 0 |
1091 | or return; |
1085 | or return; |
1092 | |
1086 | |
1093 | undef $guard; |
|
|
1094 | $av = eval { (Storable::thaw $av)->{objs} }; |
1087 | $av = eval { (Storable::thaw $av)->{objs} }; |
1095 | } |
1088 | } |
1096 | |
1089 | |
1097 | utf8::decode (my $decname = $filename); |
1090 | utf8::decode (my $decname = $filename); |
1098 | warn sprintf "loading %s (%d,%d)\n", |
1091 | warn sprintf "loading %s (%d,%d)\n", |
… | |
… | |
1353 | aio_unlink +(playerdir $login) . "/$login.pl"; |
1346 | aio_unlink +(playerdir $login) . "/$login.pl"; |
1354 | |
1347 | |
1355 | my $f = new_from_file cf::object::thawer path $login |
1348 | my $f = new_from_file cf::object::thawer path $login |
1356 | or return; |
1349 | or return; |
1357 | |
1350 | |
1358 | $f->next; |
|
|
1359 | my $pl = cf::player::load_pl $f |
1351 | my $pl = cf::player::load_pl $f |
1360 | or return; |
1352 | or return; |
1361 | local $cf::PLAYER_LOADING{$login} = $pl; |
1353 | local $cf::PLAYER_LOADING{$login} = $pl; |
1362 | $f->resolve_delayed_derefs; |
1354 | $f->resolve_delayed_derefs; |
1363 | $cf::PLAYER{$login} = $pl |
1355 | $cf::PLAYER{$login} = $pl |