Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
ef053035
Commit
ef053035
authored
Jun 17, 2016
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
util/HugeAllocator: throw std::bad_alloc on error
parent
35faafb3
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
39 additions
and
54 deletions
+39
-54
MusicBuffer.cxx
src/MusicBuffer.cxx
+0
-3
ThreadInputStream.cxx
src/input/ThreadInputStream.cxx
+1
-4
CurlInputPlugin.cxx
src/input/plugins/CurlInputPlugin.cxx
+4
-11
NfsInputPlugin.cxx
src/input/plugins/NfsInputPlugin.cxx
+4
-11
HugeAllocator.cxx
src/util/HugeAllocator.cxx
+18
-3
HugeAllocator.hxx
src/util/HugeAllocator.hxx
+12
-15
SliceBuffer.hxx
src/util/SliceBuffer.hxx
+0
-7
No files found.
src/MusicBuffer.cxx
View file @
ef053035
...
...
@@ -20,14 +20,11 @@
#include "config.h"
#include "MusicBuffer.hxx"
#include "MusicChunk.hxx"
#include "system/FatalError.hxx"
#include <assert.h>
MusicBuffer
::
MusicBuffer
(
unsigned
num_chunks
)
:
buffer
(
num_chunks
)
{
if
(
buffer
.
IsOOM
())
FatalError
(
"Failed to allocate buffer"
);
}
MusicChunk
*
...
...
src/input/ThreadInputStream.cxx
View file @
ef053035
...
...
@@ -50,10 +50,7 @@ ThreadInputStream::Start(Error &error)
assert
(
buffer
==
nullptr
);
void
*
p
=
HugeAllocate
(
buffer_size
);
if
(
p
==
nullptr
)
{
error
.
SetErrno
();
return
nullptr
;
}
assert
(
p
!=
nullptr
);
buffer
=
new
CircularBuffer
<
uint8_t
>
((
uint8_t
*
)
p
,
buffer_size
);
...
...
src/input/plugins/CurlInputPlugin.cxx
View file @
ef053035
...
...
@@ -73,10 +73,10 @@ struct CurlInputStream final : public AsyncInputStream {
/** parser for icy-metadata */
IcyInputStream
*
icy
;
CurlInputStream
(
const
char
*
_url
,
Mutex
&
_mutex
,
Cond
&
_cond
,
void
*
_buffer
)
CurlInputStream
(
const
char
*
_url
,
Mutex
&
_mutex
,
Cond
&
_cond
)
:
AsyncInputStream
(
_url
,
_mutex
,
_cond
,
_buffer
,
CURL_MAX_BUFFERED
,
HugeAllocate
(
CURL_MAX_BUFFERED
),
CURL_MAX_BUFFERED
,
CURL_RESUME_AT
),
request_headers
(
nullptr
),
icy
(
new
IcyInputStream
(
this
))
{}
...
...
@@ -844,14 +844,7 @@ inline InputStream *
CurlInputStream
::
Open
(
const
char
*
url
,
Mutex
&
mutex
,
Cond
&
cond
,
Error
&
error
)
{
void
*
buffer
=
HugeAllocate
(
CURL_MAX_BUFFERED
);
if
(
buffer
==
nullptr
)
{
error
.
Set
(
curl_domain
,
"Out of memory"
);
return
nullptr
;
}
CurlInputStream
*
c
=
new
CurlInputStream
(
url
,
mutex
,
cond
,
buffer
);
CurlInputStream
*
c
=
new
CurlInputStream
(
url
,
mutex
,
cond
);
if
(
!
c
->
InitEasy
(
error
)
||
!
input_curl_easy_add_indirect
(
c
,
error
))
{
delete
c
;
return
nullptr
;
...
...
src/input/plugins/NfsInputPlugin.cxx
View file @
ef053035
...
...
@@ -48,11 +48,10 @@ class NfsInputStream final : public AsyncInputStream, NfsFileReader {
bool
reconnect_on_resume
,
reconnecting
;
public
:
NfsInputStream
(
const
char
*
_uri
,
Mutex
&
_mutex
,
Cond
&
_cond
,
void
*
_buffer
)
NfsInputStream
(
const
char
*
_uri
,
Mutex
&
_mutex
,
Cond
&
_cond
)
:
AsyncInputStream
(
_uri
,
_mutex
,
_cond
,
_buffer
,
NFS_MAX_BUFFERED
,
HugeAllocate
(
NFS_MAX_BUFFERED
),
NFS_MAX_BUFFERED
,
NFS_RESUME_AT
),
reconnect_on_resume
(
false
),
reconnecting
(
false
)
{}
...
...
@@ -239,13 +238,7 @@ input_nfs_open(const char *uri,
if
(
!
StringStartsWith
(
uri
,
"nfs://"
))
return
nullptr
;
void
*
buffer
=
HugeAllocate
(
NFS_MAX_BUFFERED
);
if
(
buffer
==
nullptr
)
{
error
.
Set
(
nfs_domain
,
"Out of memory"
);
return
nullptr
;
}
NfsInputStream
*
is
=
new
NfsInputStream
(
uri
,
mutex
,
cond
,
buffer
);
NfsInputStream
*
is
=
new
NfsInputStream
(
uri
,
mutex
,
cond
);
if
(
!
is
->
Open
(
error
))
{
delete
is
;
return
nullptr
;
...
...
src/util/HugeAllocator.cxx
View file @
ef053035
/*
* Copyright (C) 2013 Max Kellermann <max@duempel.org>
* Copyright (C) 2013
-2016
Max Kellermann <max@duempel.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
...
...
@@ -54,7 +54,7 @@ AlignToPageSize(size_t size)
}
void
*
HugeAllocate
(
size_t
size
)
HugeAllocate
(
size_t
size
)
throw
(
std
::
bad_alloc
)
{
size
=
AlignToPageSize
(
size
);
...
...
@@ -63,7 +63,7 @@ HugeAllocate(size_t size)
PROT_READ
|
PROT_WRITE
,
flags
,
-
1
,
0
);
if
(
p
==
(
void
*
)
-
1
)
return
nullptr
;
throw
std
::
bad_alloc
()
;
#ifdef MADV_HUGEPAGE
/* allow the Linux kernel to use "Huge Pages", which reduces page
...
...
@@ -94,4 +94,19 @@ HugeDiscard(void *p, size_t size)
#endif
}
#elif defined(WIN32)
void
*
HugeAllocate
(
size_t
size
)
throw
(
std
::
bad_alloc
)
{
// TODO: use MEM_LARGE_PAGES
void
*
p
=
VirtualAlloc
(
nullptr
,
size
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_READWRITE
);
if
(
p
==
nullptr
)
throw
std
::
bad_alloc
();
return
p
;
}
#endif
src/util/HugeAllocator.hxx
View file @
ef053035
/*
* Copyright (C) 2013 Max Kellermann <max@duempel.org>
* Copyright (C) 2013
-2016
Max Kellermann <max@duempel.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
...
...
@@ -32,6 +32,8 @@
#include "Compiler.h"
#include <new>
#include <stddef.h>
#ifdef __linux__
...
...
@@ -43,7 +45,7 @@
*/
gcc_malloc
void
*
HugeAllocate
(
size_t
size
);
HugeAllocate
(
size_t
size
)
throw
(
std
::
bad_alloc
)
;
/**
* @param p an allocation returned by HugeAllocate()
...
...
@@ -67,14 +69,8 @@ HugeDiscard(void *p, size_t size);
#include <windows.h>
gcc_malloc
static
inline
void
*
HugeAllocate
(
size_t
size
)
{
// TODO: use MEM_LARGE_PAGES
return
VirtualAlloc
(
nullptr
,
size
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_READWRITE
);
}
void
*
HugeAllocate
(
size_t
size
)
throw
(
std
::
bad_alloc
);
static
inline
void
HugeFree
(
void
*
p
,
gcc_unused
size_t
size
)
...
...
@@ -92,19 +88,20 @@ HugeDiscard(void *p, size_t size)
/* not Linux: fall back to standard C calls */
#include <std
lib
.h>
#include <std
int
.h>
gcc_malloc
static
inline
void
*
HugeAllocate
(
size_t
size
)
HugeAllocate
(
size_t
size
)
throw
(
std
::
bad_alloc
)
{
return
malloc
(
size
)
;
return
new
uint8_t
[
size
]
;
}
static
inline
void
HugeFree
(
void
*
p
,
size_t
)
HugeFree
(
void
*
_
p
,
size_t
)
{
free
(
p
);
auto
*
p
=
(
uint8_t
*
)
_p
;
delete
[]
p
;
}
static
inline
void
...
...
src/util/SliceBuffer.hxx
View file @
ef053035
...
...
@@ -88,13 +88,6 @@ public:
SliceBuffer
(
const
SliceBuffer
&
other
)
=
delete
;
SliceBuffer
&
operator
=
(
const
SliceBuffer
&
other
)
=
delete
;
/**
* @return true if buffer allocation (by the constructor) has failed
*/
bool
IsOOM
()
{
return
data
==
nullptr
;
}
unsigned
GetCapacity
()
const
{
return
n_max
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment