modem: add termination function to stop pico thread

use new logging
log: set max verbosity to warning for release builds
This commit is contained in:
Flyinghead 2019-07-01 10:28:31 +02:00
parent a31f573c69
commit c60e2d29e8
10 changed files with 54 additions and 45 deletions

View File

@ -790,6 +790,9 @@ void sb_Init()
void sb_Reset(bool Manual)
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST && defined(ENABLE_MODEM)
ModemTerm();
#endif
asic_reg_Reset(Manual);
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
gdrom_reg_Reset(Manual);
@ -803,6 +806,9 @@ void sb_Reset(bool Manual)
void sb_Term()
{
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST && defined(ENABLE_MODEM)
ModemTerm();
#endif
aica_sb_Term();
maple_Term();
pvr_sb_Term();

View File

@ -1188,7 +1188,7 @@ struct maple_keyboard : maple_base
return MDRS_DataTransfer;
default:
DEBUG_LOG(MAPLE, "Keyboard: unknown MAPLE COMMAND %d", cmd);
INFO_LOG(MAPLE, "Keyboard: unknown MAPLE COMMAND %d", cmd);
return MDRE_UnknownCmd;
}
}
@ -1295,7 +1295,7 @@ struct maple_mouse : maple_base
return MDRS_DataTransfer;
default:
DEBUG_LOG(MAPLE, "Mouse: unknown MAPLE COMMAND %d", cmd);
INFO_LOG(MAPLE, "Mouse: unknown MAPLE COMMAND %d", cmd);
return MDRE_UnknownCmd;
}
}
@ -1375,7 +1375,7 @@ struct maple_lightgun : maple_base
return MDRS_DataTransfer;
default:
DEBUG_LOG(MAPLE, "Light gun: unknown MAPLE COMMAND %d", cmd);
INFO_LOG(MAPLE, "Light gun: unknown MAPLE COMMAND %d", cmd);
return MDRE_UnknownCmd;
}
}
@ -2569,7 +2569,7 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou
break;
default:
INFO_LOG(MAPLE, "JVS: Unknown input type %x", buffer_in[cmdi]);
DEBUG_LOG(MAPLE, "JVS: Unknown input type %x", buffer_in[cmdi]);
JVS_OUT(2); // report byte: command error
cmdi = length_in; // Ignore subsequent commands
break;

View File

@ -99,7 +99,7 @@ static void* vmem32_map_buffer(u32 dst, u32 addrsz, u32 offset, u32 size, bool w
rv = mmap(&virt_ram_base[dst], size, prot, MAP_SHARED | MAP_NOSYNC | MAP_FIXED, vmem_fd, offset);
if (MAP_FAILED == rv)
{
printf("MAP1 failed %d\n", errno);
ERROR_LOG(VMEM, "MAP1 failed %d", errno);
return NULL;
}
@ -109,7 +109,7 @@ static void* vmem32_map_buffer(u32 dst, u32 addrsz, u32 offset, u32 size, bool w
ptr = mmap(&virt_ram_base[dst], size, prot , MAP_SHARED | MAP_NOSYNC | MAP_FIXED, vmem_fd, offset);
if (MAP_FAILED == ptr)
{
printf("MAP2 failed %d\n", errno);
ERROR_LOG(VMEM, "MAP2 failed %d", errno);
return NULL;
}
}
@ -346,7 +346,7 @@ bool vmem32_handle_signal(void *fault_addr, bool write, u32 exception_pc)
//vmem32_page_faults++;
u32 guest_addr = (u8*)fault_addr - virt_ram_base;
u32 rv = vmem32_map_address(guest_addr, write);
//printf("vmem32_handle_signal handled signal %s @ %p -> %08x rv=%d\n", write ? "W" : "R", fault_addr, guest_addr, rv);
DEBUG_LOG(VMEM, "vmem32_handle_signal handled signal %s @ %p -> %08x rv=%d", write ? "W" : "R", fault_addr, guest_addr, rv);
if (rv == MMU_ERROR_NONE)
return true;
if (rv == VMEM32_ERROR_NOT_MAPPED)

View File

@ -43,11 +43,7 @@
#define MODEM_DEVICE_TYPE_336K 0
#ifdef RELEASE
#define LOG(...)
#else
#define LOG(...) do { printf("[%d.%03d] MODEM ", (int)os_GetSeconds(), (int)(os_GetSeconds() * 1000) % 1000); printf(__VA_ARGS__); putchar('\n'); } while (false);
#endif
#define LOG(...) DEBUG_LOG(MODEM, __VA_ARGS__)
const static u32 MODEM_ID[2] =
{
@ -142,7 +138,7 @@ static int modem_sched_func(int tag, int c, int j)
{
if (last_comm_stats != 0)
{
printf("Stats sent %d (%.2f kB/s) received %d (%.2f kB/s) TDBE %d RDBF %d\n", sent_bytes, sent_bytes / 2000.0,
DEBUG_LOG(MODEM, "Stats sent %d (%.2f kB/s) received %d (%.2f kB/s) TDBE %d RDBF %d\n", sent_bytes, sent_bytes / 2000.0,
recvd_bytes, recvd_bytes / 2000.0,
modem_regs.reg1e.TDBE, modem_regs.reg1e.RDBF);
sent_bytes = 0;
@ -211,7 +207,7 @@ static int modem_sched_func(int tag, int c, int j)
break;
case PRE_CONNECTED:
printf("MODEM Connected\n");
INFO_LOG(MODEM, "MODEM Connected");
if (modem_regs.reg03.RLSDE)
SET_STATUS_BIT(0x0f, modem_regs.reg0f.RLSD, 1);
if (modem_regs.reg12 == 0xAA)
@ -319,6 +315,11 @@ void ModemInit()
modem_sched = sh4_sched_register(0, &modem_sched_func);
}
void ModemTerm()
{
stop_pppd();
}
static void schedule_callback(int ms)
{
sh4_sched_request(modem_sched, SH4_MAIN_CLOCK / 1000 * ms);
@ -428,7 +429,7 @@ static void modem_reset(u32 v)
state=MS_RESETING;
modem_regs.ptr[0x20]=1;
ControllerTestStart();
printf("MODEM Reset\n");
INFO_LOG(MODEM, "MODEM Reset");
}
}
@ -495,7 +496,7 @@ static void ModemNormalWrite(u32 reg, u32 data)
//LOG("ModemNormalWrite : TBUFFER = %X", data);
if (connect_state == DISCONNECTED)
{
printf("MODEM Dialing\n");
INFO_LOG(MODEM, "MODEM Dialing");
connect_state = DIALING;
}
schedule_callback(100);

View File

@ -25,5 +25,6 @@
#include "types.h"
void ModemInit();
void ModemTerm();
u32 ModemReadMem_A0_006(u32 addr,u32 size);
void ModemWriteMem_A0_006(u32 addr,u32 data,u32 size);

View File

@ -24,13 +24,15 @@ typedef int sock_t;
#define L_EAGAIN EAGAIN
#define get_last_error() (errno)
#define INVALID_SOCKET (-1)
#define perror(s) do { INFO_LOG(MODEM, "%s: %s", (s) != NULL ? (s) : "", strerror(get_last_error())); } while (false)
#else
typedef SOCKET sock_t;
#define VALID(s) ((s) != INVALID_SOCKET)
#define L_EWOULDBLOCK WSAEWOULDBLOCK
#define L_EAGAIN WSAEWOULDBLOCK
#define get_last_error() (WSAGetLastError())
#define perror(s) do { if (s) printf("%s: ", s); printf("Winsock error: %d\n", WSAGetLastError()); } while (false)
#define perror(s) do { INFO_LOG(MODEM, "%s: Winsock error: %d\n", (s) != NULL ? (s) : "", WSAGetLastError()); } while (false)
#endif
#endif

View File

@ -213,7 +213,7 @@ static void tcp_callback(uint16_t ev, struct pico_socket *s)
if (it == tcp_sockets.end())
{
if (tcp_connecting_sockets.find(s) == tcp_connecting_sockets.end())
printf("Unknown socket: remote port %d\n", short_be(s->remote_port));
INFO_LOG(MODEM, "Unknown socket: remote port %d", short_be(s->remote_port));
}
else
{
@ -234,7 +234,7 @@ static void tcp_callback(uint16_t ev, struct pico_socket *s)
{
// Also called for child sockets
if (tcp_sockets.find(s) == tcp_sockets.end())
printf("pico_socket_accept: %s\n", strerror(pico_err));
INFO_LOG(MODEM, "pico_socket_accept: %s\n", strerror(pico_err));
}
else
{
@ -270,8 +270,7 @@ static void tcp_callback(uint16_t ev, struct pico_socket *s)
if (get_last_error() != EINPROGRESS && get_last_error() != L_EWOULDBLOCK)
{
pico_ipv4_to_string(peer, sock_a->local_addr.ip4.addr);
printf("TCP connection to %s:%d failed: ", peer, short_be(sock_a->local_port));
perror(NULL);
INFO_LOG(MODEM, "TCP connection to %s:%d failed: %s", peer, short_be(sock_a->local_port), strerror(get_last_error()));
closesocket(sockfd);
}
else
@ -291,7 +290,7 @@ static void tcp_callback(uint16_t ev, struct pico_socket *s)
auto it = tcp_sockets.find(s);
if (it == tcp_sockets.end())
{
printf("PICO_SOCK_EV_FIN: Unknown socket: remote port %d\n", short_be(s->remote_port));
INFO_LOG(MODEM, "PICO_SOCK_EV_FIN: Unknown socket: remote port %d", short_be(s->remote_port));
}
else
{
@ -301,11 +300,11 @@ static void tcp_callback(uint16_t ev, struct pico_socket *s)
}
if (ev & PICO_SOCK_EV_ERR) {
printf("Socket error received: %s\n", strerror(pico_err));
INFO_LOG(MODEM, "Socket error received: %s", strerror(pico_err));
auto it = tcp_sockets.find(s);
if (it == tcp_sockets.end())
{
printf("PICO_SOCK_EV_ERR: Unknown socket: remote port %d\n", short_be(s->remote_port));
INFO_LOG(MODEM, "PICO_SOCK_EV_ERR: Unknown socket: remote port %d", short_be(s->remote_port));
}
else
{
@ -319,7 +318,7 @@ static void tcp_callback(uint16_t ev, struct pico_socket *s)
auto it = tcp_sockets.find(s);
if (it == tcp_sockets.end())
{
printf("PICO_SOCK_EV_CLOSE: Unknown socket: remote port %d\n", short_be(s->remote_port));
INFO_LOG(MODEM, "PICO_SOCK_EV_CLOSE: Unknown socket: remote port %d", short_be(s->remote_port));
}
else
{
@ -374,7 +373,7 @@ static void udp_callback(uint16_t ev, struct pico_socket *s)
if (r <= 0)
{
if (r < 0)
printf("%s: error UDP recv: %s\n", __FUNCTION__, strerror(pico_err));
INFO_LOG(MODEM, "error UDP recv: %s", strerror(pico_err));
break;
}
@ -394,7 +393,7 @@ static void udp_callback(uint16_t ev, struct pico_socket *s)
}
if (ev & PICO_SOCK_EV_ERR) {
printf("UDP Callback error received\n");
INFO_LOG(MODEM, "UDP Callback error received");
}
}
@ -420,7 +419,7 @@ static void read_native_sockets()
struct pico_socket *ps = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, &tcp_callback);
if (ps == NULL)
{
printf("pico_socket_open failed: error %d\n", pico_err);
INFO_LOG(MODEM, "pico_socket_open failed: error %d", pico_err);
closesocket(sockfd);
continue;
}
@ -428,7 +427,7 @@ static void read_native_sockets()
ps->local_port = src_addr.sin_port;
if (pico_socket_connect(ps, &dcaddr.addr, it->first) != 0)
{
printf("pico_socket_connect failed: error %d\n", pico_err);
INFO_LOG(MODEM, "pico_socket_connect failed: error %d", pico_err);
closesocket(sockfd);
pico_socket_close(ps);
continue;
@ -469,8 +468,7 @@ static void read_native_sockets()
{
char peer[30];
pico_ipv4_to_string(peer, it->first->local_addr.ip4.addr);
printf("TCP connection to %s:%d failed: ", peer, short_be(it->first->local_port));
perror(NULL);
INFO_LOG(MODEM, "TCP connection to %s:%d failed: %s", peer, short_be(it->first->local_port), strerror(get_last_error()));
pico_socket_close(it->first);
closesocket(it->second);
}
@ -511,7 +509,7 @@ static void read_native_sockets()
//printf("read_native_sockets UDP received %d bytes from %08x:%d\n", r, long_be(msginfo.local_addr.ip4.addr), short_be(msginfo.local_port));
int r2 = pico_socket_sendto_extended(pico_udp_socket, buf, r, &dcaddr, it->first, &msginfo);
if (r2 < r)
printf("%s: error UDP sending to %d: %s\n", __FUNCTION__, short_be(it->first), strerror(pico_err));
INFO_LOG(MODEM, "error UDP sending to %d: %s", short_be(it->first), strerror(pico_err));
}
else if (r < 0 && get_last_error() != L_EAGAIN && get_last_error() != L_EWOULDBLOCK)
{
@ -543,10 +541,10 @@ static void read_native_sockets()
int r2 = pico_socket_send(it->first, buf, r);
if (r2 < 0)
printf("%s: error TCP sending: %s\n", __FUNCTION__, strerror(pico_err));
INFO_LOG(MODEM, "error TCP sending: %s", strerror(pico_err));
else if (r2 < r)
// FIXME EAGAIN errors. Need to buffer data or wait for call back.
printf("%s: truncated send: %d -> %d\n", __FUNCTION__, r, r2);
INFO_LOG(MODEM, "truncated send: %d -> %d", r, r2);
}
else if (r == 0)
{
@ -629,7 +627,7 @@ static void check_dns_entries()
dns_query_start = 0;
char myip[16];
pico_ipv4_to_string(myip, public_ip.addr);
printf("My IP is %s\n", myip);
INFO_LOG(MODEM, "My IP is %s", myip);
}
else
{
@ -662,7 +660,7 @@ static void check_dns_entries()
dns_query_start = 0;
char afoip[16];
pico_ipv4_to_string(afoip, afo_ip.addr);
printf("AFO server IP is %s\n", afoip);
INFO_LOG(MODEM, "AFO server IP is %s", afoip);
}
else
{
@ -698,7 +696,7 @@ static void *pico_thread_func(void *)
#if _WIN32
static WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
printf("WSAStartup failed\n");
WARN_LOG(MODEM, "WSAStartup failed");
#endif
}
@ -717,28 +715,28 @@ static void *pico_thread_func(void *)
pico_udp_socket = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_UDP, &udp_callback);
if (pico_udp_socket == NULL) {
printf("%s: error opening UDP socket: %s\n", __FUNCTION__, strerror(pico_err));
INFO_LOG(MODEM, "error opening UDP socket: %s", strerror(pico_err));
}
int yes = 1;
struct pico_ip4 inaddr_any = {0};
uint16_t listen_port = 0;
int ret = pico_socket_bind(pico_udp_socket, &inaddr_any, &listen_port);
if (ret < 0)
printf("%s: error binding UDP socket to port %u: %s\n", __FUNCTION__, short_be(listen_port), strerror(pico_err));
INFO_LOG(MODEM, "error binding UDP socket to port %u: %s", short_be(listen_port), strerror(pico_err));
pico_tcp_socket = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, &tcp_callback);
if (pico_tcp_socket == NULL) {
printf("%s: error opening TCP socket: %s\n", __FUNCTION__, strerror(pico_err));
INFO_LOG(MODEM, "error opening TCP socket: %s", strerror(pico_err));
}
pico_socket_setoption(pico_tcp_socket, PICO_TCP_NODELAY, &yes);
ret = pico_socket_bind(pico_tcp_socket, &inaddr_any, &listen_port);
if (ret < 0) {
printf("%s: error binding TCP socket to port %u: %s\n", __FUNCTION__, short_be(listen_port), strerror(pico_err));
INFO_LOG(MODEM, "error binding TCP socket to port %u: %s", short_be(listen_port), strerror(pico_err));
}
else
{
if (pico_socket_listen(pico_tcp_socket, 10) != 0)
printf("%s: error listening on port %u\n", __FUNCTION__, short_be(listen_port));
INFO_LOG(MODEM, "error listening on port %u", short_be(listen_port));
}
ppp->proxied = 1;

View File

@ -214,8 +214,8 @@ void mem_Term()
sh4_mmr_term();
sh4_area0_Term();
//write back Flash/SRAM
SaveRomFiles(get_writable_data_path("/data/"));
// done by emulator thread
//SaveRomFiles(get_writable_data_path("/data/"));
//mem_b.Term(); // handled by vmem

View File

@ -56,7 +56,7 @@ __attribute__((format(printf, 5, 6)))
#define MAX_LOGLEVEL LogTypes::LOG_LEVELS::LDEBUG
#else
#ifndef MAX_LOGLEVEL
#define MAX_LOGLEVEL LogTypes::LOG_LEVELS::LINFO
#define MAX_LOGLEVEL LogTypes::LOG_LEVELS::LWARNING
#endif // loglevel
#endif // logging

View File

@ -499,6 +499,7 @@ void dc_term()
naomi_cart_Close();
#endif
plugins_Term();
mem_Term();
_vmem_release();
mcfg_DestroyDevices();